MethodArea (永久代): 存储class信息、方法信息、代码编译完的信息、字节码.
1.7 之前叫 perm Generation , 必须设置大小,并且JVM启动之后没办法更改。存放字符串常量。
1.8叫 meta space,默认大小为物理内存。 字符串常量存放在堆中。
GC调优:尽量减少FGC(full GC)
JVM 参数:
-XX:+UseSerialGC = Serial New (DefNew) + Serial Old 可以一起指定,也可以单独指定
-XX:+UseConc(urrent)MarkSweepGC = ParNew + CMS + Serial Old 1.7需要加上括号中的urrent,1.8不用
-XX:+UseParallelGC = Parallel Scavenge + Parallel Old (1.8默认) 【PS + PO】
-XX:+UseParallelOldGC = ParNew + Parallel Old
-XX:+UseG1GC = G1
标准:- 开头,所有的hotspot 支持
非标准:-X 开头,特定hotspot支持
不稳定:-XX开头,下个版本可能取消
1. 区分概念:内存泄漏memory leak,内存溢出out of memory
2. java -XX:+PrintCommandLineFlags HelloGC
3. java -Xmn10M -Xms40M -Xmx60M -XX:+PrintCommandLineFlags -XX:+PrintGC HelloGC
PrintGCDetails PrintGCTimeStamps PrintGCCauses
4. java -XX:+UseConcMarkSweepGC -XX:+PrintCommandLineFlags HelloGC
5. java -XX:+PrintFlagsInitial 默认参数值
6. java -XX:+PrintFlagsFinal 最终参数值
7. java -XX:+PrintFlagsFinal | grep xxx 找到对应的参数
8. java -XX:+PrintFlagsFinal -version |grep GC
1.吞吐量: 用户代码时间 / (用户代码执行时间 + 垃圾回收时间)
2.响应时间: STW越短,响应时间越好
调优要求:追求吞吐量还是响应时间,或是在满足一定响应时间下,达到要求的吞吐量
吞吐量优先的,先选择垃圾回收器(PS + PO)。例如: 科学计算、数据挖掘
响应时间优先的,尽量选择 1.8 G1,其次 PN+CMS。 例如:网站、GUI、api
1.根据需求进行JVM规划和预调优
2.优化运行JVM环境
3.解决JVM运行过程中出现的各种问题(OOM)
QPS(Query Per Second):服务器在一秒的时间内处理了多少个请求。QPS(TPS)= 并发数/平均响应时间
设定日志参数
1. -Xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log -XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M -XX:+PrintGCDetails
-XX:+PrintGCDateStamps -XX:+PrintGCCause
cpu 100%: 使用top,查看占用cpu比较高的进程,使用top -Hp 进程ID ,查看对应的占用cpu较高的线程。如果是java应用,使用 jstack 导出该线程的堆栈。然后查看哪个方法(栈帧)消耗时间 jstack。
内存飙高: 导出堆内存 jmap,使用jhat 、jvisualvm、mat 等等 进行分析。
jmap -heap pid 查看堆内存使用情况,
jmap -histo:live pid | head 打印出前几条占用情况
打印类的实例数量、占用的内存、类的名称
https://www.cnblogs.com/cjsblog/p/9561375.html
jmap -dump:live,format=b,file=myheap.dump pid 导出堆内存到文件
如何监控JVM: jstat、jvisualvm 等等
cmd
tasklist | findstr /s /i "java" 查看java使用cup的情况
linux
top 找出使用cpu最高的pid
jstack pid 查看线程运行情况
"Thread-2" #17 prio=5 os_prio=0 tid=0x000000001aac7800 nid=0x1dc8 runnable [0x000000001bb5e000]
java.lang.Thread.State: RUNNABLE
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
- locked <0x00000000d7f9af98> (a java.net.DualStackPlainSocketImpl)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
- locked <0x00000000d7f9b118> (a sun.net.www.http.HttpClient)
at sun.net.www.http.HttpClient.(HttpClient.java:242)
at sun.net.www.http.HttpClient.New(HttpClient.java:339)
at sun.net.www.http.HttpClient.New(HttpClient.java:357)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1202)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1138)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1032)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:966)
at com.dandan.ThreadConn.run(ThreadConn.java:27)
at java.lang.Thread.run(Thread.java:748)
倒数第二行可以看到目前是哪个类,哪行。以及可以看到整体的实在一个connect 中。
jstat -class pid 查看class占用数量
Loaded:加载class的数量 Bytes:所占用空间大小 Unloaded:未加载数量 Bytes:未加载占用空间 Time:时间
jstat -gc pid 查看gc 使用情况
jstat 更多命令 https://www.cnblogs.com/sxdcgaq8080/p/11089841.html
jps 将类和 pid对应起来
jps -l 打印出类的路径
jps -v 打印出对虚拟机设置的参数