JVM堆内存诊断

关于堆内存的诊断,我们主要用下面的工具:

  1. jps工具,可以查看当前系统中有哪些java进程
  2. jmap工具,查看堆内存占用的情况
  3. jconsole工具,图形化的页面还能反映出内存随时间变化的情况
    我们用具体的案例来说明工具的使用:
package com.blogs;
public class Jvm1_4 {
    public static void main(String[] args) throws  InterruptedException{
        System.out.println("step1...");
        Thread.sleep(30000);
        byte[] array=new byte[1024*1024*10];//10M
        System.out.println("step2...");
        Thread.sleep(10000);
        array=null;
        System.gc();
        System.out.println("stept3...");
        Thread.sleep(100000000L);
    }
}

使用jmap内存诊断

我们在linux下启动程序:

java -Xmx70M Jvm1_4

我们用jps可以发现进程:

jps
25526 Jvm1_4

我们在每一次输出的时候分别用jmap去获取信息:
第一次抓取:

jmap -heap 25526
Attaching to process ID 25526, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.102-b14

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

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 73400320 (70.0MB)
   NewSize                  = 24117248 (23.0MB)
   MaxNewSize               = 24117248 (23.0MB)
   OldSize                  = 49283072 (47.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 = 18874368 (18.0MB)
   used     = 11618304 (11.080078125MB)
   free     = 7256064 (6.919921875MB)
   61.555989583333336% used
From Space:
   capacity = 2621440 (2.5MB)
   used     = 0 (0.0MB)
   free     = 2621440 (2.5MB)
   0.0% used
To Space:
   capacity = 2621440 (2.5MB)
   used     = 0 (0.0MB)
   free     = 2621440 (2.5MB)
   0.0% used
PS Old Generation
   capacity = 49283072 (47.0MB)
   used     = 0 (0.0MB)
   free     = 49283072 (47.0MB)
   0.0% used

724 interned Strings occupying 48560 bytes

第二次抓取:

Attaching to process ID 25526, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.102-b14

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

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 73400320 (70.0MB)
   NewSize                  = 24117248 (23.0MB)
   MaxNewSize               = 24117248 (23.0MB)
   OldSize                  = 49283072 (47.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 = 18874368 (18.0MB)
   used     = 11618304 (11.080078125MB)
   free     = 7256064 (6.919921875MB)
   61.555989583333336% used
From Space:
   capacity = 2621440 (2.5MB)
   used     = 0 (0.0MB)
   free     = 2621440 (2.5MB)
   0.0% used
To Space:
   capacity = 2621440 (2.5MB)
   used     = 0 (0.0MB)
   free     = 2621440 (2.5MB)
   0.0% used
PS Old Generation
   capacity = 49283072 (47.0MB)
   used     = 0 (0.0MB)
   free     = 49283072 (47.0MB)
   0.0% used

724 interned Strings occupying 48560 bytes.

第三次抓取:

Attaching to process ID 25526, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.102-b14

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

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 73400320 (70.0MB)
   NewSize                  = 24117248 (23.0MB)
   MaxNewSize               = 24117248 (23.0MB)
   OldSize                  = 49283072 (47.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 = 18874368 (18.0MB)
   used     = 365240 (0.34832000732421875MB)
   free     = 18509128 (17.65167999267578MB)
   1.9351111518012152% used
From Space:
   capacity = 2621440 (2.5MB)
   used     = 0 (0.0MB)
   free     = 2621440 (2.5MB)
   0.0% used
To Space:
   capacity = 2621440 (2.5MB)
   used     = 0 (0.0MB)
   free     = 2621440 (2.5MB)
   0.0% used
PS Old Generation
   capacity = 49283072 (47.0MB)
   used     = 268808 (0.25635528564453125MB)
   free     = 49014264 (46.74364471435547MB)
   0.5454367779670878% used

710 interned Strings occupying 47584 bytes.

我们看到MaxHeapSize 是我们指定的大小,Eden Space在第二次的时候变成了11.080078125MB,第三次抓取的时候释放了,我们可以看到代码中第三次执行了Gc的操作,内存也被释放了,通过jmap的跟踪,我们便可以看到内存信息了。

使用jconsole内存诊断

启动程序,指定jvm参数
在这里插入图片描述
程序启动之后,直接在命令行键入命令:

jsonsole

然后弹出界面,我们选择我们的程序名
在这里插入图片描述
我们很直观的看到我们的堆内存变化过程
在这里插入图片描述

内存变化过程
在这里插入图片描述

发布了48 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zhuxuemin1991/article/details/103898914