1 HotSpot参数分类
> 标准: - 开头,所有的HotSpot都支持
> 非标准:-X 开头,特定版本HotSpot支持特定命令
> 不稳定:-XX 开头,下个版本可能取消
java -X 查看标准参数
2 通过实验来认识JVM参数
public class HelloGC {
public static void main(String[] args) {
System.out.println("HelloGC!");
List list = new LinkedList();
for(;;) {
byte[] b = new byte[1024*1024];
list.add(b);
}
}
}
2.1 编译一下javac HelloGC.java
2.2 java -XX:+PrintCommandLineFlags HelloGC
2.3 java -Xmn10M -Xms40M -Xmx60M -XX:+PrintCommandLineFlags -XX:+PrintGC HelloGC
设置新生代大小:-Xmn10M
设置最小堆大小:-Xms40M
设置最大堆大小:-Xmx60M
打印GC信息:+PrintGC
可以看到这里的GC是指YGC,还要Full GC的信息。
2.4 java -Xmn10M -Xms40M -Xmx60M -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+PrintGCTimeStamps HelloGC
设置打印GC详细信息:+PrintGCDetails
设置打印发送的打印CG发生的时间戳:+PrintGCTimeStamps
2.5 java -XX:+UseConcMarkSweepGC -XX:+PrintCommandLineFlags HelloGC
设置老年代垃圾收集器为: CMS
2.6 java -XX:+UseConcMarkSweepGC -XX:+PrintCommandLineFlags -XX:+PrintGC HelloGC
2.7 java -XX:+UseConcMarkSweepGC -XX:+PrintCommandLineFlags -XX:+PrintGCDetails HelloGC
2.8. java -XX:+PrintFlagsInitial 默认参数值
2.9 . java -XX:+PrintFlagsFinal 最终参数值
总结:
eden space 5632K, 94% used [0x00000000ff980000,0x00000000ffeb3e28,0x00000000fff00000)
后面的内存地址指的是,起始地址,使用空间结束地址,整体空间结束地址
1. 吞吐量:用户代码时间 /(用户代码执行时间 + 垃圾回收时间)
2. 响应时间:STW越短,响应时间越好
问题:
科学计算,吞吐量。数据挖掘,thrput。吞吐量优先的一般:(PS + PO)
响应时间:网站 GUI API (1.8 G1)
3 设定日志参数
-Xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCCause
案例:
1. 有一个50万PV的资料类网站(从磁盘提取文档到内存)原服务器32位,1.5G
的堆,用户反馈网站比较缓慢,因此公司决定升级,新的服务器为64位,16G
的堆内存,结果用户反馈卡顿十分严重,反而比以前效率更低了
1. 为什么原网站慢?
很多用户浏览数据,很多数据load到内存,内存不足,频繁GC,STW长,响应时间变慢
2. 为什么会更卡顿?
内存越大,FGC时间越长
3. 咋办?
PS -> PN + CMS 或者 G1
2. 系统CPU经常100%,如何调优?
CPU100%那么一定有线程在占用系统资源,
1. 找出哪个进程cpu高(top)
2. 该进程中的哪个线程cpu高(top -Hp)
3. 导出该线程的堆栈 (jstack)
4. 查找哪个方法(栈帧)消耗时间 (jstack)
5. 工作线程占比高 | 垃圾回收线程占比高
3. 系统内存飙高,如何查找问题?(面试高频)
1. 导出堆内存 (jmap)
2. 分析 (jhat jvisualvm mat jprofiler ... )
4. 如何监控JVM
1. jstat jvisualvm jprofiler arthas top...