java虚拟机调优

JVM参数分类

  • 标准:-开头 所有的HotSpot都支持
  • 非标准:-X开头 特定版本HotSpot支持的特定支持
  • 不稳定:-XX开头 下个版本可能取消

小程序代码

package a.b.c;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;

public class SqlGenerator {

    public static void main(String[] args) throws InterruptedException {
        System.out.println("hello world");
        List<byte[]> list = new ArrayList<>();
        int i = 1;
        int count = 100;
        while (i < count) {
            byte[] b = new byte[1 * 1024 * 1024];
            list.add(b);
            System.out.println("allocate" + i + "M byte[]");
            i++;
            TimeUnit.SECONDS.sleep(1);
        }

        Scanner scanner = new Scanner(System.in);
        String next = scanner.next();
        System.out.println("next = " + next);
    }
}

1.查看默认JVM参数

 jinfo -flags pid

Non-default VM flags:

-XX:CICompilerCount=4                   最大的并行编译数

-XX:InitialHeapSize=266338304       初始堆内存大小,单位B
-XX:MaxHeapSize=4229955584       最大堆内存大小,单位B

-XX:NewSize=88604672                   新生代内存初始内存大小,单位B
-XX:MaxNewSize=1409810432         新生代内存最大内存大小,单位B

-XX:OldSize=177733632

-XX:MinHeapDeltaBytes=524288

-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:+UseFastUnorderedTimeStamps
-XX:-UseLargePagesIndividualAllocation
-XX:+UseParallelGC

2.堆大小设置

java -Xms10m -Xmx10m  a/b/c/SqlGenerator

 再次执行 jinfo -flags pid

Non-default VM flags:

-XX:CICompilerCount=4                   

-XX:InitialHeapSize=10485760         整个堆大小10M
-XX:MaxHeapSize=10485760           整个堆大小10M

-XX:NewSize=3145728                     新生代3M(其中Eden区2M  2个survivor各1M)
-XX:MaxNewSize=3145728              新生代3M

-XX:OldSize=7340032                       老年代7M

-XX:MinHeapDeltaBytes=524288

-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:+UseFastUnorderedTimeStamps
-XX:-UseLargePagesIndividualAllocation
-XX:+UseParallelGC

3.jmap命令

3.1显示Java堆详细信息

jmap -heap pid

C:\Users\youhuanhuan>jmap -heap 36296
Attaching to process ID 36296, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.221-b11

