我们开发一个测试程序,来模拟OutofMemory情况。

程序很简单,代码如下:

import java.util.ArrayList;
import java.util.List;public class Test {public static void main(String[] args) {List<String> list = new ArrayList<>();while(true){list.add(new String("test"));}}
}

我们进入该java文件所在的目录,然后打开控制窗口,进入到该目录。

通过javac编译Test.java文件

再来看我们的test目录

这下子生成了编译之后的.class文件,然后我们来执行它。

javac 编译时常见问题

javac编译时编码错误(编码格式不一致)_张某某啊哈的博客-CSDN博客一、文档编写目的昨天在群里看到一个刚学java的朋友碰到一个问题,他用文本编辑器写了一个java类,这大概就是所有java初学者刚开始都要经历的阶段吧,然后使用javac编译,在用java运行,出现了一个错误,在这里进行总结一下,希望对大家和我都有点帮助。二、场景还原java代码如下public class Byte { public static void main(String[] args) { byte x = 22; //x是十进制 by...https://blog.csdn.net/qq_36908872/article/details/124062276javac编译问题:使用了未经检查或不安全的操作_张某某啊哈的博客-CSDN博客使用了未经检查或不安全的操作在本人用editplus写java文件时碰到的问题。 代码import java.util.*;class collection{ public static void main(String[] args) { Collection c1=new ArrayList(25); c1.add(new String("one")); c1.add(new String("two"));.https://blog.csdn.net/qq_36908872/article/details/124062356

java编译通过,运行却提示找不到或无法加载主类的解决方案_张某某啊哈的博客-CSDN博客一、问题描述java(javac HelloWorld.java)编译通过,(java HelloWorld)运行却 提示找不到或无法加载主类 的一般多见过java初上手,使用命令行的方式运行java程序,一般使用IDE工具是不会遇见的。二、分析和解决既然javac编译已经通过,这说明变量 JAVA-HOME 已经配置的没有问题了。第一种可能就是:问题就出在Path变量对应的变量值上或者是新建用户变量classpath上有问题,你重新配置一下。Path对应的变量值是在原来的变量值前面加上%Javhttps://blog.csdn.net/qq_36908872/article/details/124062439

运行该程序时设置JVM的堆内存(heapsize)的极限值为10M(-Xmx10m)

如果直接执行这个程序的话,它会直到耗至我们机器上所有的内存才会报错,方便我们进行演示,运行的时候加上-Xmx10m。

运行之后等待一会,如果不想等待这么久的话,还可以将运行内存调整至5M

报错的结果

产生内存溢出的问题,现在我们该如何分析呢?

可以使用Heap Dump。

什么是Heap Dump呢?

一个Heap Dump是指在某个时刻对一个java进程所使用的内存情况的一次快照。也就是在某个时刻把Java进程的内存以某种格式持久化到了磁盘上。

如何生成Head Dump文件?

设置参数: —— -XX:+HeapDumpOnOutOfMemoryError

此参数是帮助生成dump文件,程序启动后直到抛出OOM异常。异常抛出后,在程序的classpath下生成以一个.hprof结尾的文件,如:java_pid4504.hprof,这就是我们需要的dump文件。

我们先看一下该目录,是没有.hprof文件的

加上这个参数我们在运行一次

抛出异常之后

再来看一下test目录

这是我们可以看到一件生成了.hprof文件,在实际生产环境中这个文件会非常大。

常用的一个分析器 Jprofiler 来分析文件

可以看见占用了很大的堆内存

查看Reference 选中要查看的了类

定位到类后排查代码

当list数量太大时,就会导致OOM

工具下载地址  https://download.csdn.net/download/qq_36908872/85099750https://download.csdn.net/download/qq_36908872/85099750

扩展

生成Dump文件,JVM启动时添加参数:

#出现 OOME 时生成堆 dump:
-XX:+HeapDumpOnOutOfMemoryError
#生成堆文件地址:
-XX:HeapDumpPath=/home/xxx/logs/

linux springboot

nohup java -Xms2048m -Xmx2048m -XX:NewSize=384m -XX:MaxNewSize=450m -XX:PermSize=128m
 -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/darren/logs/ 
 -jar test.jar --spring.profiles.active=prod &

nohup java
-Xms2048m 指定堆内存初始化大小
-Xmx2048m 指定堆内存最大内存大小,
Xms设置和Xmx设置相同是为了避免频繁扩容和GC释放堆内存造成系统开销压力
-XX:NewSize=384m 新生代初始化内存的大小
-XX:MaxNewSize=450m 新生代可被分配的内存的最大上限(注意:该值需要小于-Xmx的值)
-XX:PermSize=128m 非堆区初始化内存分配大小
-XX:MaxPermSize=2048m 非堆区分配的内存的最大上限
-XX:+HeapDumpOnOutOfMemoryError 当JVM发生OOM时,自动生成DUMP文件
-XX:HeapDumpPath=/home/darren/logs/ 生成目录

nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中

分析Java的内存溢出问题(OutofMemory)相关推荐

  1. javacore分析工具_「赵强老师」如何分析Java的内存溢出问题

    一.什么是内存溢出? 内存溢出(OOM:out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出. 在J ...

  2. hprof文件分析工具_【赵强老师】如何分析Java的内存溢出问题

    欢迎关注赵强老师微信公众号:myitshare 一.什么是内存溢出? 内存溢出(OOM:out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你 ...

  3. Java常见内存溢出(OOM)解决方案

    Java 常见内存溢出(OOM)解决方案 一,jvm内存区域   1,         程序计数器 一块很小的内存空间,作用是当前线程所执行的字节码的行号指示器. 2,         java栈 与 ...

  4. 垃圾回收算法与实现系列-Java堆内存溢出原因

    导语   内存一直是所有开发人员探索的一片天地,再JVM中,内存往往会被分为几块,了解不同的内存区域对编写出优质的代码有很大的帮助.堆内存作为JVM中比较重要的区域,有很多值得我们探索的地方.下面就来 ...

  5. 模拟JAVA堆内存溢出和栈内存溢出

    文章目录 1. 模拟堆内存溢出 2. 模拟栈内存溢出 1. 模拟堆内存溢出 为了更快的出现堆内存溢出,可以限制Java堆的大小为10MB(不限制也可以).代码如下(可直接复制使用): package ...

  6. java堆内存溢出的一般原因是什么_中软国际:Java堆内存溢出的本质是什么

    了解内存溢出错误的本质 事实证明,无论是什么情况,只要了解它的基本情况比如基本概念,解决起来相对得心应手些.如何去评估和了解一个内存溢出错误?最先做的事情应该是观察内存增长特征.根据情况做出可能性的评 ...

  7. Java堆内存溢出解决方案

    Java堆内存溢出的问题 引言 堆内存工作原理 移除永久代? 分代是什么? 为什么分代? 为什么Survivor分为两块相等大小的幸存空间? JVM堆内存常用参数 垃圾回收算法 垃圾收集器 串行收集器 ...

  8. java线程内存溢出_Java常见问题分析(内存溢出、内存泄露、线程阻塞等)

    Java垃圾回收机制(GC) 1.1 GC机制作用 1.2 堆内存3代分布(年轻代.老年代.持久代) 1.3 GC分类 1.4 GC过程 Java应用内存问题分析 2.1 Java内存划分 2.2 J ...

  9. Java常见内存溢出异常分析

    Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等,而Hotspot jvm的实现中,将堆内存分为了三部分,新生代,老年代,持久带,其中持久带实现了规范中规定的方法区,而 ...

最新文章

  1. iOS UITapGestureRecognizer手势和UIButton 以及UITabelView点击事件冲突
  2. Maltego更新到4.2.6
  3. 一道关于 ARRAY 深度展开的面试题
  4. conda切换环境_Python多环境管理,你需要知道的几种方法
  5. 脱了马甲我也认识你: 聊聊 Android 中类的真实形态
  6. Mina、Netty、Twisted一起学(五):整合protobuf
  7. 鼐鼐家为用户打造3D互动体验式营销解决方案
  8. 54 - 算法 - 动态规划问题 连续子序列和最大
  9. 记录最近的几个bug
  10. FPGA——1位全加器的实现
  11. JAVA获取word书签内容_java操作word可操作书签
  12. 提升 10 倍!阿里云对象存储 OSS 可用性 SLA 技术揭秘
  13. ibmr系列服务器怎么装架子,【R440/R540/R640/R740 R820 R930 DELL服务器导轨 滑轨 支架 理线架】价格_厂家 - 中国供应商...
  14. php 电子图册制作,想把自己的照片做成电子相册 相册制作软件
  15. Anaconda 使用 set CONDA_FORCE_32BIT=1 切换32位环境失败的解决方法
  16. web前端框架——一些简单理解
  17. pycharm:远程连接服务器调试代码(保姆级详细步骤)
  18. ROS:rosbag play系列指令(详解)
  19. JS实现简单的网页文本转语音阅读
  20. APPLE Bonjour服务导致公司网络核心Cisco 6509崩溃的案例

热门文章

  1. Windows权限简介
  2. [UOJ500]任意基DFT
  3. python如何画损失函数图_TensorFlow损失函数专题详解
  4. java 采用腾讯云直播实现多方视频录制并每路画面添加相应的水印
  5. 网络地址和主机地址的区别---思考与延伸
  6. android微信电话锁屏,解决 Android 7.0 系统中,微信无法在锁屏画面显示
  7. Google “此网页包含重定向循环”的解决方案
  8. matlab 符号运算 数值,MATLAB中的微积分运算(数值符号)
  9. MySQL架构初步了解
  10. BZOJ3572.【HNOI2014】世界树(worldtree)