JVM,JMM
1.JVM
1.JVM5个组成部分
JVM布局(HotSpot):JDK1.8
1.堆(线程共享):
所有的对象都存在此区域,此区域也是JVM中最大的一块区域。JVM垃圾回收就是针对此区域
2.JVM栈(Java虚拟机栈)线程私有
(1)局部变量表:8大基础数据类型,对象的引用
(2)操作栈:每个方法都会对应一个操作栈
(3)动态链接:指向常量池的方法引用
(4)方法返回地址:PC寄存器的地址
3.本地方法栈(线程私有):
与Java虚拟机栈比较类似,只不过Java虚拟机栈是给Java和jvm使用的,而本地方法栈是给本地方法(c/c++)服务的4.程序计数器:用来记录线程执行的行号(线程私有)
5.元空间(线程共享)(JDK1.8)、方法区(JDK1.7)使用永久代实现,
JDK1.7的时候的方法区包含有 运行时常量信息,字符串常量池,类的元信息。。
元空间(JDK1.8):本地内存,并且将字符串常量池移动到堆里面
移动到本地内存优点:它的大小就不受JVM最大内存制约了。
堆划分:
(1)新生代:第一次创建的对象都会分配到此区域
(2)老年代:经历了一定的垃圾回收之后,依然存活下来的对象会移动到老年代;大对象在创建的时候会直接进入老年代
HotSpot 默认的执行次数是15,经历15GC就会从新生代转移到老年代。
问:为什么大对象在创建的时候会直接进入老年代?
答:核心原因是因为大对象的初始化比较耗时,如果频繁的创建和销毁会带来一定的性能开销,因此最好的实现方式是将他储存在GC频率更低的老年代。
新生代区域划分:
Eden:80%内存
S0:10%内存<