JVM内存结构:堆
堆是什么
Heap,堆
方法中创建的对象,都会使用堆内存
堆有什么特点
- 线程共享的,堆中的对象都需要考虑线程安全的问题
- 有垃圾回收的机制
怎么会导致堆内存溢出
垃圾回收机制会回收,不被使用的对象。
当正在被使用的对象持续增多,超过了内存,就导致堆内存溢出。
堆内存溢出会报什么错
java.lang.OutOfMemoryError:Java Heap space
堆空间默认多大
4GB
如何设置堆空间大小
配置虚拟机参数 -Xmx
排查堆内存占用问题
将堆大小设置小一点,便于排查
堆内存诊断
- jps工具
- 查看当前系统中有哪些进程
- jmap工具
- 查看某一瞬间堆内存占用情况(快照)
- jconsole
- 查看连续时间下堆内存占用情况
- 图形界面、多功能
案例:演示
- 使用 jps 查看当前系统的进程,找到运行的程序的进程id
- 使用jmap 查看进程id下堆内存占用情况
jmap -heap 进程id
- 堆快照详解
Heap Configuration:堆的设置,如堆的最大大小、新生代最大内存
Heap Usage:堆内存的使用
PS Young Generation:新生代
Eden Space:伊甸区
PS Old Generation:老年代
案例:演示jconsole
- 运行程序
- 使用 jconsole命令
jconsole中,包括了堆内存展示、线程内存展示、类加载数量展示,cpu占用率展示,可以说,包括了jmap -heap
,jstack
,top
指令的作用
案例:垃圾回收之后,内存占用仍然很高
思路:使用 jps获得进程id,使用 jconsole + 进程id,查看堆和栈的内存空间占用,如果是栈内存占用高,则查看虚拟机栈,找到正在运行的程序的行数,如果是堆内存高,使用 jvisualvm中的堆dump查看堆内存中占用最高的对象
定位:
- 发现堆内存占用很高,则使用 gc释放内存,结果发现内存占用仍然很高,仍有200个mb
- 使用 jvisualvm(Java虚拟机可视化)连接当前程序
- 点击堆 dump(堆转储功能),抓取堆快照,在堆快照中,查找最大的对象
- 查看发现最大的对象是一个 list
点击进去可以查看对象详细内容
实例#1最大,并且在右侧可以发现每个元素大概为1mb,共有200个元素,正好是200mb,这样就定位到了对象。
``