02、我们为什么要对jvm做优化:
1.标准参数:
-help
-version
2. -X参数(非标)
-Xint
-Xcomp
-Xint : interpreted
-Xcomp: complied 有卡顿,先编译,一次编译,之后不用编译,运行效率高
-Xmixed: mixed 默认
3.-XX参数(非标,使用率较高)
-XX:newSize
-XX:UseSerialGC
4.
-Xms
设置jvm堆内存初始大小
-Xms512m ==> -XX:InitialHeapSize=512m
-Xmx
设置jvm堆内存最大大小
-Xmx2048m ==> -XX:MaxHeapSize=2048m
eg.java -Xms64m -Xmx128m TestJVM
5.
jps -l
jinfo -flags 4086 查询该进程所有参数
eg.
[root@node01 bin]# jinfo -flags 4086
Attaching to process ID 4086, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.141-b15
Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=48234496 -XX:MaxHeapSize=752877568 -XX:MaxNewSize=250609664 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=15728640 -XX:OldSize=32505856 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
Command line: -Djava.util.logging.config.file=/export/servers/jvm/apache-tomcat-7.0.57/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/export/servers/jvm/apache-tomcat-7.0.57/endorsed -Dcatalina.base=/export/servers/jvm/apache-tomcat-7.0.57 -Dcatalina.home=/export/servers/jvm/apache-tomcat-7.0.57 -Djava.io.tmpdir=/export/servers/jvm/apache-tomcat-7.0.57/temp
jinfo -flag MaxHeapSize 4086 查询某个参数MaxHeapSize
04、JVM运行参数之-server与-client:
java -server -showversion TestJVM
初始堆空间大,并行垃圾回收器;
java -client -showversion TestJVM
初始堆空间小,串行垃圾回收器
06、JVM运行参数之-XX参数:
java -showversion -XX:+DisableExplicitGC TestJVM
java -showversion -XX:NewRatio=1 TestJVM
09、JVM内存模型之jdk1.7与jdk1.8内存模型(很重要):
jvm 1.7 年轻代 老年代 永久代
jvm 1.8 年轻代 老年代 取消了永久代,为了和JRocket VM融合。使用元空间metaspace代替老年代,元空间不在jvm中,而是在本地内存中。
10、JVM内存模型之jstat命令的使用:
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:
jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]
eg.
[root@node01~]#jps
7080 Jps
6219 Bootstrap
1.class加载统计
[root@node01?~]# jstat ‐class 6219
Loaded??Bytes??Unloaded??Bytes?????Time???
??3273??7122.3????????0?????0.0???????3.98
2.编译统计
jstat -compiler 6219
3.垃圾回收统计
jstat -gc 4086 1000 5
11、jmap命令的使用:
jmap -heap 4086
jmap -histo 4086 | more
jmap -histo:live 4086 | more
将内存使用情况dump到文件中:
jmap -dump:format=b,file=/export/servers/jvm/dump.dat 4086
13、通过MAT工具对dump文件进行分析:
1.通过jhat对dump文件进行分析:
jhat -port 9999 /export/servers/jvm/dump.dat
OQL:
eg.
select s from java.lang.String s where s.value.length >= 100
2.通过MAT工具对dump文件进行分析
下载mat,解压到本地物理机,然后执行MemoryAnalyzer.exe
shallow heap:对象本身占用内存大小,不包括它引用的对象 retained heap:当前对象大小+当前对象可直接或间接引用到的对象的大小总和.
14、内存溢出的定位与分析:
利用mat测试内存溢出时,必须生成一个文件java_pid12644.hprof用于分析测试,为此,需要在run/debug configuration中添加运行参数:
-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
16、死锁问题:
jstack:
作用:查看jvm中的线程执行情况,比如,发现服务器的CPU的负载突然增高了、出现了死锁、死循环等。
将正在运行的jvm的线程情况进行快照,并且打印出来。
jstack 4086 查看tomcat的所有线程状态
6种状态:
new runnable blocked waiting timed_waiting terminated
实战 死锁:
jstack 8569
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x00007fd2bc0062c8 (object 0x00000000f115d790, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x00007fd2bc004e28 (object 0x00000000f115d7a0, a java.lang.Object),
which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
at TestDeadLock$Thread2.run(TestDeadLock.java:41)
- waiting to lock <0x00000000f115d790> (a java.lang.Object)
- locked <0x00000000f115d7a0> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:748)
"Thread-0":
at TestDeadLock$Thread1.run(TestDeadLock.java:23)
- waiting to lock <0x00000000f115d7a0> (a java.lang.Object)
- locked <0x00000000f115d790> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:748)
Found 1 deadlock.
18、VirsualVM工具的使用(监控远程进程):
进入jdk安装目录/bin
打开jvisualvm.exe
远程监控的jvm:JMX
步骤:
1.在远程tomcat中添加参数;
JAVA_OPTS="-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false"
然后重启tomcat,并打印日志:
./startup.sh && tail -f ../logs/catalina.out
远程--添加远程主机,添加JMX连接。