如何彻底掌握内存设置的金钥匙
如何彻底掌握内存设置的金钥匙
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异常诊断日志