前言
JVM参数解析与调优
JVM 全称 Java Virtual Machine,Java程序编译之后生成的.class文件就是交由JVM执行,由JVM将.class文件内容翻译成对于系统可识别的机器语言,这就是Java之所以能一次编译,到处运行。
JVM参数
JVM堆内存
整个堆大小 = 年轻代(Young Generation) + 年老代(Old Generation) + 持久代(Perm Area) JVM堆内存用与new创建的对象和数组,栈内存则用于分配基础类型变量和对象的引用,当程序运行到作用域外时,栈内引用将被释放,而失去了引用地址的堆内存里的对象则变为了垃圾,在未知时间被GC回收释放内存;
堆内存构成图:
- -Xms 初 始堆大小 默认物理内存的1/64(小于1GB)空余堆大小小于40%时,JVM就会增大堆直到-Xmx的最大限制
- -Xmx 最大堆大小 默认物理内存的1/4(小于1GB)空余堆大小大于70%时,JVM就会减少堆直到-Xms的最小限制
我们可以通过将”-Xms”和”-Xmx”设置为相同大小来获得一个固定大小的堆内存。 -Xms和-Xmx实际上是-XX:InitialHeapSize和-XX:MaxHeapSize的缩写。我们也可以直接使用这两个参数,它们所起得效果是一样的
- -Xmn 年轻代大小
- -XX:NewSize 设置年轻代初始大小
- -XX:MaxNewSize 年轻代最大值
- -XX:PermSize 设 置持久代初始值
- -XX:MaxPermSize 设置 持久代最大值
- -Xss 每个线程堆栈大小JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K,这个参数对影响比较大,需经过严格测试后进行调整
- -XX: NewRatio 年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代) -XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5,Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。
- -XX:SurvivorRatio Eden区与Survivor区的大小比值 设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
- -XX:+HeapDumpOnOutOfMemoryError and -XX:HeapDumpPath 当我们没法为-Xmx(最大堆内存)设置一个合适的大小,那么就有可能面临内存溢出(OutOfMemoryError)的风险,这可能是我们使用JVM时面临的最可怕的猛兽之一导致内存溢出的根本原因需要仔细的定位。通常来说,分析堆内存快照(Heap Dump)是一个很好的定位手段,如果发生内存溢出时没有生成内存快照,特别是对于那种JVM已经崩溃或者错误只出现在顺利运行了数小时甚至数天的生产系统上时,将很难去分析崩溃问题。
幸运的是,我们可以通过设置 -XX:+HeapDumpOnOutOfMemoryError 让JVM在发生内存溢出时自动的生成堆内存快照。有了这个参数,当我们不得不面对内存溢出异常的时候会节约大量的时间。默认情况下,堆内存快照会保存在JVM的启动目录下名为java_pid.hprof 的文件里(在这里就是JVM进程的进程号)。也可以通过设置-XX:HeapDumpPath=来改变默认的堆内存快照生成路径,可以是相对或者绝对路径。
JVM调试工具
jps (JVM Process Status Tool)
_—_输出jvm运行的java进程状态信息
命令格式:
jps [options] [hostId]
hostId缺省值为当前主机 命令指令包括:
-q 不输出类名、Jar名和传入main方法的参数
-m 输出传入main方法的参数
-l 输出main类或Jar的全限名
-v 输出传入JVM的参数
使用如下:
[root@localhost ~]#
[root@localhost ~]# jps -m -l
28353 uyun.bat.monitor.impl.Startup
22852 uyun.bat.datastore.Startup
25799 uyun.bat.event.impl.Startup
19976 /opt/uyun/platform/jetty/start.jar
29320 uyun.bat.report.Startup
jstack
jmap和jhat经常在一起被使用。
jmap -heap pid
用于查看进程堆内存使用情况,包括堆配置参数和各代中堆内存使用情况,如:
whale.server01:/root# jmap -heap 17047
Attaching to process ID 17047, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.77-b03
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 1073741824 (1024.0MB)
NewSize = 175112192 (167.0MB)
MaxNewSize = 357564416 (341.0MB)
OldSize = 351272960 (335.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 134217728 (128.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 70254592 (67.0MB)
used = 22570248 (21.52466583251953MB)
free = 47684344 (45.47533416748047MB)
32.126366914208255% used
From Space:
capacity = 9961472 (9.5MB)
used = 6859688 (6.541908264160156MB)
free = 3101784 (2.9580917358398438MB)
68.86219225431743% used
To Space:
capacity = 10485760 (10.0MB)
used = 0 (0.0MB)
free = 10485760 (10.0MB)
0.0% used
PS Old Generation
capacity = 184025088 (175.5MB)
used = 99082056 (94.49201202392578MB)
free = 84943032 (81.00798797607422MB)
53.841602292835205% used
24334 interned Strings occupying 2508568 bytes.
使用jmap -histo[:live] pid查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象,如下:
`
whale.server01:/root# jmap -histo:live 17047 | more
num #instances #bytes class name
Original: https://www.cnblogs.com/JonaLin/p/13859494.html
Author: 一支会记忆的笔
Title: JVM参数主要有⼏种分类
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/533667/
转载文章受原作者版权保护。转载请注明原作者出处!