JVM内存结构:堆

文章详细介绍了JVM中的堆内存,包括其特点(线程共享,有垃圾回收机制)、可能导致堆内存溢出的原因及报错信息。提到了堆内存默认大小、如何设置堆空间大小以及使用jps、jmap、jconsole等工具进行内存占用问题的排查和诊断。还通过案例展示了如何使用jconsole和jvisualvm定位内存占用高的问题,特别是堆内存中大对象的查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JVM内存结构:堆

堆在jvm中的位置

堆是什么

Heap,堆
方法中创建的对象,都会使用堆内存

堆有什么特点

  • 线程共享的,堆中的对象都需要考虑线程安全的问题
  • 有垃圾回收的机制

怎么会导致堆内存溢出

垃圾回收机制会回收,不被使用的对象。
当正在被使用的对象持续增多,超过了内存,就导致堆内存溢出。

堆内存溢出会报什么错

java.lang.OutOfMemoryError:Java Heap space

堆空间默认多大

4GB

如何设置堆空间大小

配置虚拟机参数 -Xmx
设置堆空间

排查堆内存占用问题

将堆大小设置小一点,便于排查

堆内存诊断

  • jps工具
    • 查看当前系统中有哪些进程
  • jmap工具
    • 查看某一瞬间堆内存占用情况(快照)
  • jconsole
    • 查看连续时间下堆内存占用情况
    • 图形界面、多功能

案例:演示

  1. 使用 jps 查看当前系统的进程,找到运行的程序的进程id
  2. 使用jmap 查看进程id下堆内存占用情况
    jmap -heap 进程id堆内存占用情况演示
  3. 堆快照详解
    Heap Configuration:堆的设置,如堆的最大大小、新生代最大内存
    Heap Usage:堆内存的使用
    PS Young Generation:新生代
    Eden Space:伊甸区
    PS Old Generation:老年代

案例:演示jconsole

  1. 运行程序
  2. 使用 jconsole命令
    jconsle演示
    jconsole中,包括了堆内存展示、线程内存展示、类加载数量展示,cpu占用率展示,可以说,包括了 jmap -heapjstacktop指令的作用

案例:垃圾回收之后,内存占用仍然很高

思路:使用 jps获得进程id,使用 jconsole + 进程id,查看堆和栈的内存空间占用,如果是栈内存占用高,则查看虚拟机栈,找到正在运行的程序的行数,如果是堆内存高,使用 jvisualvm中的堆dump查看堆内存中占用最高的对象

定位:

  1. 发现堆内存占用很高,则使用 gc释放内存,结果发现内存占用仍然很高,仍有200个mb
  2. 使用 jvisualvm(Java虚拟机可视化)连接当前程序
    jvisualvm
  3. 点击堆 dump(堆转储功能),抓取堆快照,在堆快照中,查找最大的对象
    查找堆对象
  4. 查看发现最大的对象是一个 list

在这里插入图片描述
点击进去可以查看对象详细内容
查看对象详细内容
实例#1最大,并且在右侧可以发现每个元素大概为1mb,共有200个元素,正好是200mb,这样就定位到了对象。

``

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值