jvm 内存模型及参数

0、内存模型图

 

堆内存图

 

 

 

 

1、常用参数

 

堆内存分配:
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64。
JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。
默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。
因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。
非堆内存分配:
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64。
由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
-Xmn2G:设置年轻代大小为2G。
-XX:SurvivorRatio,设置年轻代中Eden区与Survivor区的比值。

2、几种gc

GC 会 Stop-The-World。

young GC = Minor GC

young GC(新生代GC):指发生在新生代的垃圾收集动作,新生代中的对象朝生夕死,所以 Minor GC 非常频繁,回收速度也比较快。采用复制算法来回收新生代的垃圾。

Full GC(老年代GC):指发生在老年代的GC,速度一般比 Minor GC 慢十倍以上。Full GC 会 Stop-The-World。

Full GC会包含Young GC、Old GC和永久代的GC。

3、什么时候会触发Full GC?

调用 System.gc() 方法时,会建议JVM进行Full GC,此方法不建议使用。
新生代使用的是复制算法,为了内存利用率,只使用其中一个 Survivor 空间来做轮换备份,因此如果大量对象在 Minor GC 后仍然存活,导致 Survivor 空间不够用,就会通过分配担保机制,将多出来的对象提前转到老年代,此时如果老年代的可用内存小于该对象的大小,就会触发 Full GC。
当老年代中最大可用的连续空间小于历代晋升到老年代的对象的平均大小时,会触发Full GC 来让老年代腾出更多的空间。

4、如何优化GC?

  1. 尽量不要创建过大的对象或数组。
  2. 通过虚拟机的 -Xmn 参数适当调大新生代的大小,让对象尽量在新生代中被回收掉。
  3. 通过 -XX:MaxTenuringThreshold 参数调大对象进入老年代的年龄,让对象尽量在新生代中被回收掉。
posted @ 2021-12-01 19:33  精进的浩然兄  阅读(354)  评论(0编辑  收藏  举报