JVM在这些情形下会抛出一个内存溢出错误:
(1)JVM没有可用的native memory。
(2)permgen(java 7和早期版本)或metaspace(java8)内存溢出了
(3)Java heap自身内存溢出了:在给定的heap size下,应用程序中有太多的活跃对象。
(4)JVM花费大量时间在执行GC
最后2种情况——涉及到Java heap自身——更常见,但不会自动得出结论说heap就是问题所在。所以有必要查找为什么会发生内存溢出(有一部分原因是异常的输出)。
一、Out of native memory
这和heap一点关系都没有。在一个32位的JVM中,一个进程的最大size是4GB(一些版本的Windows中是3GB,一些老版本的Linux上是3.5GB)。假如,你指定一个非常大的heap,
3.8GB——这就使得应用程序的size危险地接近那个限制了。甚至在一个64位JVM中,操作系统可能都没有足够的虚拟内存来应付JVM请求。
该主题在第8章会详细介绍。你需要记住如果内存溢出的消息说的是native memory,那么heap tuning不是该问题的答案。你需要仔细看一下错误中提到的native memory issue。
例如,下面的消息告诉你,线程栈的native memory耗尽了:
Exception in thread "main" java.lang.OutOfMemoryError:
unable to create new native thread
二、Out of permgen or metaspace memory
这和heap也没关系。发生此错误是因为permgen(java 7)或metaspace native memory(java 8)满了。错误的根源可能是这2方面:1.应用程序用了太多的classes,超过了默认的
perm space。解决方案就是加大permgen的size。2.更棘手一些,它涉及到classloader内存溢出。大多发生在一个JavaEE应用服务器中。每个部署到应用服务器的应用程序都运行在
它自己的classloader中(提供了隔离性,一个应用中的类不会和另一个应用中的类间产生共享或干预)。在开发过程中,每次应用改动,都必须重新部署:一个新的classloader会
被创建用来加载新的classes,同时老的classloader is allowed to go out of scope。一旦老的classloader goes out of scope,class metadata就可以被收回了。
如果老的classloader没有go out of scope,则class metadata就不会被释放,最终permgen将被充满,就会抛出内存溢出错误。这种情况下,加大permgen的size会有所帮助,但这
这是延缓了错误的发生。
如果该情况发生在一个应用服务器环境中,能做的很少,你需要联系应用服务器提供商,让他们修复这个问题。如果你正在编写你自己的应用程序,该程序创建并抛弃大量的classloaders,那么你要小心确保class loaders自身要正确地被抛弃。要调试该情形,heap dump analysis就很有用:在直方图中,找出ClassLoader类的所有实例,并跟踪它们的
GC roots来获知what is holding onto them。
Java 8中,抛出的错误文本是:
Exception in thread "main" java.lang.OutOfMemoryError: Metaspace
Java 7中,是:
Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
三、Out of heap memory(。。。。。。。。。。。。。。。。。。。待续)
相关推荐
然而,在这个过程中,开发者经常面临内存溢出错误的问题。这主要是因为phpExcel在内存中保存单元格信息,当数据量大时,内存消耗超过PHP配置的最大值,导致错误。下面将详细探讨如何解决phpExcel导出大量数据时出现...
3. **配置不当**:服务器或虚拟机的内存设置不合理,也可能触发内存溢出错误。 #### 影响及应对策略 内存溢出会使应用程序崩溃,严重影响用户体验和业务运行。为避免这种情况,可以: - 优化算法,减少不必要的...
内存溢出错误是指需要更多的内存空间,或是遇到 64K 段边界限制。这种错误可能是因为打开了太多的文档或资源文件、模块或过程太大、在 Microsoft Windows 标准模式下执行等原因。 解决方案: * 关闭不需要的应用...
// 处理内存溢出错误,可能需要重新调整inSampleSize或采用其他策略 } ``` 通过上述方法,开发者可以在保持应用性能的同时,有效地处理`Bitmap`内存溢出问题,避免应用崩溃,提升用户体验。在实际开发中,根据具体...
Tomcat内存溢出是指Tomcat服务器在处理大数据量时出现的内存溢出错误,导致系统崩溃或返回HTTP状态码500的错误页面。本文将详细介绍Tomcat内存溢出之解决方法,包括问题分析、解决方法和结论。 问题分析: Tomcat...
在Android开发过程中,我们经常会遇到因加载大尺寸图片而引发的`OutOfMemoryError`(内存溢出错误)。这种问题通常发生在使用`BitmapFactory`来加载图片时,尤其是在资源有限的设备上更为明显。本文将详细介绍如何...
这表明当前分配给Java虚拟机(JVM)的内存不足以支持程序正常运行,即发生了所谓的内存溢出错误。 #### 二、内存溢出原因分析 内存溢出通常是由以下几种情况导致的: 1. **应用程序内存消耗过高**:应用程序中...
例如,在Web应用中,如果使用了大量的第三方Jar包,并且这些Jar包的总大小超过了JVM默认分配给PermGen Space的大小(默认为4MB),就会出现此类内存溢出错误。 #### 三、PermGen Space 内存溢出的解决方法 1. **...
当发生内存溢出错误时,JRockit会生成详细的错误日志,包括堆转储(Heap Dump)和线程转储(Thread Dump)。这些信息对分析问题原因至关重要。开发者可以使用JMC或其他工具如Eclipse Memory Analyzer Tool(MAT)来...
内存溢出配置是IT行业中,尤其是在Java应用开发与运维领域中的一个重要话题,它涉及到系统资源管理、性能调优以及故障排查等多个方面。标题与描述中重复提到“内存溢出配置”,这表明了对这一主题的关注与重视。接...
当Tomcat出现内存溢出错误时,首先需要获取Tomcat的堆内存快照。这通常通过在Tomcat启动参数中添加`-XX:+HeapDumpOnOutOfMemoryError` 和 `-XX:HeapDumpPath=<dump_file_path>` 来实现。当发生OOM时,JVM会自动创建...
在使用Eclipse进行Java开发时,可能会遇到应用程序运行过程中出现“OutOfMemoryError”(内存溢出错误)。这类错误通常发生在Java虚拟机(JVM)无法为新对象分配足够的内存空间时,常见原因包括堆内存不足、永久代...
在处理大型Excel 2007(.xlsx)文件时,Apache POI是一个常见的Java库,但不恰当的使用方式可能会导致内存溢出错误。这是因为POI默认会将整个工作簿加载到内存中,对于大文件,这显然是不可行的。为了解决这个问题,...
此过程中的内存消耗是观察的重点,通过不断调用服务,可以逐渐增加客户端的内存占用,直至触发内存溢出错误。 #### 分析与解决方案 内存溢出通常由以下几个因素导致:资源泄露、不合理的内存分配策略、或者循环...
如果JVM分配给Eclipse的内存空间不足,尤其是在处理大型项目或者加载大量插件的情况下,就容易出现内存溢出错误。 ##### 2. 堆内存不足 堆内存是JVM用于存储对象实例的主要区域。当应用程序创建的对象过多,而堆...
3. **难以扩展**:当数据集规模进一步扩大时,这种方法很难适应,容易导致内存溢出错误。 #### 三、解决策略概述 为了克服上述问题,可以采取以下两种方法来优化数据加载过程: 1. **动态数据加载**:仅加载当前...
JAVA内存溢出问题总结 JAVA 内存溢出问题是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行...内存溢出问题是 Java 开发中常见的错误,通过调整容器参数和优化程序代码,可以避免内存溢出的发生。