JVM参数设置(吞吐量和响应时间性能调优)

文章目录

    • 一、吞吐量与响应时间
    • 二、垃圾回收器算法比较
    • 三、JDK参数配置(IDEA中vm options)
    • 四、[GC日志设置以及日志的分析](https://blog.csdn.net/qq_21383435/article/details/80702205)

一、吞吐量与响应时间

  1. 吞吐量 = CPU在用户应用程序运行的时间 / (CPU在用户应用程序运行的时间 + CPU垃圾回收的时间)
  2. FULL GC,串行垃圾回收会使用应用停顿,响应用户时间长

二、垃圾回收器算法比较

  1. 串行回收算法:会停止当前应用进程,回收垃圾,停顿时间久,吞吐量大,响应时间长
  2. 并行回收算法: 是多个线程同时执行串行回收算法(多核),也会使应用停顿,吞吐量大,响应时间长,用户体验差
  3. 并发回收算法:应用和垃圾回收多个线程并发执行,吞吐量相对小,响应时间短,用户体验好
  4. G1 : 并发 + 并行回收 + 标记管理

三、JDK参数配置(IDEA中vm options)

-client——设置JVM使用Client模式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或开发调试;在32位环境下直接运行Java程序默认启用该模式。 
-server——设置JVM使Server模式,特点是启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境。在具有64位能力的JDK环境下默认启用该模式。 

参数说明 
-Xms768m:设置JVM初始堆内存为768m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。 
-Xmx768m:设置JVM最大堆内存为768m。 
-Xss128k:设置每个线程的栈大小。JDK5.0以后每个线程栈大小为1M,之前每个线程栈大小为256K。应当根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。需要注意的是:当这个值被设置的较大(例如>2MB)时将会在很大程度上降低系统的性能。 
-Xmn2g:设置年轻代大小为2G。在整个堆内存大小确定的情况下,增大年轻代将会减小年老代,反之亦然。此值关系到JVM垃圾回收,对系统性能影响较大,官方推荐配置为整个堆大小的3/8。 
-XX:NewSize=1024m:设置年轻代初始值为1024M。 
-XX:MaxNewSize=1024m:设置年轻代最大值为1024M。 
-XX:PermSize=256m:设置持久代初始值为256M。 
-XX:MaxPermSize=256m:设置持久代最大值为256M。 
-XX:NewRatio=4:设置年轻代(包括1个Eden和2个Survivor区)与年老代的比值。表示年轻代比年老代为1:4。 
-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的比值。表示2个Survivor区(JVM堆内存年轻代中默认有2个大小相等的Survivor区)与1个Eden区的比值为2:4,即1个Survivor区占整个年轻代大小的1/6。 
-XX:MaxTenuringThreshold=7:表示一个对象如果在Survivor区(救助空间)移动了7次还没有被垃圾回收就进入年老代。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代,对于需要大量常驻内存的应用,这样做可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象在年轻代存活时间,增加对象在年轻代被垃圾回收的概率,减少Full GC的频率,这样做可以在某种程度上提高服务稳定性。

四、GC日志设置以及日志的分析

  1. 日志输出设置JVM参数设置(吞吐量和响应时间性能调优)_第1张图片
  2. 日志查看
我在活着。。。。
2018-06-15T10:44:26.630-0800: [GC (System.gc()) [PSYoungGen: 2673K->496K(38400K)] 2673K->504K(125952K), 0.0010649 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
2018-06-15T10:44:26.631-0800: [Full GC (System.gc()) [PSYoungGen: 496K->0K(38400K)] [ParOldGen: 8K->402K(87552K)] 504K->402K(125952K), [Metaspace: 3300K->3300K(1056768K)], 0.0066154 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
我要死了。。。。
Heap
 PSYoungGen      total 38400K, used 1664K [0x0000000795580000, 0x0000000798000000, 0x00000007c0000000)
  eden space 33280K, 5% used [0x0000000795580000,0x00000007957201b0,0x0000000797600000)
  from space 5120K, 0% used [0x0000000797600000,0x0000000797600000,0x0000000797b00000)
  to   space 5120K, 0% used [0x0000000797b00000,0x0000000797b00000,0x0000000798000000)
 ParOldGen       total 87552K, used 402K [0x0000000740000000, 0x0000000745580000, 0x0000000795580000)
  object space 87552K, 0% used [0x0000000740000000,0x0000000740064ab8,0x0000000745580000)
 Metaspace       used 3312K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 369K, capacity 388K, committed 512K, reserved 1048576K

Process finished with exit code 0

说明:

PSYoungGen:表示新生代,这个名称由收集器决定。PS是Parallel Scavenge收集器的缩写,它配套的新生代称为PSYoungGen,新生代又分化eden space、from space和to space这三部分
ParOldGen:Parallel Scavenge收集器配套的老年代
Metaspace: Parallel Scavenge收集器配套的永久代
total & used:总的空间和用掉的空间
如果收集器为ParNew收集器,新生代为ParNew,Parallel New Generation
如果收集器是Serial收集器,新生代为DefNew,Default New Generation
这里的收集器是Parallel Scavenge。

可以看到上面有两种GC类型:GC(第二行)和Full GC(第三行),有Full表示这次GC是发生了Stop-The-World的。
新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度非常快。

老年代GC(Major GC/Full GC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC,Major GC的速度一般会比Minor GC慢10倍以上

你可能感兴趣的:(Java技术)