写点什么

jvm 笔记

用户头像
pCat
关注
发布于: 2020 年 10 月 19 日

问题:

情况说明


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 后


发布于: 2020 年 10 月 19 日阅读数: 43
用户头像

pCat

关注

还未添加个人签名 2020.09.03 加入

还未添加个人简介

评论

发布
暂无评论
jvm笔记