当前位置: 首页 > news >正文

Java jvm 内存溢出分析

1.如何分析jvm内存溢出呢

我们经常用visualVm监控Jvm的内存,cpu,线程的使用情况,通常可以根据内存不断增长来判断内存是否存在不释放。但是我们不可能时时盯着去看,这里涉及jvm堆内存配置,堆内存参数配置和调优会在其他章节编写。

如果真是内存溢出了,线上出现的我们需要配置JVm内存溢出,建议线上一定要配置此参数XX:+HeapDumpOnOutOfMemoryError,否则到时不好分析线上问题。

-Xms100m -Xmx100m -XX:+HeapDumpOnOutOfMemoryError 

 2.编写我们自己的代码

接下来我们模拟内存溢出代码 

@Getter
@Setter
@ToString
public class HeapBean {private int userId;private String name;private String phone;
}
package com.es.Controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@RestController
public class HeapController {private List<HeapBean> userlist = new ArrayList<>();private Map hashMap=new HashMap<>();//堆区内存溢出@GetMapping("/heapOom")public void heapOverTest() {int i = 0;while (true) {//heaplist.add(new heapBean());hashMap.put(i, new HeapBean());i++;}}
}

本地启动代码,后请求实际地址。

运行到一定时间,就会生成hprof文件。

java.lang.OutOfMemoryError: GC overhead limit exceeded
Dumping heap to java_pid16868.hprof ...
Heap dump file created [171733163 bytes in 0.854 secs]
Exception in thread "File Watcher" java.lang.OutOfMemoryError: GC overhead limit exceededat java.lang.String.toLowerCase(String.java:2647)at java.io.WinNTFileSystem.hashCode(WinNTFileSystem.java:640)at java.io.File.hashCode(File.java:2132)at org.springframework.boot.devtools.filewatch.FileSnapshot.hashCode(FileSnapshot.java:72)at java.util.HashMap.hash(HashMap.java:338)at java.util.HashMap.put(HashMap.java:611)at java.util.HashSet.add(HashSet.java:219)at org.springframework.boot.devtools.filewatch.DirectorySnapshot.collectFiles(DirectorySnapshot.java:70)at org.springframework.boot.devtools.filewatch.DirectorySnapshot.collectFiles(DirectorySnapshot.java:67)

通过everything找到这个文件.

 

3.需要用到eclipse Memory Analyzer工具

Eclipse Memory Analyzer(简称MAT)是一个功能丰富且操作简单的JVM Heap Dump分析工具,可以用来辅助发现内存泄漏减少内存占用。

点击下载

 点击“MemoryAnalyzer.exe”,启动分析内存工具。

 打开java_pid16868.hprof文件

按照红色点击确认,看到占用最多的4.5m。

往下移动看到具体占用的类

点击details,看到我们自己的类。

 继续往下,看到对象的总数和占用的堆内存。

4.总结 

 总结最后到时HeapControler中的hashMap导致的内存溢出。

http://www.lryc.cn/news/160060.html

相关文章:

  • Qt CMake 中国象棋程序实现
  • ArcGIS 10.3安装教程!
  • Kafka的文件存储与稀疏索引机制
  • windowsxp下的mysql集群技术
  • 微信小程序开发---小程序的页面配置
  • 2023数学建模国赛B题完整论文来啦!(含一二问求解代码及三四问仿真模拟代码)
  • ERROR: your rosdep installation has not been initialized yet
  • python 文创产品商城推荐网上购物系统设计与实现vue
  • [lammps教程]OVITO绘制原子运动轨迹线
  • 2037:【例5.4】约瑟夫问题
  • 小节2:Python数学运算
  • 查看Oracle_表名、字段名、注释、进程及杀进程等常用语句
  • 吴恩达gradio课程:基于开源LLM(large language model)的聊天应用
  • Redis缓存预热、缓存雪崩、缓存击穿、缓存穿透
  • 手写Mybatis:第20章-Mybatis 框架源码10种设计模式分析
  • 系列一、前言
  • C/C++输出绝对值 2019年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
  • 记一次生产环境服务卡死排查记录
  • AFL模糊测试
  • PaddleOCR学习笔记1-初步尝试
  • ExpressLRS开源代码之框架结构
  • 【C++ • STL】一文带你走进string
  • GPT引领前沿热点、AI绘图
  • ArcGIS Pro3.0.2保姆级安装教程
  • 如何才能搭建高质量的在线产品手册呢?
  • 从零开始学习软件测试-第38天笔记
  • ASP.NET Core 8 的 Web App
  • jeesite自定义数据字典,自定义字典表,自带树选择数据源(保姆级图文教程)
  • 基于v-md-editor的在线文档编辑实现
  • C(结构体指针、利用结构体指针偏移获取数据)