除了计数器外,其他的内存空间都可能发生OutOfMemoryError(OOM)错误
1、java堆内存溢出
java堆是用来储存实例、方法区、句柄,只要不断创建对象,在gc没及时清除这些对象时,就会达到最大堆的容量限制产生 内存溢出异常。
查看jvm分配到的内存:
System.out.println(Runtime.getRuntime().maxMemory()/1024/1024+"M");
我的是247M;
点击项目 run configurations修改:
再运行 :50M;
Xms最小内存,Xmx最大内存,-Xms50M中间没有空格;
cmd 输入jconsole可以查看vm的相关信息
通过上面的方法将jvm内存设置成15m,大量创建实例来造成内存溢出:
public class Test { public static void main(String...s){ List<Test> l = new ArrayList<Test>(); while(true){ System.out.println(Runtime.getRuntime().freeMemory()/1024/1024+"M"); l.add(new Test()); } } }
异常输出:
[GC 13594K->10285K(15872K), 0.0017656 secs]
[Full GC 10285K->10285K(15872K), 0.0219027 secs]
[Full GC 10285K->9855K(15872K), 0.0290098 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
操作系统给每个进程都有最大内存限定,比如32位系统对j进程分配最大为2G,除去heap和Method Area(占大部分),程序计数器(很小),剩余部分给jvm栈和本地方法栈;线程是相互独立的,线程是在虚拟机栈中分配;
2、jvm栈和本地方法溢出
HotSpot虚拟机是将本地方法栈和虚拟机栈放在一起的,栈容量是由-Xss参数设置。相关的错误有:
1、StackOverflowError:线程请求的栈深度大于虚拟机所允许的最大深度;(栈的帧数超过规定长度)
2、OutOfMemoryError:同heap内存溢出,jvm无法请求更多内存;
设置-Xss128k
public class Test1 { private int s=1; public void addself(){ s++; addself(); } public static void main(String[] args) throws Throwable { Test1 t1= new Test1(); try{ t1.addself(); }catch(Throwable e){ //这是错误,不能是Excption System.out.println(t1.s); throw e; } } }
2288
Exception in thread "main" java.lang.StackOverflowError
发生 栈溢出 错误 ,这个错误是在应用程序递归太深而发生堆栈溢出,就是说这是jvm限制的最大递归方法深度;
改为-Xss2m
输出:81135 明显请求深度增加了;
3、方法区和运行时常量池内存溢出OOM:
上一章中讲过,常量池是方法区的一部分,配置-XX:PermSize=1m -XX:PermSize=1m 限制方法区的大小,从而也限制了常量池的大小;
String.intern()是一个Native方法,它的作用是:如果常量池(常量池在方法区中)中已经包含String实例如"ok",则返回实例"ok";
public static void main(String...s){ int x=1; List<String > l= new ArrayList<>(); while(true){ l.add(String.valueOf(x++).intern()); }
上面这个常量池并不能在jdk1.7上造成OOM:PermGen Space,在1.7以后的版本开始去“去永久代”,方法区和常量池 就是heap中的永久代,上章讲过;
str=new StringBuiler("计算机").append("编程").toString();
syso.(str.intern()==str);
在jdk1.6会出现false,intern方法会把首次遇到的字符串复制到常量池(永久代),然后再返回这个引用,而str是个heap内存(new 创建),所以他们是不同的引用,一个在堆,一个在永久代;所以是false,这个好理解;
而在jdk1.7中则出现true,说明他们同一个引用;在jdk1.7中,由于已经在heap中创建了一个内存,intern方法机制的不再去复制了,直接返回在堆内存中的引用;若已有字符串如"java"在永久代中存在,intern返回就是永久代中的引用,如:
String str = new StringBuilder("ja").append("va").toString();
System.out.println(str.intern()==str);
false;
可以用spring的通知或者直接用动态代理实现,无限制的while(true)增加通知,造成方法区溢出 OOM:PermGen Space
参看java34章aop或者动态代理,这里不写代码了;
4、直接内存溢出
上章讲过,直接内存是堆外内存,通过-XX:MaxDirectMemorySize=10m来设置,如果不设置,则与java的最大heap内存一致(-Xmx设定)。
相关推荐
内存溢出配置参数详解 给定的部分内容中提到了一些JVM的启动参数,这些参数直接关联到内存溢出配置,下面我们来逐一解析: - **-Xms1024m**:设置JVM初始分配的堆内存大小为1024MB。这意味着JVM启动时,会立即...
### Java的内存管理机制分析 #### 一、Java内存区域划分 Java的内存管理机制将内存分为以下几个区域: 1. **栈(Stack)**: - 存储局部变量(如基本类型的变量和对象的引用)。 - 每个线程拥有一个独立的栈。 ...
综上所述,YARN内存管理的优化需要综合考虑RM、NM和AM的角色及它们的配置参数,确保资源有效利用,同时避免内存不足或溢出导致的问题。在实际操作中,需根据应用需求和集群资源状况合理调整这些参数,以实现最佳性能...
本文将详细介绍Spark内存管理机制,并探讨其优化的策略和实践。 首先,要了解Spark内存管理,先要区分Java堆内存和堆外内存。在Spark中,内存管理机制与JVM(Java虚拟机)有着紧密的联系。Java堆内存是JVM管理的...
3. **配置不当**:服务器或虚拟机的内存设置不合理,也可能触发内存溢出错误。 #### 影响及应对策略 内存溢出会使应用程序崩溃,严重影响用户体验和业务运行。为避免这种情况,可以: - 优化算法,减少不必要的...
为了更好地理解并解决MyEclipse中的内存溢出问题,首先需要对JVM的内存管理机制有所了解: 1. **堆内存(Heap)**:这是JVM用来存储对象实例和数组的主要区域。当一个类被加载到JVM中时,它的实例将在这个区域分配...
总之,Java内存溢出是复杂的问题,需要结合程序设计、JVM参数配置、垃圾收集机制和内存分析工具等多个方面进行综合分析和处理。理解这些概念并熟练运用,能有效防止和解决Java应用程序中的内存问题。
针对不同的内存溢出类型,可以通过调整JVM参数来缓解或解决问题: - **堆内存溢出**: - `-Xms`:设置初始堆大小。 - `-Xmx`:设置最大堆大小。 - 示例:`-Xms256m -Xmx512m` 表示初始堆大小为256MB,最大堆大小...
JDK 使用的是 64 位版本,配置参数为 `-Xmx3078M -Xms3078M -XX:PermSize=1024M -XX:MaxPermSize=1024M`。通过 MAT 分析发现: - **Histogram** 显示 ThreadLocal 和自定义类 `bingo.persister.dao.Daos` 占用了...
理解并掌握Android的内存管理机制,及时释放不再使用的资源,以及正确处理上下文和位图,对于开发高效、稳定的应用至关重要。开发者应时刻警惕内存泄露,通过有效的内存优化策略,确保应用在有限的内存环境下也能...
3. GC(Garbage Collection):Java的自动内存管理机制,如果GC无法有效地回收不再使用的对象,可能导致内存泄漏。 4. 类装载:大量的类加载可能导致方法区溢出,特别是使用反射或动态代理时。 解决内存溢出通常...
内存溢出(Out of Memory,OOM)是...总之,解决Eclipse运行工程时的内存溢出问题需要理解内存管理机制,合理设置JVM内存参数,并结合代码优化。通过这些方法,可以提高Eclipse的运行效率,保证大型工程的稳定运行。
JBoss内存溢出的优化是一个系统工程,涉及到JVM参数配置、代码优化、资源管理以及监控等多个方面。通过综合运用上述策略,可以显著提高JBoss服务器的稳定性和响应速度,为企业级应用提供更加可靠的服务支持。然而,...
【标题】"MyEclipse 内存溢出"所涉及的知识点主要集中在Java开发环境的配置和优化上,特别是针对大型项目或者复杂代码时可能出现的性能问题。MyEclipse是基于Eclipse的一款强大的Java集成开发环境,对于内存管理不当...
### 解决OutOfMemoryError内存溢出 在Java开发过程中,我们经常会遇到`java.lang.OutOfMemoryError`(简称OOM)的问题。这个问题的发生主要是由于JVM内存不足或程序中存在内存泄漏所引起的。本文将深入探讨OOM产生...
总结,防止Java应用程序内存溢出,关键在于理解JVM内存结构,合理配置内存参数,选择合适的垃圾收集策略,以及编写高效、无泄漏的代码。对于《我的世界》这样的大型应用,还需要考虑游戏特性和用户环境,进行针对性...
总之,Angular 4 JavaScript内存溢出问题可以通过调整V8引擎参数、优化代码结构、智能管理订阅以及使用性能监控工具等多种方式来解决。对于大型项目,保持良好的编程习惯和持续的性能优化至关重要。
然而,由于其复杂的内存管理和高并发特性,WebSphere可能会遇到内存溢出的问题,这可能导致系统性能下降,甚至服务中断。本主题将深入探讨WebSphere内存溢出的原因、诊断方法以及解决策略。 【描述】: 1. **内存...
1. **内存管理**:理解内存分配和回收机制是避免内存溢出的关键。在C/C++中,程序员需要手动管理内存,通过`malloc`和`free`来申请和释放内存,如果不当操作可能导致内存泄漏,长时间积累就会造成内存溢出。而在Java...