JVM堆内存诊断

简介: 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
• 1

然后弹出界面,我们选择我们的程序名

我们很直观的看到我们的堆内存变化过程

内存变化过程

目录
相关文章
|
2月前
|
存储 算法 Java
散列表的数据结构以及对象在JVM堆中的存储过程
本文介绍了散列表的基本概念及其在JVM中的应用,详细讲解了散列表的结构、对象存储过程、Hashtable的扩容机制及与HashMap的区别。通过实例和图解,帮助读者理解散列表的工作原理和优化策略。
43 1
散列表的数据结构以及对象在JVM堆中的存储过程
|
2月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
356 1
|
10天前
|
存储 Java 程序员
【JVM】——JVM运行机制、类加载机制、内存划分
JVM运行机制,堆栈,程序计数器,元数据区,JVM加载机制,双亲委派模型
|
12天前
|
算法 Java
堆内存分配策略解密
本文深入探讨了Java虚拟机中堆内存的分配策略,包括新生代(Eden区和Survivor区)与老年代的分配机制。新生代对象优先分配在Eden区,当空间不足时执行Minor GC并将存活对象移至Survivor区;老年代则用于存放长期存活或大对象,避免频繁内存拷贝。通过动态对象年龄判定优化晋升策略,并介绍Full GC触发条件。理解这些策略有助于提高程序性能和稳定性。
|
30天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
1月前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
57 5
|
2月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
2月前
|
存储 监控 Java
合理设置JVM堆大小
合理设置JVM堆大小
44 4
|
2月前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
25 3
|
2月前
|
存储 缓存 监控
Elasticsearch集群JVM调优堆外内存
Elasticsearch集群JVM调优堆外内存
55 1

热门文章

最新文章