using thread-local object allocation.
Parallel GC with 8 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 10485760 (10.0MB)
   NewSize                  = 3145728 (3.0MB)
   MaxNewSize               = 3145728 (3.0MB)
   OldSize                  = 7340032 (7.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8

   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 2097152 (2.0MB)        有一次出现这里是1.5M   尼玛的没搞懂
   used     = 388776 (0.37076568603515625MB)
   free     = 1184088 (1.1292343139648438MB)
   24.71771240234375% used
From Space:  
   capacity = 524288 (0.5MB)
   used     = 196608 (0.1875MB)
   free     = 327680 (0.3125MB)
   37.5% used
To Space:                                                
   capacity = 524288 (0.5MB)
   used     = 0 (0.0MB)
   free     = 524288 (0.5MB)
   0.0% used
PS Old Generation                                        老年代
   capacity = 7340032 (7.0MB)
   used     = 5285064 (5.040229797363281MB)
   free     = 2054968 (1.9597702026367188MB)
   72.00328281947544% used

6354 interned Strings occupying 513488 bytes.

3.2生成堆转储快照dump文件

jmap -dump:format=b,file=xxxheapdump.phrof   pid

注意:
        1.执行这个命令,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用, 线上系统慎用。

        2.live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被dump。

jmap -dump:format=b,file=xxxheapdump.phrof,live   pid
jmap -dump:live,format=b,file=xxxheapdump.phrof   pid

3.3显示堆中对象的统计信息

jmap -histo:live pid

其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。如果指定了live子选项,则只计算活动的对象。

4.垃圾回收统计信息

-XX:+PrintGC         打印GC的简要信息
-XX:+PrintGCDetails  打印GC的详细信息

再次执行 java -Xms30m -Xmx30m  -XX:+PrintGCDetails  a/b/c/SqlGenerator

D:\work\idea> java -Xms30m -Xmx30m  -XX:+PrintGCDetails  a/b/c/SqlGenerator
hello world
allocate1M byte[]
allocate2M byte[]
allocate3M byte[]
allocate4M byte[]
allocate5M byte[]
allocate6M byte[]
allocate7M byte[]
[GC (Allocation Failure) [PSYoungGen: 8152K->872K(9216K)] 8152K->8048K(29696K), 0.0059340 secs] [Times: user=0.03 sys=0.09, real=0.01 secs]
allocate8M byte[]
allocate9M byte[]
allocate10M byte[]
allocate11M byte[]
allocate12M byte[]
allocate13M byte[]
allocate14M byte[]
[GC (Allocation Failure) [PSYoungGen: 8202K->824K(9216K)] 15378K->15168K(29696K), 0.0022410 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (Ergonomics) [PSYoungGen: 824K->0K(9216K)] [ParOldGen: 14344K->14964K(20480K)] 15168K->14964K(29696K), [Metaspace: 2664K->2664K(1056768K)], 0.0074978 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]
allocate15M byte[]
allocate16M byte[]
allocate17M byte[]
allocate18M byte[]
allocate19M byte[]
allocate20M byte[]
allocate21M byte[]
[Full GC (Ergonomics) [PSYoungGen: 7493K->2048K(9216K)] [ParOldGen: 14964K->20084K(20480K)] 22457K->22132K(29696K), [Metaspace: 2667K->2667K(1056768K)], 0.0148889 secs] [Times: user=0.09 sys=0.02, real=0.02 secs]
allocate22M byte[]
allocate23M byte[]
allocate24M byte[]
allocate25M byte[]
allocate26M byte[]
[Full GC (Ergonomics) [PSYoungGen: 7328K->7168K(9216K)] [ParOldGen: 20084K->20072K(20480K)] 27412K->27240K(29696K), [Metaspace: 2667K->2667K(1056768K)], 0.0063151 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[Full GC (Allocation Failure) [PSYoungGen: 7168K->7168K(9216K)] [ParOldGen: 20072K->20072K(20480K)] 27240K->27240K(29696K), [Metaspace: 2667K->2667K(1056768K)], 0.0015917 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at a.b.c.SqlGenerator.main(SqlGenerator.java:16)
Heap
 PSYoungGen      total 9216K, used 7476K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
  eden space 8192K, 91% used [0x00000000ff600000,0x00000000ffd4d280,0x00000000ffe00000)
  from space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)
  to   space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)
 ParOldGen       total 20480K, used 20072K [0x00000000fe200000, 0x00000000ff600000, 0x00000000ff600000)
  object space 20480K, 98% used [0x00000000fe200000,0x00000000ff59a058,0x00000000ff600000)
 Metaspace       used 2698K, capacity 4486K, committed 4864K, reserved 1056768K
  class space    used 289K, capacity 386K, committed 512K, reserved 1048576K

4.1GC日志详解

xxx

5.dump文件

内存溢出时自动生成dump文件

-XX:+HeapDumpOnOutOfMemoryError    
-XX:HeapDumpPath=./heapdump.hprof

-XX:+HeapDumpOnOutOfMemoryError 参数在OOM的时,会在当前执行命令的目录下形成一个内存dump文件(如java_pid19540.hprof文件)。
-XX:HeapDumpPath 参数是指定dump文件存放目录。

6.jps(Java Virtual Machine Process Status Tool)

显示当前所有java进程pid的命令。

[-options]
    -l  输出应用程序main class的完整package名或者应用程序的jar文件完整路径名
    -m 
    -q 只显示pid
    -v 输出传递给JVM的参数

7.jstack pid

显示进程中的线程信息。

 

6.配置idea启动参数

6.1配置页面:

2.2 -XX:+PrintGCDetails    运行程序后,GC日志就可以打印出来了

[PSYoungGen: 65024K->10721K(75776K)]

意思是:GC之前,用了65M左右的内存,GC之后,用了10M内存,一共回收了将近55M。内存大小一共是75M左右。

2.3 -Xloggc:log/gc.log       指定GC日子位置

2.4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值