你知道如何解决Java内存溢出问题吗,这里和大家分享一下,JVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。
Java内存溢出的详细解决方案
一、Java内存溢出类型
1、java.lang.OutOfMemoryError:PermGenspace
JVM管理两种类型的Java内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。如果webapp用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成Java内存溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。
PermGenspace的全称是PermanentGenerationspace,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对PermGenspace进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGenspace错误,这种错误常见在web服务器对JSP进行precompile的时候。如果你的WEBAPP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
一个最佳的配置例子:(经过本人验证,自从用此配置之后,再未出现过tomcat死掉的情况)
setJAVA_OPTS=-Xms800m
-Xmx800m-XX:PermSize=128M
-XX:MaxNewSize=256m
-XX:MaxPermSize=256m
或者修改bin/catalina.sh文件,在第一行输入以下
JAVA_OPTS="$JAVA_OPTS -server -Xms512m -Xmx2048m -XX:PermSize=128m -XX:MaxNewSize=256m -XX:MaxPermSize=256m"
2、java.lang.OutOfMemoryError:Javaheapspace
再来看一下Java内存溢出的第二种情况,第一种情况是个补充,主要存在问题就是出现在这个情况中。其默认空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。如果内存剩余不到40%,JVM就会增大堆到Xmx设置的值,内存剩余超过70%,JVM就会减小堆到Xms设置的值。所以服务器的Xmx和Xms设置一般应该设置相同避免每次GC后都要调整虚拟机堆的大小。假设物理内存无限大,那么JVM内存的最大值跟操作系统有关,一般32位机是1.5g到3g之间,而64位的就不会有限制了。
注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。
垃圾回收GC的角色
JVM调用GC的频度还是很高的,主要两种情况下进行垃圾回收:
当应用程序线程空闲;另一个是java内存堆不足时,会不断调用GC,若连续回收都解决不了内存堆不足的问题时,就会报outofmemory错误。因为这个异常根据系统运行环境决定,所以无法预期它何时出现。根据GC的机制,程序的运行会引起系统运行环境的变化,增加GC的触发机会。
为了避免这些问题,程序的设计和编写就应避免垃圾对象的内存占用和GC的开销。显示调用System.GC()只能建议JVM需要在内存中对垃圾对象进行回收,但不是必须马上回收,一个是并不能解决内存资源耗空的局面,另外也会增加GC的消耗。
相关推荐
在Java虚拟机(JVM)中,不同的内存区域负责不同的功能,并且各自可能会出现特定类型的内存溢出异常。通过本实验,旨在深入理解JVM内存管理机制以及各种内存区域的特点,并通过具体的编程实践来触发并分析这些异常,...
要理解和解决这个问题,我们需要深入探究Java内存管理机制,特别是堆内存的分配与回收。 首先,Java堆内存是Java虚拟机(JVM)中用于存储对象实例的主要内存区域。当程序创建大量对象,且这些对象生命周期较长,...
Java内存不足PermGen space错误通常出现在Java程序运行过程中,尤其是当Java EE服务器(如Tomcat、JBoss等)加载WAR或EAR包时。这个错误的根本原因在于Java虚拟机(JVM)的永久代(Permanent Generation Space)内存...
- 常见的内存溢出类型有:栈溢出、堆溢出、方法区溢出、直接内存溢出。 - 检测和处理内存溢出的方法,如使用JConsole、VisualVM等工具进行监控。 6. **JVM调优**: - 使用JVM参数进行性能优化,例如-Xms、-Xmx...
由于`Gallery`一次性加载多个项目,确保图片资源的大小适中以避免内存溢出。还可以使用`BitmapFactory.Options`的`inSampleSize`来缩小图片的尺寸,减少内存消耗。 从提供的文件名来看,我们可以看到一些关于`...
第4节jvm初体验-内存溢出问题的分析与解决 [免费观看] 00:17:59分钟 | 第5节jvm再体验-jvm可视化监控工具 [免费观看] 00:21:17分钟 | 第6节杂谈 [免费观看] 00:12:37分钟 | 第7节Java的发展历史00:27:24分钟 | ...
- `OutOfMemoryError`: 内存溢出错误。 - **解决方案**: - 调整类路径。 - 增加堆内存大小。 #### 24. Java多线程编程 - **书籍推荐**: 《Java多线程编程核心技术》。 - **学习目标**: - 多线程基础理论。 - ...
- **JVM性能瓶颈**:识别并解决JVM层面的性能瓶颈,如内存溢出、垃圾回收效率低下等问题。 - **实例分析**:通过具体的案例分析,如PermGen溢出、Heap溢出等,加深对内存管理的理解。 - **线程死锁与竞争**:通过...
第4讲 jvm初体验-内存溢出问题的分析与解决 免费 00:17:59 第5讲 jvm再体验-jvm可视化监控工具 免费 00:21:17 第6讲 杂谈 免费 00:12:37 第7讲 Java的发展历史 00:27:24 第8讲 Java的发展历史续 00:...
类型参数探究(第345页) - **概念**:在方法签名中使用类类型的参数。 - **应用场景**: - 处理复杂的对象数据。 - 支持多种类型的泛型编程。 ### 第六章:类与构造器 #### 1. 编写构造器(第387页) - **构造...
3. **内存管理**:Java的内存主要分为堆和栈两大部分。堆是所有线程共享的,主要用于对象实例的分配;栈则为每个线程独有,存储局部变量和方法调用信息。垃圾收集器(GC)负责自动回收不再使用的对象,以避免内存...
简单的Java虚拟机探索之旅以及内存溢出问题探究 堆内存溢出(不断新建静态对象而不释放其唯一引用) 线程栈溢出(不断新建线程调用死循环方法) 方法栈溢出(调用无返回条件的递归方法) 运行时常量池内存溢出(在 ...
垃圾回收(Garbage Collection,GC)是JVM内存管理的一部分,它自动释放不再使用的对象占用的内存空间,以防止内存泄漏和内存溢出。常见的垃圾回收算法包括标记-清除算法、复制算法、标记-整理算法和分代收集算法等...
《深入理解Java虚拟机:JVM高级特性与最佳实践》这本书是Java开发者深入探究JVM(Java Virtual Machine)的重要参考资料。JVM作为Java程序运行的基础,它的理解和优化对于提升Java应用性能至关重要。以下将详细阐述...
例如,`-XX:+HeapDumpOnOutOfMemoryError`参数可在内存溢出时生成堆转储文件,便于后续分析。 5. **线程调度与并发**:理解JVM如何调度线程,以及如何利用`-XX:PreBlockSpin`、`-XX:ThreadPriorityPolicy`等参数...
- 内存溢出:学习如何识别和解决内存溢出问题,如堆溢出、栈溢出等。 6. **JVM**: - 类加载机制:了解类加载过程(加载、验证、准备、解析、初始化)和双亲委托模型。 - 字节码执行:理解JVM如何执行字节码,...
java8 rt.jar源码 JVM探究 请你谈谈你对JVM的理解?java8虚拟机和之前的变化和更新? 首先JVM由类装载器,运行时数据区域,执行引擎,本地接口库和本地方法库组成。 什么是OOM,什么是栈溢出StackOVerFlowError?...
4. "内存泄漏与内存溢出分析.pdf" - 这篇文章详细阐述了内存泄漏和内存溢出的问题,讲解了如何通过日志、监控工具等手段识别和定位这些问题,并给出了相应的解决策略。 5. "JVisualVM使用指南.pdf" - JVisualVM是...
1. **JVM内存模型**:理解堆、栈、方法区、本地方法栈、程序计数器等区域的作用,以及内存溢出问题的排查与解决。 2. **对象创建与内存分配**:探究对象在JVM中的创建过程,了解新生代、老年代、持久代的内存分配...