JVM arthas下载工具

工具下载地址

链接:https://pan.baidu.com/s/1qkn9HabhuwTiwbKVQ7BXnA?pwd=v5ww

提取码:v5ww

启动语句

bash 复制代码
java -jar arthas-boot.jar

输入你的线程,这里是2

bash 复制代码
dashboard

JVM优化

堆的初始大小 最大大小 年轻代的大小 线程栈大小 新生代、伊甸区与Survivor的比例8:1:1 方法区的大小 最大大小 新生代Parnew 百分之68触发fullGC

内存分配策略

对象优先在 Eden 分配

大多数情况下,对象在新生代 Eden 区分配,当 Eden 区空间不够时,发起 Minor GC。

大对象直接进入老年代

大对象是指需要连续内存空间的对象,典型的大对象是那种很长的字符串以及数组。

经常出现大对象会提前触发垃圾收集以获取足够的连续空间分配给大对象。

-XX:PretenureSizeThreshold​,大于此值的对象直接在老年代分配,避免在 Eden 区和 Survivor 区之间的大量内存复制。

长期存活的对象进入老年代

为对象定义年龄计数器,对象在 Eden 出生并经过 Minor GC 依然存活,将移动到 Survivor 中,年龄就增加 1 岁,增加到一定年龄则移动到老年代中。

-XX:MaxTenuringThreshold​ 用来定义年龄的阈值。

动态对象年龄判定

虚拟机并不是永远地要求对象的年龄必须达到​ MaxTenuringThreshold​ 才能晋升老年代,如果在Survivor​中相同年龄所有对象大小的总和大于 Survivor ​​空间的一半,则年龄大于或等于该年龄的对象可以直接进入老年代,无需等到 MaxTenuringThreshold ​​中要求的年龄。

空间分配担保

在发生​ Minor GC ​​之前,虚拟机先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果成立的话,那么Minor GC​可以确认是安全的。

如果不成立虚拟机会查看 HandlePromotionFailure​ 设置值是否允许担保失败,如果允许那么就会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试着进行一次 Minor GC​,如果小于或者​ HandlePromotionFailure ​​设置不允许担保失败,那么就要进行一次 Full GC。

Full GC 的触发条件

调用 System.gc()

只是建议虚拟机执行 Full GC,但是虚拟机不一定真正去执行。不建议使用这种方式,而是让虚拟机管理内存。

老年代空间不足

老年代空间不足的常见场景为前文所讲的大对象直接进入老年代、长期存活的对象进入老年代等。

为了避免以上原因引起的 Full GC,应当尽量不要创建过大的对象以及数组。除此之外,可以通过-Xmn虚拟机参数调大新生代的大小,让对象尽量在新生代被回收掉,不进入老年代。还可以通过-XX:MaxTenuringThreshold调大对象进入老年代的年龄,让对象在新生代多存活一段时间。

空间分配担保失败

使用复制算法的 Minor GC 需要老年代的内存空间作担保,如果担保失败会执行一次Full GC。

Concurrent Mode Failure

执行 CMS GC 的过程中同时有对象要放入老年代,而此时老年代空间不足(可能是 GC 过程中浮动垃圾过多导致暂时性的空间不足),便会报​ Concurrent Mode Failure ​​错误,并触发​ Full GC​。

故障排查工具

jps : JDK提供的查看当前Java进程的工具

jstack: JDK提供的线程堆栈分析工具,可以查看或导出Java应用程序中线程堆栈信息

jinfo: JDK 自带的命令,可以用来查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息。

jmap: 生成Java程序的dump文件,也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息

jstat: 虚拟机统计信息监视工具,用于监视虚拟机运行状态信息,可以显示本地或远程虚拟机进程中的类加载、内存、垃圾收集、即时编译器等运行时数据。

相关推荐
西峰u17 小时前
Java多线程初阶完整总结|线程、锁、volatile、等待通知、常见案例
java·开发语言·jvm
H_老邪18 小时前
JVM 遇到的问题-1.1
jvm
SKH.18 小时前
Linux软件编程(5)线程
java·linux·jvm
liangbo721 小时前
JVM规范第 2章:从 class 文件到运行时数据区
java·jvm
沐苏瑶1 天前
JVM-内存区域、垃圾回收与类加载机制
java·jvm
Mr. zhihao1 天前
死锁排查实战:JVM 唯一会“自动报案“的问题(场景 B5)
java·jvm·gc
Mr. zhihao2 天前
OOM 排查实战(大结局):从老年代爬坡到 VisualVM 引用链实锤(场景 B4)
jvm·gc·oom·mat·visulvm
H_老邪2 天前
JVM 遇到的问题-1.0
jvm
liangbo72 天前
JVM规范第 4 章:class 文件格式
java·jvm
夕除2 天前
redis--008
java·jvm·数据库