JVM垃圾回收一个简单案例分析

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...

 

猜你喜欢

转载自blog.csdn.net/huzhiliayanghao/article/details/106931443