jvm 笔记
问题:
情况说明
1、PS Eden Space 一直在增长一直在回收,PS Old Gen 不增长
2、PS Survivor Space 内存大小被重新调整,远小于初始化值
内存配置为
-Xms16384m -Xmx16384m -Xmn6144m -XX:MaxPermSize=1024m
第一次处理
原因分析:新生代增长太快,Minor GC 过于频繁,但是新生代不进入老年代。jvm 会根据情况重新分配 Survivor Space 的大小,导致了空间远小于初始化
处理方法:
1、减少转入老年代的存活次数 -XX:MaxTenuringThreshold=10
2、固定配置新生代内存比例 8:1:1 -XX:SurvivorRatio=8
3、增加打印日志-XX:+PrintGCDetails ,-XX:+PrintGCDateStamps,-XX:+PrintGCDateStamps,-XX:+PrintTenuringDistribution
第二次处理
原因分析:
跟踪 gc 日志分析,日志冲出现 Full GC (System.gc()),在使用过程中内存占用不高的情况下也会 gc,怀疑代码中会主动调用 gc 方法。
处理方法:增加-XX:+DisableExplicitGC 配置,禁用代码中显性调用 gc 方法
处理结果:Full GC (System.gc())消失
第三次处理
原因分析:
跟踪日志分析,在项目启动过程中出现 Full GC (Metadata GC Threshold)。推测 Metadata 元空间不够引起 full GC 重新分配元空间导致
处理方法:增加-XX:MetaspaceSize=512m,-XX:MaxMetaspaceSize=512m
处理结果:因为 Metadata 空间不够引起的主动 gc 消失,启动过程中 gc 显著减少,正式库性能提升不少
内存科普,以及参数配置
jvm8 内存划分模型
1、虚拟机栈
2、本地方法栈
3、PC 寄存器
4、堆(heap)
堆内存
堆内存是 JVM 所有线程共享的部分,在虚拟机启动的时候就已经创建。所有的对象和数组都在堆上进行分配。这部分空间可通过 GC 进行回收。堆内存分为年轻代(Young Generation)、老年代(Old Generation)。年轻代又分为 Eden 和 Survivor 区,Survivor 区由 FromSpace 和 ToSpace 组成,默认比例是 8:1:1。
非堆内存(Metadata)
非堆内存就一个永久代。主要用于存储类的信息、常量池、方法数据、方法代码等。
分代概念
新生成的对象首先放到年轻代 Eden 区,当 Eden 空间满了,触发 Minor GC,存活下来的对象移动到 Survivor0 区,Survivor0 区满后触发执行 Minor GC,Survivor0 区存活对象移动到 Suvivor1 区,这样保证了一段时间内总有一个 survivor 区为空。经过多次 Minor GC 仍然存活的对象移动到老年代。
老年代存储长期存活的对象,占满时会触发 Major GC=Full GC,GC 期间会停止所有线程等待 GC 完成,所以对响应要求高的应用尽量减少发生 Major GC,避免响应超时。
Minor GC : 清理年轻代
Major GC : 清理老年代
Full GC : 清理整个堆空间,包括年轻代和永久代
Full GC 都会停止应用所有线程。
JVM 常用参数
-Xms 堆内存初始大小,单位 m、g
-Xmx(MaxHeapSize) 堆内存最大允许大小,一般不要大于物理内存的 80%
-XX:NewSize(-Xns) 年轻代(PS Eden Space)内存初始大小
-XX:MaxNewSize(-Xmn) 年轻代内存最大允许大小,也可以缩写
-XX:SurvivorRatio=8 年轻代中 Eden 区与 Survivor 区的容量比例值,默认为 8,即 8:1:1
-XX:MaxTenuringThreshold 设置转入老年代的存活次数。默认 15
-XX:MetaspaceSize 元空间(Metadata)大小初始大小(JVM8)
-XX:MaxMetaspaceSize 非堆内存(Metadata)最大允许大小(JVM8)
-XX:PermSize 方法区内存初始大小(JVM7)
-XX:MaxPermSize 方法区内存最大允许大小(JVM7)
-Xss 堆栈内存大小
-XX:+DisableExplicitGC 禁止代码中显示调用 GC
-Xloggc:'gc.log' 指定 gc 日志文件位置,默认输出到终端
-XX:+PrintGCDetails 打印 GC 详细信息
-XX:+PrintGCDateStamps 打印 GC 时间
-XX:+PrintHeapAtGC 每次一次 GC 后,都打印堆信息
-XX:+PrintTenuringDistribution 打印 Survivor 对象年龄分布是 ygc 前的情况还是 ygc 后
版权声明: 本文为 InfoQ 作者【pCat】的原创文章。
原文链接:【http://xie.infoq.cn/article/77d7a784ffc5e3ff8fdede4be】。文章转载请联系作者。
评论