本文来说下JVM性能优化之OOM问题

文章目录

  • 概述
  • 堆溢出
  • 堆溢出实践
  • 本文小结

概述

常见内存溢出异常

在JVM内存区域中,除了程序计数器外,Java虚拟机的其他运行时区域都有可能发生OutOfMemoryError的异常,因为堆区域出现OOM的情况最常见,本文以堆上的内存出现OOM来详细分析下OOM的解决过程:


堆溢出

这种场景最为常见,报错信息:

java.lang.OutOfMemoryError: Java heap space

原因

  • 代码中可能存在大对象分配
  • 可能存在内存泄露,导致在多次GC之后,还是无法找到一块足够大的内存容纳当前对象。

解决方法

  1. 检查是否存在大对象的分配,最有可能的是大数组分配
  2. 通过jmap命令,把堆内存dump下来,使用mat工具分析一下,检查是否存在内存泄露的问题
  3. 如果没有找到明显的内存泄露,使用 -Xmx 加大堆内存
  4. 还有一点容易被忽略,检查是否有大量的自定义的 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问题相关推荐

  1. JVM性能优化之栈区域OOM问题

    本文来说下JVM性能优化之栈区域OOM问题 文章目录 概述 StackOverflowError异常 本文小结 概述 关于虚拟机栈和本地方法栈,分析内存异常类型可能存在以下两种: 如果现场请求的栈深度 ...

  2. JVM性能优化, Part 1 - JVM简介

    原文出自:http://www.importnew.com/1774.html 众所周知,Java应用程序是运行在JVM上的,但是你对JVM有所了解么?作为这个系列文章的第一篇,本文将对经典Java虚 ...

  3. 【Java架构师】JVM性能优化(一)JVM技术入门下

    JVM性能和"一次编译,到处运行"的挑战 我有新的消息告诉那些固执的认为Java平台本质上是缓慢的人.当Java刚刚做为企业级应用的时候,JVM被诟病的Java性能问题已经是十几年 ...

  4. 性能优化专题 - JVM 性能优化 - 04 - GC算法与调优

    目录导航 前言 Garbage Collect(垃圾回收) 如何确定一个对象是垃圾? 引用计数法 可达性分析 垃圾收集算法 标记-清除(Mark-Sweep) 复制(Copying) 标记-整理(Ma ...

  5. JVM性能优化之GC日志分析

    JVM性能优化之GC日志分析 文章目录 JVM性能优化之GC日志分析 前言 一.GC日志参数 GC日志参数 常用的垃圾收集器配置 大对象回收 二.GC日志分析工具 GCeasy JVM memory ...

  6. JVM性能优化(一)

    作者 Eva Andreasson Java应用程序是运行在JVM上的,但是你对JVM技术了解吗?这篇文章(这个系列的第一部分)讲述了经典Java虚拟机是怎么样工作的,例如:Java一次编写的利弊,跨 ...

  7. JVM性能优化, Part 5:Java的伸缩性

    感谢朋友[吴杰]投递本文. JVM性能优化系列文章由Eva Andearsson在javaworld上发表共计5篇文章,ImportNew上有前4篇译文.本文(第5篇)由吴杰翻译自:javaworld ...

  8. JVM性能优化, Part 2 ―― 编译器

    2019独角兽企业重金招聘Python工程师标准>>> ImportNew注:本文是JVM性能优化 – 第2篇 <JVM性能优化, Part 2 ―― 编译器>第一篇 & ...

  9. JVM性能优化之CPU负载过高

    本文来说下JVM性能优化之CPU负载过高的问题 文章目录 概述 程序测试 问题定位 本文小结 概述 一般性结论:一般来说,CPU占用高不高的问题,不是给定一个数值,例如90%以上就算高,以下就算正常, ...

最新文章

  1. .net 提供不通过反射访问不同数据库吗?
  2. 微软10亿美元投资AI公司助力云计算,研发通用人工智能
  3. 设计模式--策略(Strategy)模式
  4. 【Curl】 获取网站下载速率(Bytes/s)
  5. mysql类型设计_mysql设计表结构数据类型的选择
  6. 直方图中最大的矩形(遍历与单调栈)
  7. Zeroc Ice 发布订阅者之demo Icestorm之clock
  8. 字符串之数组中两个字符串的最小距离
  9. 新SQL Server 2016示例数据库
  10. Java程序实现密钥库的维护
  11. C#照片预览,好处是图片不在项目中也可以查看
  12. 3.30作业(采购管理+信息管理)
  13. 检测到非法调试,F12被管理员禁用解决方法
  14. Win10中文输入法加入美式英文键盘并默认英文键盘
  15. 基于涂鸦智能开发的墨水屏座位管理器——2.嵌入式功能实现篇
  16. 英文文章写作|文献管理|​​​​​​​阅读文献|引用文献|国内文章
  17. linux服务器后台运行Python程序
  18. 计算机junit测试类,复利计算器4.0之再遇JUnit
  19. 使用ffmpeg将视频切片并加密
  20. 联想ThinkPad E14 如何修改BIOS开机画面LOGO

热门文章

  1. 《为iPad而设计:打造畅销App》——快速回顾用户界面设计史
  2. Eclipse 中,web项目在Tomcat运行时填写不了Server name
  3. RestTemplate.getForObject返回List的时候处理方式
  4. Mysql高级之主从复制
  5. Socket编程实例
  6. [零基础学JAVA]Java SE应用部分-35.JAVA类集之二
  7. 字符验证码识别项目记录
  8. [deviceone开发]-多种样式下拉菜单demo
  9. 我的LINUX之路----linux目录文件管理
  10. openfire+elipse的导入配置