JVM概述学习随记
jvm学习随手笔记
- -Xss
栈内存大小 设置单个线程栈大小,一般默认512~1024kb
2.一个栈帧对应一个函数,栈帧内包含
- 局部变量表
- 操作数栈 ---执行引擎的工作区,类似于操作系统的缓存(执行引擎类似cpu,栈和堆类似内存)
- 动态链接
- 完成出口
3.方法区和堆刚启动就已经划好了
4.内存区域:线程私有----虚拟机栈,本地方法栈,程序计数器
线程共享---堆,方法区(运行时常量池,加载类信息)
5.方法区---虚拟机规范规定的东西(逻辑划分)----JDK1.7对方法区的实现叫永久代,JDK1.8叫元空间,可以用来装载class文件
6.静态常量池/运行时常量池-----javap -v Person.class 静态常量池
Constant pool:
#1 = Methodref #55.#123 // java/lang/Object."<init>":()V
#2 = Fieldref #54.#124 // geek/me/javaapi/baidu/PcsApi.pcsItemService:Lgeek/me/javaapi/baidu/service/PcsItemService;
#3 = Methodref #125.#126 // geek/me/javaapi/baidu/service/PcsItemService.getChildItem:(Ljava/lang/String;)Ljava/util/List;
#4 = Methodref #54.#126 // geek/me/javaapi/baidu/PcsApi.getChildItem:(Ljava/lang/String;)Ljava/util/List;
#5 = InterfaceMethodref #127.#128 // java/util/List.stream:()Ljava/util/stream/Stream;
#6 = InvokeDynamic #0:#134 // #0:apply:(Lgeek/me/javaapi/baidu/PcsApi;)Ljava/util/function/Function;
#7 = InvokeDynamic #1:#137 // #1:apply:()Ljava/util/function/Function;
#8 = Methodref #138.#139 // java/util/stream/Collectors.toMap:(Ljava/util/function/Function;Ljava/util/function/Function;)Ljava/util/stream/Collector;
#9 = InterfaceMethodref #140.#141 // java/util/stream/Stream.collect:(Ljava/util/stream/Collector;)Ljava/lang/Object;
#10 = Class #142 // java/util/Map
#11 = Class #143 // java/util/ArrayList
#12 = Methodref #11.#123 // java/util/ArrayList."<init>":()V
#13 = InterfaceMethodref #127.#144 // java/util/List.iterator:()Ljava/util/Iterator;
#14 = InterfaceMethodref #145.#146 // java/util/Iterator.hasNext:()Z
#15 = InterfaceMethodref #145.#147 // java/util/Iterator.next:()Ljava/lang/Object;
#16 = Class #148 // geek/me/javaapi/baidu/dto/PcsItem
...
运行时常量池----符号引用---替换为---直接引用。存放符号和内存地址
7.直接内存---堆外内存,NIO,bitbuff,栈中操作时,用引用操作它。 EHCache---中间件,用的较多
8.注意方法区是静,堆区是动态,都是线程共享区域
9.栈是容器,存的是一个个栈桢
10.jvm代码运行jvm内存处理全流程
a.jvm申请内存,向操作系统
b.初始化运行时数据区,方法区和堆
c.类加载到方法区,常量加载到方法区
d.执行方法main,入栈,创建对象
11.堆,新生代(eden,from,to),老年代tenured
12.jshdb查看内存情况,sawindbg.dll