JVM性能优化之堆区域OOM问题
本文来说下JVM性能优化之OOM问题
文章目录
- 概述
- 堆溢出
- 堆溢出实践
- 本文小结
概述
常见内存溢出异常
在JVM内存区域中,除了程序计数器外,Java虚拟机的其他运行时区域都有可能发生OutOfMemoryError的异常,因为堆区域出现OOM的情况最常见,本文以堆上的内存出现OOM来详细分析下OOM的解决过程:
堆溢出
这种场景最为常见,报错信息:
java.lang.OutOfMemoryError: Java heap space
原因
- 代码中可能存在大对象分配
- 可能存在内存泄露,导致在多次GC之后,还是无法找到一块足够大的内存容纳当前对象。
解决方法
- 检查是否存在大对象的分配,最有可能的是大数组分配
- 通过jmap命令,把堆内存dump下来,使用mat工具分析一下,检查是否存在内存泄露的问题
- 如果没有找到明显的内存泄露,使用 -Xmx 加大堆内存
- 还有一点容易被忽略,检查是否有大量的自定义的 Finalizable 对象,也有可能是框架内部提供的,考虑其存在的必要性
堆溢出实践
在idea中设置JVM启动参数
设置JVM启动参数:-Xms20M设置堆的最小内存为20M,-Xmx20M设置堆的最大内存和最小内存一样,这样可以防止Java堆在内存不足时自动扩容。-XX:+HeapDumpOnOutOfMemoryError参数可以让虚拟机在出现内存溢出异常时Dump出内存堆运行时快照。-verbose:gc表示在控制台输出GC情况
HeapOOM.java
package cn.wideth.buz.utils;import java.util.ArrayList;
import java.util.List;public class HeapOOM {public static class OOMObject {}public static void main(String[] args) {List<OOMObject> list = new ArrayList<>();while (true) {list.add(new OOMObject());}}}
测试运行结果:
打开Java VisualVM
VisualVM是一个以监控、显示本地或者远程服务器 JVM工作情况,进行性能调优的工具。在jdk的bin目录下,如下图所示。
导出Heap内存运行时的dump文件
将dump文件装载进VisualVM,可以看到是在cn.wideth.buz.utils.HeapOOM类中的OOMObject对象个数实例过多,导致程序发生了OOM。
本文小结
本文介绍了堆区域出现OOM问题以及如何解决出现的OOM问题。
JVM性能优化之堆区域OOM问题相关推荐
- JVM性能优化之栈区域OOM问题
本文来说下JVM性能优化之栈区域OOM问题 文章目录 概述 StackOverflowError异常 本文小结 概述 关于虚拟机栈和本地方法栈,分析内存异常类型可能存在以下两种: 如果现场请求的栈深度 ...
- JVM性能优化, Part 1 - JVM简介
原文出自:http://www.importnew.com/1774.html 众所周知,Java应用程序是运行在JVM上的,但是你对JVM有所了解么?作为这个系列文章的第一篇,本文将对经典Java虚 ...
- 【Java架构师】JVM性能优化(一)JVM技术入门下
JVM性能和"一次编译,到处运行"的挑战 我有新的消息告诉那些固执的认为Java平台本质上是缓慢的人.当Java刚刚做为企业级应用的时候,JVM被诟病的Java性能问题已经是十几年 ...
- 性能优化专题 - JVM 性能优化 - 04 - GC算法与调优
目录导航 前言 Garbage Collect(垃圾回收) 如何确定一个对象是垃圾? 引用计数法 可达性分析 垃圾收集算法 标记-清除(Mark-Sweep) 复制(Copying) 标记-整理(Ma ...
- JVM性能优化之GC日志分析
JVM性能优化之GC日志分析 文章目录 JVM性能优化之GC日志分析 前言 一.GC日志参数 GC日志参数 常用的垃圾收集器配置 大对象回收 二.GC日志分析工具 GCeasy JVM memory ...
- JVM性能优化(一)
作者 Eva Andreasson Java应用程序是运行在JVM上的,但是你对JVM技术了解吗?这篇文章(这个系列的第一部分)讲述了经典Java虚拟机是怎么样工作的,例如:Java一次编写的利弊,跨 ...
- JVM性能优化, Part 5:Java的伸缩性
感谢朋友[吴杰]投递本文. JVM性能优化系列文章由Eva Andearsson在javaworld上发表共计5篇文章,ImportNew上有前4篇译文.本文(第5篇)由吴杰翻译自:javaworld ...
- JVM性能优化, Part 2 ―― 编译器
2019独角兽企业重金招聘Python工程师标准>>> ImportNew注:本文是JVM性能优化 – 第2篇 <JVM性能优化, Part 2 ―― 编译器>第一篇 & ...
- JVM性能优化之CPU负载过高
本文来说下JVM性能优化之CPU负载过高的问题 文章目录 概述 程序测试 问题定位 本文小结 概述 一般性结论:一般来说,CPU占用高不高的问题,不是给定一个数值,例如90%以上就算高,以下就算正常, ...
最新文章
- .net 提供不通过反射访问不同数据库吗?
- 微软10亿美元投资AI公司助力云计算,研发通用人工智能
- 设计模式--策略(Strategy)模式
- 【Curl】 获取网站下载速率(Bytes/s)
- mysql类型设计_mysql设计表结构数据类型的选择
- 直方图中最大的矩形(遍历与单调栈)
- Zeroc Ice 发布订阅者之demo Icestorm之clock
- 字符串之数组中两个字符串的最小距离
- 新SQL Server 2016示例数据库
- Java程序实现密钥库的维护
- C#照片预览,好处是图片不在项目中也可以查看
- 3.30作业(采购管理+信息管理)
- 检测到非法调试,F12被管理员禁用解决方法
- Win10中文输入法加入美式英文键盘并默认英文键盘
- 基于涂鸦智能开发的墨水屏座位管理器——2.嵌入式功能实现篇
- 英文文章写作|文献管理|​​​​​​​阅读文献|引用文献|国内文章
- linux服务器后台运行Python程序
- 计算机junit测试类,复利计算器4.0之再遇JUnit
- 使用ffmpeg将视频切片并加密
- 联想ThinkPad E14 如何修改BIOS开机画面LOGO