网站首页 > java教程 正文
java内存溢出异常主要有两个:
? OutOfMemeoryError:当堆、栈(多线程情况)、方法区、元数据区、直接内
存中数据达到最大容量时产生;
? StackOverFlowError:如果线程请求的栈深度大于虚拟机锁允许的最大深度,
将抛出StackOverFlowError,其本质还是数据达到最大容量;
什么情况下出现堆溢出?怎么解决?
? 产生原因
堆用于存储实例对象,只要不断创建对象,并且保证GC Roots到对象之间有
引用的可达,避免垃圾收集器回收实例对象,就会在对象数量达到堆最大容量时
产生OutOfMemoryError异常。
java.lang.OutOfMemoryError: Java heap space
? 解决办法
使用-XX:+HeapDumpOnOutOfMemoryError可以让java虚拟机在出现内存溢
出时产生当前堆内存快照以便进行异常分析,主要分析那些对象占用了内存;也
可使用jmap将内存快照导出;一般检查哪些对象占用空间比较大,由此判断代码
问题,没有问题的考虑调整堆参数;
什么情况下出现栈溢出?怎么解决?
? 产生原因
? 如果线程请求的栈深度大于虚拟机锁允许的最大深度,将抛出StackOverFlowError;
? 如果虚拟机在扩展栈时无法申请到足够的内存空间,抛出OutOfMemeoryError;
? 解决办法
? StackOverFlowError 一般是函数调用层级过多导致,比如死递归、死循环;
? OutOfMemeoryError一般是在多线程环境才会产生,一般用“减少内存的方法”,既
减少最大堆和减少栈容量来换取更多的线程支持;
什么情况下出现方法区或元数据区溢出?怎么解决?
? 产生原因
? jdk 1.6以前,运行时常量池还是方法区一部分,当常量池满了以后(主要是字
符串变量),会抛出OOM异常;
? 方法区和元数据区还会用于存放class的相关信息,如:类名、访问修饰符、常
量池、方法、静态变量等;当工程中类比较多,而方法区或者元数据区太小,
在启动的时候,也容易抛出OOM异常;
? 解决办法
? jdk 1.7之前,通过-XX:PermSize,-XX:MaxPerSize,调整方法区的大小;
? jdk 1.8以后,通过-XX:MetaspaceSize ,-XX:MaxMetaspaceSize,调整元数据
区的大小;
什么情况下出现本机直接内存溢出?怎么解决?
? 产生原因
jdk本身很少操作直接内存,而直接内存(DirectMemory)导致溢出最大的特征是,
Heap Dump文件不会看到明显异常,而程序中直接或者间接的用到了NIO;
? 解决办法
直接内存不受java堆大小限制,但受本机总内存的限制,可以通过
MaxDirectMemorySize来设置(默认与堆内存最大值一样
猜你喜欢
- 2024-11-02 Java堆内存又溢出了!看大师如何防范
- 2024-11-02 并发编程中常见的内存溢出的三种情况
- 2024-11-02 jmeter内存溢出解决方法(jmeter怎么清理缓存)
- 2024-11-02 JAVA服务实例内存高问题排查及解决!牛掰
- 2024-11-02 面试官:你知道JVM内存溢出问题的定位方法吗?
- 2024-11-02 简述 JVM 基础(二):Java内存区域与内存溢出异常
- 2024-11-02 一次大量出现Full GC、内存泄漏问题及内存溢出错误排查和分析
- 2024-11-02 如何识别Java中的内存泄漏(如何识别java中的内存泄漏情况)
- 2024-11-02 JAVA 8 内存溢出总结(java内存溢出会导致应用停机吗)
- 2024-11-02 内存溢出排查思路 内存溢出排查通用思路大概就是这三步了#编程
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)