0.GC,JVM配置/调优

前置知识:JVM原理 https://blog.csdn.net/xyc1211/article/details/75920561icon-default.png?t=M85Bhttps://blog.csdn.net/xyc1211/article/details/75920561

目录

GC

常见启动参数配置 

Jvm监控工具

基础信息查询 jps jstat jinfo

内存问题排查: jmap  + jhat / MAT

分析方法:

线程、死循环、死锁 问题排查: jstack 

可视化分析工具 

JConsole

Visual VM


GC

GC有两种类型:Partial GC(局部 GC) 和 Full GC。

 

Minor GC (Scavenge GC)  //清理年轻代
新对象生成,并且在年轻代的Eden区申请空间失败时,就会触发Scavenge GC对Eden区域进行GC,清除非存活对象。不会影响到年老代

Major GC    //清理老年代

Full GC    //清理新生代,老年代区域,成本较高,会对系统性能产生影响。
对整个堆进行整理,比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。有如下原因可能导致Full GC:
· 年老代(Tenured)被写满
· 持久代(Perm)被写满 
· System.gc()被显示调用 
· 上一次GC之后Heap的各域分配策略动态变化

Full GC会触发 STW(stop the word) 程序停止工作

调优重点: 不让出现Full GC


常见启动参数配置 

1. 标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
2. 非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
3. 非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;
 

-client        //client模式,启动速度比较快运行时性能和内存管理效率不高,通常用于客户端应用程序或者开发和调试。
-server        //server模式,启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境
-jar        //以jar包的形式执行一个应用程序。
//jar包的manifest文件中声明初始加载的Main-class,Main-class必须有public static void main(String[] args)方法
-D<property>=<value>    //系统级全局变量值,系统属性名/值对 如-Dname="space string"

-classpath 路径 或-cp 路径  //使用-classpath后jvm将不再使用CLASSPATH中的类搜索路径

java调优一般针对  堆内存

堆=年轻代+老年代+持久代

堆设置
-Xms    //初始堆大小
-Xmx    //最大堆大小
-Xmn    //年轻代大小,NewSize与MaxNewSize设为一致
-XX:NewSize=n    //年轻代初始大小
-XX:MaxNewSize=n    //  年轻代最大大小
-XX:NewRatio=n    //设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n    //年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:PermSize    //设置持久代初始值
-XX:MaxPermSize=n    //设置持久代最大值

收集器设置
-XX:+UseSerialGC    :设置串行收集器
-XX:+UseParallelGC    :设置并行收集器
-XX:+UseParalledlOldGC    :设置并行年老代收集器
-XX:+UseConcMarkSweepGC    :设置并发收集器

并行收集器设置
-XX:+UseParNewGC    //设置年轻代为并行收集
-XX:ParallelGCThreads=n    //设置并行收集器的线程数
-XX:MaxGCPauseMillis=n    //设置并行收集最大暂停时间
-XX:GCTimeRatio=n    //设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
-XX:+UseAdaptiveSizePolicy    //自动选择年轻代区大小和相应的Survivor区比例

并发收集器设置
-XX:+CMSIncrementalMode    //设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n    //设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

CMS收集器(老年代 – 并发GC)
-XX:CMSFullGCsBeforeCompaction=n    //多少次后进行内存压缩
-XX:+CMSParallelRemarkEnabled    //降低标记停顿
-XX:CMSInitiatingOccupancyFraction=n    //使用n%剩余堆时开始CMS收集

垃圾回收统计信息
-XX:+PrintGC    //打印GC
-verbose:gc    //同-XX:+PrintGC 
-XX:+PrintGCDetails      //打印GC详细信息
-XX:+PrintGCTimeStamps    //打印CG时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps    //打印GC时间戳(以日期的形式)
-Xloggc:<filename>        //指定GC log的位置,以文件输出

内存溢出时自动产生dump
-XX:+DisableExplicitGC  //禁止代码中调用GC,System.gc()会变成一个空调用
-XX:+HeapDumpOnOutOfMemoryError    //JVM在出现内存溢出时自动Dump出当前的内存转储快照
-XX:HeapDumpPath=${目录}    //生成DUMP文件的路径

-Djava.awt.headless=true


Jvm监控工具

 https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/jvm/JDK监控和故障处理工具总结.md

基础信息查询 jps jstat jinfo

1. jps

jps    ##查看所有 Java 进程
jps -v
jps -v

top -Hp pid    ##查看某个pid的资源消耗情况

2. jstat 

监视虚拟机各种运行状态信息 输出信息主要包括:jvm自身线程、用户线程等。jvm线程会在jvm启动时就会存在。对于用户线程则是在用户访问时才会生成。 

