【关于Java的堆空间和堆内存】

      当我开始Java编程时,我不知道什么是Java堆或Java中的堆空间,我甚至不知道Java中的对象是在哪里创建的,这是我开始进行专业编程时遇到的Tomcat 中出现 java.lang.OutOfMemoryError错误,然后我意识到什么是 Java 中的堆或 Java 堆空间。大多数程序员都会遇到这种情况,因为学习语言很容易,但学习基础知识却很困难,因为没有正式的过程可以教你编程的每一个基础知识,以及揭示编程秘密的经验和工作。


      对于Java开发者来说,了解Java中的Heap、设置Java堆空间的大小、处理Java堆空间OutOfMemoryError、分析堆转储非常重要。

Java中的堆空间是什么?

当 Java 程序启动时,Java 虚拟机从操作系统获取一些内存。Java 虚拟机或 JVM 使用此内存来满足其所有需求,并且此内存的一部分称为 java 堆内存。

Java中的堆一般位于地址空间的底部并向上移动。每当我们使用 new 运算符或通过任何其他方式创建对象时,都会从堆中为该对象分配内存,当对象死亡或被垃圾回收时,内存会返回到 Java 中的堆空间。

【关于Java的堆空间和堆内存】_第1张图片

Java 堆和垃圾收集

众所周知,对象是在堆内存中创建的,垃圾收集是一个从 Java 堆空间中删除死对象并将内存返回到 Java 堆的过程。为了进行垃圾收集,堆被分为三个主要区域,分别称为新生代、老一代或终身代以及永久代。

新一代Java堆是Java堆内存的一部分,其中存储了新创建的对象,在应用程序的过程中,许多对象被创建并死亡,但这些对象仍然存在,它们被Java垃圾收集器线程移至旧代或终身代。主要或完全垃圾收集。 
Java堆的Perm空间是JVM存储有关类和方法的元数据、字符串池和类级别详细信息的地方。

 

Java 堆中的 OutOfMemoryError

当 JVM 启动时,JVM 堆空间等于 -Xms 参数指定的堆的初始大小,随着应用程序的进展,会创建更多对象,并且堆空间会扩展以容纳新对象。JVM 还会定期运行垃圾收集器,以从死亡对象中回收内存。

JVM 将 Java 中的堆扩展到接近 -Xmx 指定的最大堆大小,并且如果没有更多内存用于在 java 堆中创建新对象,JVM 会抛出 java.lang.OutOfMemoryError 并且您的应用程序将终止。

在抛出OutOfMemoryError No Space in Java Heap之前,JVM 会尝试运行垃圾收集器来释放任何可用空间,但即使在 Java 堆上没有太多可用空间之后,它也会导致 OutOfMemoryError 。

要解决此错误,你需要了解应用程序对象配置文件,即您正在创建什么类型的对象、哪些对象占用了多少内存等。你可以使用探查器或堆分析器来排除 Java 中的 OutOfMemoryError 错误。“ java.lang.OutOfMemoryError : Java heap space”错误信息表示Java堆没有足够的空间,无法进一步扩展,而“java.lang.OutOfMemoryError: PermGen space”错误信息则在Java Heap永久代发生时出现:已满,应用程序将无法加载类或分配实习字符串。

【关于Java的堆空间和堆内存】_第2张图片

总结:关于Java堆空间的10点

1. Java堆内存是操作系统分配给JVM的内存的一部分。
2. 每当我们创建对象时,它们都是在 Java 的堆中创建的。
3. 为了进行垃圾回收,Java 堆空间被分为三个区域或代,称为“新生代”、“旧代”或“永久代”或“永久空间”。永久代是在热点 JVM 中的 full gc 期间进行垃圾收集的。
4. 你可以使用 JVM 命令行选项 - Xms、-Xmx和-Xmn来增加或更改 Java 堆空间的大小。不要忘记在指定尺寸后添加单词“M”或“G”以表示 Mega 或 Gig。例如,您可以通过执行以下命令 java -Xmx256m HelloWorld 将 java 堆大小设置为 258MB。 
5. 你可以使用 JConsole 或Runtime.maxMemory()、Runtime.totalMemory()、Runtime.freeMemory()来以编程方式查询 Java 中的堆大小。
6. 你可以使用命令“jmap”来获取 Java 中的堆转储,并使用“jhat”来分析该堆转储。 
7. Java堆空间与堆栈不同,堆栈用于存储调用层次结构和局部变量。 
8. Java垃圾收集器负责从死亡对象中回收内存并返回到Java堆空间。
9. 当你得到java.lang.OutOfMemoryError 时不要惊慌,有时这只是增加堆大小的问题,但如果它反复出现,那么寻找Java 中的内存泄漏。 
10. 使用Profiler和Heap dump Analyzer工具了解Java Heap空间以及分配给每个对象的内存量。



 

你可能感兴趣的:(java,开发语言)