Java堆中的OutOfMemoryError错误
当JVM启动时,使用了-Xms 参数设置的对内存。当程序继续进行,创建更多对象,JVM开始扩大堆内存以容纳更多对象。JVM也会使用垃圾回收器来回收内存。当快达到-Xmx设置的最大堆内存时,如果没有更多的内存可被分配给新对象的话,JVM就会抛出java.lang.outofmemoryerror,你的程序就会当掉。在抛出 OutOfMemoryError之前,JVM会尝试着用垃圾回收器来释放足够的空间,但是发现仍旧没有足够的空间时,就会抛出这个错误。为了解决这个问题,你需要清楚你的程序对象的信息,例如,你创建了哪些对象,哪些对象占用了多少空间等等。你可以使用profiler或者堆分析器来处理 OutOfMemoryError错误。”java.lang.OutOfMemoryError: Java heap space”表示堆没有足够的空间了,不能继续扩大了。”java.lang.OutOfMemoryError: PermGen space”表示permanent generation已经装满了,你的程序不能再装在类或者再分配一个字符串了。
Java Heap dump
Heap dump是在某一时间对Java堆内存的快照。它对于分析堆内存或处理内存泄露和Java.lang.outofmemoryerror错误是非常有用的。在JDK中有一些工具可以帮你获取heap dump,也有一些堆分析工具来帮你分析heap dump。你可以用“jmap”来获取heap dump,它帮你创建heap dump文件,然后,你可以用“jhat”(堆分析工具)来分析这些heap dump。
Java中的堆空间是什么?
当Java程序开始运行时,JVM会从操作系统获取一些内存。JVM使用这些内存,这些内存的一部分就是堆内存。堆内存通常在存储地址的底层,向上排列。当一个对象通过new关键字或通过其他方式创建后,对象从堆中获得内存。当对象不再使用了,被当做垃圾回收掉后,这些内存又重新回到堆内存中。要学习垃圾回收,请阅读”Java中垃圾回收的工作原理”。
Java堆内存(heap memory)的十个要点:
1. Java堆内存是操作系统分配给JVM的内存的一部分。
2. 当我们创建对象时,它们存储在Java堆内存中。
3. 为了便于垃圾回收,Java堆空间分成三个区域,分别叫作New Generation, Old Generation或叫作Tenured Generation,还有Perm Space。
4. 你可以通过用JVM的命令行选项 -Xms, -Xmx, -Xmn来调整Java堆空间的大小。不要忘了在大小后面加上”M”或者”G”来表示单位。举个例子,你可以用 -Xmx256m来设置堆内存最大的大小为256MB。
5. 你可以用JConsole或者 Runtime.maxMemory(), Runtime.totalMemory(), Runtime.freeMemory()来查看Java中堆内存的大小。
6. 你可以使用命令“jmap”来获得heap dump,用“jhat”来分析heap dump。
7. Java堆空间不同于栈空间,栈空间是用来储存调用栈和局部变量的。
8. Java垃圾回收器是用来将死掉的对象(不再使用的对象)所占用的内存回收回来,再释放到Java堆空间中。
9. 当你遇到java.lang.outOfMemoryError时,不要紧张,有时候仅仅增加堆空间就可以了,但如果经常出现的话,就要看看Java程序中是不是存在内存泄露了。
10. 请使用Profiler和Heap dump分析工具来查看Java堆空间,可以查看给每个对象分配了多少内存。
本文来源:
http://www.csdn.net/article/2012-02-20/311988
分享到:
相关推荐
- 类定义静态概念,对象是动态实例化出来的,位于堆内存中。 - **对象创建**: - 使用`new`关键字创建对象。 - 每个对象拥有独立的成员变量存储空间,除非它们共享静态变量。 以上内容覆盖了Java SE的基础知识...
3. 内存模型:JVM内存结构(堆、栈、方法区、本地方法栈),垃圾回收机制,以及如何进行内存泄漏检查。 4. 文件与IO流:理解文件操作,熟悉输入输出流的分类及使用,掌握NIO(New IO)的使用。 三、高级篇 1. 设计...
以下是关于Java堆内存的10个要点的详细分析: 1. **堆内存的分配**: 当Java应用程序启动时,JVM会在操作系统中申请一块内存区域作为堆空间。在32位系统上,默认初始大小可能为128MB,而在64位系统上,这个值可能...
Java基础要点涵盖了语言的历史、特性、数据类型、内存管理、命名规则等多个方面,对初学者构建扎实的Java编程基础至关重要。通过理解和掌握这些核心概念,将有助于开发者在后续的Java学习和实践中更加游刃有余。
- **堆内存**:存放所有对象实例。 - **栈内存**:存储局部变量和方法调用信息。 - **垃圾回收**:自动回收不再使用的对象,避免内存泄漏。 10. **设计模式** - **单例模式**:确保一个类只有一个实例。 - **...
### Java内存对象分配过程研究 #### 一、引言 Java作为一门强大的面向对象编程语言,在实际开发过程中,对象的创建及其内存管理是至关...希望本文能够帮助开发者更好地理解和掌握Java内存管理的核心概念和技术要点。
14. **JVM优化**:堆内存设置,方法区(元空间)理解,栈内存,类加载机制,以及如何通过JMX监控JVM。 15. **编程原则与最佳实践**:DRY(Don't Repeat Yourself),KISS(Keep It Simple, Stupid),SOLID原则,...
Java 面试要点(适用于 2 年以上经验,1 年亦可) Java 是一种广泛使用的编程语言,涵盖了基础知识、JVM、并发、锁、...10. 不使用 synchronized 如何实现一个线程安全的单例 11. sleep 和 wait 12. wait 和 notify
了解Java虚拟机(JVM)的工作原理,包括堆内存、栈内存、方法区、本地方法栈等,以及垃圾回收机制,对于性能优化和问题排查非常关键。 九、设计模式 设计模式是解决常见编程问题的模板,如单例、工厂、观察者、装饰...
- 堆内存的分配策略。 - 方法区与元空间的存储机制。 - 运行时常量池的使用。 - **面试考察要点:** - 内存溢出与内存泄漏的区别。 - GC算法的种类及其优缺点。 #### 三、类加载 **3.1 类的加载过程** - **...
- **Eclipse Memory Analyzer (MAT)**:一个基于Eclipse的工具,用于分析Java堆内存快照,帮助开发者找到内存泄漏和其他性能问题。 - **VisualVM**:除了监视内存使用情况外,VisualVM还提供了线程分析、CPU使用情况...
**JAVA考试知识覆盖要点** Java作为一种广泛使用的编程语言,其在软件开发领域的应用无处不在。对于准备参加Java考试的人员来说,理解并掌握以下几个关键知识点至关重要: 1. **Java基础** - **语法**: 包括变量...