6 JVM调优

1 JVM的调优参数

jvm的配置参数多达100多个。其中GC和内存配置相关的就600多个,但是我们在实际项目中和绝大多数业务场景下,常见的配置参数也就10来个,如下:

#JVM启动参数不换行
#设置堆内存
-Xmx4g -Xms4g
#指定GC算法
-XX:+UseG1GC -XX:MaxGCPauseMillis=50
#指定GC并行线程数
-XX:ParallelGCThreads=4
#打印GC日志
-XX:+PrintGCDetails -XX:+PrintGCDateStamps
#指定GC日志文件
-Xloggc:gc.log
#指定Meta区的最大值
-XX:MaxMetaspaceSize=2g
#设置单个线程栈的大小
-Xss1m
#指定堆内存溢出时自动进行Dump
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/usr/local/
#指定默认的连接超时时间
-Dsun.net.client.defaultConnectTimeout=2000
-Dsun.net.client.defaultReadTimeout=2000
#指定时区
-Duser.timezone=GMT+08
#设置默认的文件编码为UTF-8
-Dfile.encoding=UTF-8
#指定随机数熵源(Entropy Source)
-Djava.security.egd=file:/dev/./urandom

JVM的调优工具

常用调优工具分为两类,jdk自带监控工具:jconsole和jvisualvm,第三方有:MAT(MemoryAnalyzerTool)、GChisto。

  1. jconsole,Java Monitoring and Management Console是从java5开始,在JDK中自带的java监控和管理控制台,用于对JVM中内存, 线程和类等的监控
  2. jvisualvm,jdk自带全能工具,可以分析内存快照、线程快照;监控内存变化、GC变化等。
  3. MAT,Memory Analyzer Tool,一个基于Eclipse的内存分析工具,是一个快速、功能丰富的Javaheap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗
  4. GChisto,一款专业分析gc日志的工具

XM设置的值与JVM进程所占用的内存有什么关系

JVM总内存=栈+堆+非堆+直接内存+Native
整个堆大小=年轻代大小 + 年老代大小 + 永久代大小

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
1 -Xmx3550m:设置JVM最大可用内存为3550M.
2 -Xms3550m:设置JVM初始内存为3550m.此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存.
3 -Xmn2g:设置年轻代大小为2G.永久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大
小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8.
4 -Xss128k:设置每个线程的堆栈大小.JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右.
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
5 -XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去永久代).设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
6 -XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值.设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6
7 -XX:MaxPermSize=16m:设置永久代大小为16m.
8 -XX:MaxTenuringThreshold=0:设置垃圾最大年龄.如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代. 对于年老代比较多的应用,可以提高效率.如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活 时间,增加在年轻代即被回收的概论.

如何开启GC日志

一般来说,JDK8及以下版本通过以下参数来开启GC日志:
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:gc.log

如果是在JDK9及以上的版本,则格式略有不同:

-# JDK 11 环境,输出 info 级别的 GC 日志
java -Xms512m -Xmx512m
-Xlog:gc*=info:file=gc.log:time:filecount=0
demo.jvm0204.GCLogAnalysis

如何打出线程栈信息

输入jps,获得进程号。
top -Hp pid 获取本进程中所有线程的CPU耗时性能
jstack pid命令查看当前java进程的堆栈状态
或者 jstack -l > /tmp/output.txt 把堆栈信息打到一个txt文件。
可以使用fastthread 堆栈定位,fastthread.io/

如何使用G1垃圾收集器启动程序

java ‐XX:+UseG1GC
‐Xms4g
‐Xmx4g
‐Xloggc:gc.log
‐XX:+PrintGCDetails
‐XX:+PrintGCDateStamps Hello

JDK8默认使用的垃圾收集器是什么

Java8版本的Hotspot JVM,默认情况下使用的是并行垃圾收集器(Parallel GC)。其 他厂商提供的JDK8基本上也默认使用并行垃圾收集器。

java常见的垃圾收集器有哪些

Java9之后,官方JDK默认使用的垃圾收集器是G1。
常见的垃圾收集器包括:
串行垃圾收集器: ‐XX:+UseSerialGC
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:gc.log
-# JDK 11 环境,输出 info 级别的 GC 日志
java -Xms512m -Xmx512m
-Xlog:gc*=info:file=gc.log:time:filecount=0
demo.jvm0204.GCLogAnalysis
并行垃圾收集器: ‐XX:+UseParallelGC
CMS垃圾收集器:‐XX:+UseConcMarkSweepG
G1垃圾收集器: ‐XX:+UseG1GC

串行垃圾收集、并行垃圾收集、并发垃圾回收、增量式垃圾回收

串行:就是只有单个worker线程来执行GC工作。

并行:并行垃圾收集,是指使用多个GC worker 线程并行地执行垃圾收集,能充分利用多核CPU的能力,缩短垃圾收集的暂停时间。除了单线程的GC,其他的垃圾收集器,比如 PS,CMS, G1等新的垃圾收集器都使用了多个线程来并行执行GC工作。

并发:并发垃圾收集器,是指在应用程序在正常执行时,有一部分GC任务,由GC线程在应用线程一起并发执行。例如 CMS/G1的各种并发阶段。

增量:首先, G1的堆内存不再单纯划分为年轻代和老年代,而是划分为多个(通常是 2048个)可以存放对象的小块堆区域(smaller heap regions)。每个小块,可能一会被定义成 Eden 区,一会被指定为 Survivor 区或者 Old 区。这样划分之后,使得 G1 不必每次都去回收整个堆空间,而是以增量的方式来进行处理: 每次只处理一部分内存块,称为此次 GC 的回收集(collection set)。下一次GC时在本次的基础上,再选定一定的区域来进行回收。增量式垃圾收集的好处是大大降低了单次GC暂停的时间。

GC停顿

因为GC过程中,有一部分操作需要等所有应用线程都到达安全点,暂停之后才能执行,这时候就叫做GC停顿,或者叫做GC暂停。

CPU飙升如何排查

往往需要使用不同的工具来收集信息,例如:收集不同的指标(CPU,内存,磁盘IO,网络等等)
然后进行专项分析:
分析应用日志
分析GC日志
获取线程转储并分析
获取堆转储来进行分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值