ToB企服应用市场:ToB评测及商务社交产业平台

标题: 《JVM第7课》堆区 [打印本页]

作者: 八卦阵    时间: 2024-11-6 13:35
标题: 《JVM第7课》堆区
1.概念

堆是JVM中最重要的一块地区,JVM规范中规定全部的对象和数组都应该存放在堆中,在执行字节码指令时,会把创建的对象存入堆中,对象的引用地点存入虚拟机栈的栈帧中。不过当方法执行完之后,刚刚所创建的对象并不会立马被回收,也就是说对象并不会随着栈帧的消失而消失,而是要等JVM后台执行GC后,对象才会被回收。
2.指定堆大小

-Xms:指定堆的初始内存大小,ms(memory start)。等价于 -XX:InitialHeapSize;
-Xmx:指定堆的最大内存大小,mx(memory max)。等价于 -XX:MaxHeapSize;
一般会把 -Xms 和 -Xmx 设置为一样,这样JVM就不必要在GC后去修改堆的内存大小了,提高了服从。默认情况下,-Xms等于物理内存大小/64,-Xmx等于物理内存大小/4。
3.新生代和老年代


垃圾回收算法有很多,但基本上都会把内存分为新生代和老年代两块地区。新生代存放新创建的对象,老年代存放执行了许多次GC(默认为15次)后还存活的对象。
可以通过 -XX:NewRatio 参数来配置老年代和新生代的比例,默认为 -XX:NewRatio=2,表现新生代占1,老年代占2。一般是不必要调整的,只有明确知道存活时间比较长的对象偏多或偏少,才必要调整 -XX:NewRatio 的比值。
3.1 新生代

新生代又可以分为 Eden(伊甸园区)和 S0、S1 区。
Eden: 伊甸园区,新对象都会先放到Eden区。
S0、S1区: Survivor0、Survivor1区,也可以叫做from、to区,用来存放MinorGC(YGC)后存在的对象。
默认情况下 Eden、S0、S1 的比例为 8:1:1,也就是说Eden区占新生代大小的 8/10。可以通过 -XX:SurvivorRatio 来调整。
3.2 老年代

老年代存放执行了许多次GC后还存活的对象。老年代默认占内存地区的2/3。
3.3 动画演示

动画演示对象在内存各地区中的流转过程

4.分代收集理念

上面的新生代老年代就是分代收集理念,有些时候会被叫做分代收集算法,但实在它是一种理念。默认险些全部的垃圾回收算法都是采用分代收集理念。
为什么垃圾回收算法要把内存地区分为新生代和老年代,新生代里又包含Eden区、Survivor0、Survivor1区呢?
这是由于不同的对象存活时长是不一样的,所以要针对存活时长不同的对象采取不同的垃圾回收算法。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4