以前我写了几篇有关Java垃圾收集的文章以后,我收到了不少电子邮件,请求解释Java堆空间,Java栈内存,Java中的内存分配以及它们之间的区别。
java
您可能在Java,Java EE书籍和教程中看到不少有关堆和变量内存的参考,可是几乎没有就程序而言彻底解释堆和栈的内存分配的。程序员
Java运行时使用Java堆空间为对象和JRE类分配内存。每当咱们建立任何对象时,它老是在堆空间中建立。面试
垃圾回收在堆内存上运行以释放没有任何引用的对象使用的内存。在堆空间中建立的任何对象都具备访问权限,而且能够从应用程序的任何位置进行引用。算法
Java Stack内存用于执行线程。它们包含短时间的方法特定值,以及从该方法引用的对堆中其余对象的引用。spa
每当调用方法时,都会在磁盘存储中建立一个新块,以容纳该方法的本地原始值并引用该方法中的其余对象。线程
方法结束后,该块将当即当即变为未使用状态,用做下一个方法使用。code
与堆内存分配,栈内存的大小要小一点。视频
让咱们用一个简单的程序来了解堆和交替的内存使用状况。对象
package com.journaldev.test; public class Memory { public static void main(String[] args) { // Line 1 int i=1; // Line 2 Object obj = new Object(); // Line 3 Memory mem = new Memory(); // Line 4 mem.foo(obj); // Line 5 } // Line 9 private void foo(Object param) { // Line 6 String str = param.toString(); //// Line 7 System.out.println(str); } // Line 8 }
下图显示了与上述程序有关的堆空间和栈内存,以及如何将其用做存储原始,对象和引用变量。
blog
让咱们看一下程序的执行步骤。
根据以上解释,咱们能够轻松得出如下堆空间和栈内存的区别。
java.lang.StackOverFlowError
引起,而若是堆内存已满,则将引起java.lang.OutOfMemoryError: Java Heap Space
错误。就Java应用程序而言,这就是Java堆空间与栈内存的所有,我但愿它能在执行任何Java程序时消除您对内存分配的疑问。
“不积跬步,无以致千里”,但愿将来的你能:有梦为马 随处可栖!加油,少年!
关注公众号:「Java 知己」,天天更新Java知识哦,期待你的到来!