如何彻底掌握内存设置的金钥匙

如何彻底掌握内存设置的金钥匙

Java程序中数据的处理大部分都是在Java内存中完成的,所以Java内存设置对于应用的运行效率和稳定性都有很大的影响。

JVM运行时内存的构成

如何彻底掌握内存设置的金钥匙

新生代

如何彻底掌握内存设置的金钥匙

Eden区:Java中新创建的对象首先会存放在Eden区,如果新创建的对象为大对象直接放入老年代。

"大对象"的定义与JVM版本、堆大小、垃圾回收策略有关。

我们可以通过使用PretenureSizeTreshold来设置“大对象”的大小。

当Eden区内存不足时,MinorGC会对新生代进行一次垃圾回收。

SurvivorFrom区:指保留上一次MinorGC时幸存者。

SurvivorTo区:指的是将上一次MinorGC时的幸存者作为这一次MinorGC的被扫描者

新生代对象的生命周期

如何彻底掌握内存设置的金钥匙

更加深入理解对象在JVM从创建到销毁状态的变化过程。

对象在新生代的生命周期由MinorGC决定,在新生代新创建的对象,

首先在Eden区,当Eden区没有足够的内存空间时,会触发MinorGC,由于MinorGC决定了新生代对象的生命周期,MinorGC使用的是复制算法,

第一步:我们把Eden区域和ServivorFrom区域中的存活的对象复制到ServicorTo区域,同时把这些对象的年龄加一,这时有对象的年龄达到了老年代的标准,或者ServicorTo区内存不足,就会把这个对象放到老年代。

第二步:清空Eden区和SurvivorFrom区中的对象。

最后一步:SurvivorTo区和SurvivorFrom相互交换,与原来SurvivorTo区成为下一次GC时的SurvivorFrom区。

老年代

如何彻底掌握内存设置的金钥匙

永久代

指的是内存的永久保存区,其Class文件在类加载时,被放入永久代,GC不会在程序运行期间对永久代进行清理,但永久代的内存会随着加载Class文件的增加而增加,在加载Class文件过多时,可能会抛出OOM异常。

内存设置常用的参数

-Xms -Xmx

–XX:NewSize

–XX:MaxPermSize

–XX:NewRatio=n

–XX:SurivorRatio=n

–XX:+UserParNewGC和–X:+UserConcMarkSweepGC

HeapDumpOnOutMemoryError和HeapDumpPath

内存设置实战步骤

1、为操作系统预留运行资源、其余的内存分配给JVM

2、判断对象特性,确定新生代和老年代的内存大小

3、设置垃圾回收算法和开启OOM异常诊断日志