首页 > 编程语言 >java程序出现oom如何解决?什么场景下会出现oom?

java程序出现oom如何解决?什么场景下会出现oom?

时间:2023-10-07 15:37:02浏览次数:47  
标签:java oom 虚拟机 OOM XX 内存 下会 溢出

 

1、概述
OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”。当JVM因为没有足够的内存来为对象分配空间、并且垃圾回收器也已经没有空间可回收时,就会抛出这个error。

2、常见OOM情况及解决方法
情况一、java.lang.OutOfMemoryError: Java heap space —— > java 堆内存溢出
出现OOM原因:此种情况最常见,一般由于内存泄露或者堆的大小设置不当引起。
解决办法:对于内存泄露,需要通过内存监控软件查找程序中的泄露代码,而堆大小可以通过虚拟机参数-Xms、-Xmx等修改。
举例:循环调用new A() 导致堆溢出
虚拟机参数:-Xms1M -Xmx1M -XX:+HeapDumpOnOutOfMemoryError,
解释:将-Xmx和-Xms设置为一样可以避免堆自动扩展。-XX:+HeapDumpOnOutOfMemoryError, 解释:可以让虚拟机在出现内存溢出异常时Dump出当前的堆内存转储快照,然后分析Dump文件

情况二、java.lang.OutOfMemoryError: PermGen space —— > java 永久代溢出 ,即方法区溢出了
出现OOM原因:一般出现于大量Class 或者 jsp页面,或者采用cglib等反射机制的情况,因为上述情况会产生大量的Class信息存储于方法区。另外,过多的常量,尤其是字符串,也会导致方法区溢出。
解决办法:此种情况可以通过更改方法区的大小来解决,使用类似-XX:PermSize=64m -XX:MaxPermSize=256m 的形式修改。
举例:循环调用String.intern()方法来写入常量池,常量池溢出。
虚拟机参数:-XX:PermSize=10M -XX:MaxPermSize=10M,
解释:表示JVM初始分配的永久代的容量和最大容量。(永久区内存不足,1.8后都在堆上。方法区=永久代,PermGen space”,即永久代)

情况三、java.lang.StackOverflowError ------> 不会抛OOM error,但也是比较常见的Java内存溢出。
出现OOM原因:JAVA虚拟机栈溢出,一般是由于程序中存在死循环或者深度递归调用造成的,栈大小设置太小也会出现此种溢出。
解决办法 :可以通过虚拟机参数 -Xss 来设置栈的大小。
举例:循环调用对象引用的方式实现栈溢出。
虚拟机参数:-Xss128k,
解释:设置虚拟机栈的大小为128kn
在单线程下,无论栈帧太大还是虚拟机栈容量太小,内存无法分配的时候都会抛出以上错误。


3、##Jprofiler定位OOM的问题原因
JProfiler是一款功能强大的Java开发分析工具,它可以快速的帮助用户分析出存在的错误,软件还可对需要的显示类进行标记,包括了内存的分配情况和信息的视图等
JProfiler官网:http://www.ej-technologies.com/products/jprofiler/overview.html

 

标签:java,oom,虚拟机,OOM,XX,内存,下会,溢出
From: https://www.cnblogs.com/tanll/p/17746411.html

相关文章

  • java 数组list 找出最早最晚
    //找到最早的小时和最晚的小时,并具体到分钟Optional<LocalTime>earliestTime=adminEventInfoDTOList.stream().map(dto->dto.getCreateTime().toLocalTime()).min(LocalTime::compareTo);Optional<LocalTime......
  • Java Web学习路线
    1.基础概念Web应用程序基础客户端-服务器模型HTTP协议URI和URL浏览器和服务器交互过程2.Servlet编程Servlet概述Servlet生命周期Servlet配置和映射请求和响应对象请求参数的获取和处理Servlet过滤器会话管理和Cookie3.JSP(JavaServerPages)JSP基础......
  • java实现 微信公众号推送消息 ,cv 就可运行!!!
    一,注册公众号1,官网地址:申请测试公众号地址:微信公众平台(qq.com)文档地址:微信开放文档(qq.com)2,注册后可以查看自己的appId和appsecret3,创建模板请注意:1、测试模板的模板ID仅用于测试,不能用来给正式帐号发送模板消息2、为方便测试,测试模板可任意指定内容,但实际上正......
  • javascript比较字符串大小
    https://blog.csdn.net/first_shun/article/details/108186675使用js进行sort排序的时候比较字符串用了使用localeCompare方法a.localeCompare(b)//-101......
  • java中如何对特大文件做断点续传RandomAccessFile
    Java中可以使用 RandomAccessFile 类来实现特大文件的断点续传功能。importjava.io.File;importjava.io.IOException;importjava.io.RandomAccessFile;importjava.net.URL;importjava.net.HttpURLConnection;publicclassResumeDownloadExample{publicstaticvoi......
  • Java 学习笔记
    Java学习笔记dos环境下(Windows即cmd)的Java命令先用javac文件名.java;命令,编译java文件,生成一个后缀为class、名与类名相同的文件。再用java类名命令,执行文件。当类名前的修饰符为public时,类名必须和源文件名一致。并且以上操作不能执行带package的java文......
  • JAVA学习笔记1
    private封装extends继承编译类型是爷爷多态整个继承过程构造器必须首行引用爷爷的构造器(用super)点击查看代码packagecom.hspstudy.Test1;publicclassExtend_{publicstaticvoidmain(String[]a){GraFathergraFather=newGraFather("勤才",......
  • Java 常用开发总结
    Java8集合篇ListStream常用操作1List去重publicclassStreamTest{@Testpublicvoidtest_listDistinct(){List<String>oldList=Arrays.asList("a","b","a","c");List<String>newLi......
  • Java抽象类与接口的区别(略解)
    抽象类 接口抽象类与接口区别1.抽象类抽象类用abstract来修饰,例如:packagecom.test.abstractaaa;publicabstractclassTestAbstract{}抽象类是用来捕捉子类的通用性的,它不能被实例化,只能用作子类的超类,抽象类是被用来创建继承层级里子类的模板,例如JDK中......
  • 深入浅出 Java 中的神锁:ReentrantLock,还有谁不会?
    来源:jiannan.blog.csdn.net/article/details/121331360一、引言话不多说,扶我起来,我还可以继续撸。在学习ReentrantLock源码之前,先来回顾一下链表、队列数据结构的基本概念~~二、数据结构2.1链表(LinkedList)小学一、二年级的时候,学校组织户外活动,老师们一般都要求同学之间小......