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 + SerialOld】
-XX:+UseParallelOldGC = Parallel Scavenge + Parallel Old
-XX:+UseG1GC = G1
HotSpot参数分类
标准:- 开头,所有的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
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 等等 进行分析。
如何监控JVM: jstat、jvisualvm 等等