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

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

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

内存变化过程

目录
相关文章
|
9月前
|
运维 Kubernetes 监控
K8S异常诊断之俺的内存呢
本文讲述作者如何解决客户集群中出现的OOM(Out of Memory)和Pod驱逐问题。文章不仅详细记录了问题的发生背景、现象特征,还深入探讨了排查过程中的关键步骤和技术细节。
635 108
K8S异常诊断之俺的内存呢
|
6月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
624 55
|
1月前
|
存储 缓存 Java
我们来说一说 JVM 的内存模型
我是小假 期待与你的下一次相遇 ~
203 4
|
1月前
|
存储 缓存 算法
深入理解JVM《JVM内存区域详解 - 世界的基石》
Java代码从编译到执行需经javac编译为.class字节码,再由JVM加载运行。JVM内存分为线程私有(程序计数器、虚拟机栈、本地方法栈)和线程共享(堆、方法区)区域,其中堆是GC主战场,方法区在JDK 8+演变为使用本地内存的元空间,直接内存则用于提升NIO性能,但可能引发OOM。
|
7月前
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
608 6
|
6月前
|
Arthas 监控 Java
Arthas vmoption(查看和修改 JVM里诊断相关的option)
Arthas vmoption(查看和修改 JVM里诊断相关的option)
144 16
|
10月前
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
1027 166
|
8月前
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
385 29
JVM简介—1.Java内存区域
|
8月前
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
9月前
|
运维 Kubernetes 监控
K8S异常诊断之俺的内存呢
K8S异常诊断之俺的内存呢

热门文章

最新文章