jstat -class vmid         :显示 ClassLoader 的相关信息;
jstat -compiler vmid     :显示 JIT 编译的相关信息;
jstat -gc vmid             :显示与 GC 相关的堆信息;
jstat –gc vmid 时间(1000毫秒)   
## 显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间
jstat -gccapacity vmid     :显示各个代的容量及使用情况;
jstat -gcnew vmid         :显示新生代信息;
jstat -gcnewcapcacity vmid :显示新生代大小与使用情况;
jstat -gcold vmid         :显示老年代和永久代的行为统计,从jdk1.8开始,该选项仅表示老年代,因为永久代被移除了;
jstat -gcoldcapacity vmid     :显示老年代的大小;
jstat -gcpermcapacity vmid     :显示永久代大小,从jdk1.8开始,该选项不存在了,因为永久代被移除了;
jstat -gcutil vmid         :显示垃圾收集信息;

3. jinfo

实时地查看和调整虚拟机各项参数

## 查看
jinfo vmid


## 修改
jinfo -flag name vmid

jinfo  -flag MaxHeapSize 1234
jinfo  -flag PrintGC 1234

内存问题排查: jmap  + jhat / MAT

1. jmap 生成dupm

  • 作用: 生成堆转储快照 heapdump

Dump文件是Java堆使用情况的内存镜像。主要包括系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态等

怀疑有内存泄漏的时候就可以制作Dump来查看具体情况每一个java虚拟机都有及时生成显示所有线程在某一点状态的线程dump的能力

内存dump文件格式:***.hprofdump,配合内存分析工具MAT或与jhat使用,能够以图像的形式直观的展示当前内存是否有问题

JVM中的许多问题都可以使用线程dump文件来进行诊断,其中比较典型的包括线程阻塞,CPU使用率过高,JVM Crash,堆内存不足和类装载等问题。 

jmap -histo <pid>     展示class的内存情况

jmap -histo:live <pid>     先触发gc,然后再统计信息

jmap -dump:format=b,file=<filename>  <pid>     手动产生dump文件, 将进程的内存heap输出出到filename文件里

2. jhat 分析dump

jhat <dump文件filename>

访问 http://localhost:7000/

3. MAT 分析dump

待补, 得新开已篇文章专门讲

案例:

jmap + jhat 分析  3274 java进程

$ jmap -dump:format=b,file=heap.hprof 3274
Dumping heap to /app/qhdprod/heap.hprof ...
Heap dump file created

$ jhat heap.hprof
......
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

分析方法:

1. 找出占内存大的对象

2. 看对象被谁引用

3. 定位到具体代码


线程、死循环、死锁 问题排查: jstack 

jstack 

生成当前时刻的线程快照

# 打印指定Java进程的线程堆栈信息
jstack <pid>

可视化分析工具 

JConsole

JDK 目录下的 bin 目录找到jconsole.exe

Visual VM



例: 统计25923 进程状况

top -Hp 25923 >top.log
jstack 25923 >./jstack.info
jstat -gcoldcapacity -t 25923 250 3 >gcold.log
jstat –gc 25923 1000  >./gc.log
jmap -dump:format=b,file=dump.bin  25923   

CPU爆满原因分析:

  1. 大量IO
  2. 大量轮询
  3. FULL GC清理不掉,一直卡在fullgc


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java的垃圾回收(Garbage Collection, GC)是由Java虚拟机(JVM)自动执行的内存管理机制。配置Java GC的主要目的是整内存管理和垃圾回收策略,以达到更好的性能和内存利用率。 以下是一些常见的Java GCJVM配置选项: 1. 选择垃圾回收器(GC algorithm):Java提供了多种垃圾回收算法,如Serial GC、Parallel GC、CMS GC、G1 GC等。可以通过设置`-XX:+UseSerialGC`、`-XX:+UseParallelGC`、`-XX:+UseConcMarkSweepGC`、`-XX:+UseG1GC`等选项来指定使用的垃圾回收器。 2. 设置新生代和老年代大小:Java堆内存被分为新生代(Young Generation)和老年代(Old Generation),可以通过`-Xmn`选项设置新生代大小,通过`-Xmx`和`-Xms`选项设置堆最大和初始大小。 3. 整垃圾回收的停顿时间:默认情况下,JVM会尽量减少垃圾回收过程对应用程序的停顿时间,但可能会牺牲一些吞吐量。可以通过`-XX:MaxGCPauseMillis`选项设置最大停顿时间。 4. 设置垃圾回收相关参数:可以通过一些参数来整垃圾回收的行为,如`-XX:MaxTenuringThreshold`设置对象进入老年代的年龄阈值,`-XX:SurvivorRatio`设置新生代中Eden区和Survivor区的大小比例等。 5. 监控和:可以使用JVM提供的工具(如jstat、jconsole、jvisualvm等)来监控垃圾回收情况和内存使用情况,从而进行化和整。 需要注意的是,不同的应用程序和场景可能需要不同的GCJVM配置,具体的配置需要根据实际情况进行整和化。此外,建议在进行GCJVM配置整时,先进行性能测试和监控,以确保配置的改变能够带来预期的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xyc1211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值