之前我写了几篇有关java垃圾收集的文章之后,我收到了很多电子邮件,请求解释java堆空间,java栈内存,java中的内存分配以及它们之间的区别。
您可能在java,java ee书籍和教程中看到很多有关堆和变量内存的参考,但是几乎没有就程序而言完全解释堆和栈的内存分配的。
java运行时使用java堆空间为对象和jre类分配内存。每当我们创建任何对象时,它总是在堆空间中创建。
垃圾回收在堆内存上运行以释放没有任何引用的对象使用的内存。在堆空间中创建的任何对象都具有访问权限,并且可以从应用程序的任何位置进行引用。
java stack内存用于执行线程。它们包含短期的方法特定值,以及从该方法引用的对堆中其他对象的引用。
每当调用方法时,都会在磁盘存储中创建一个新块,以容纳该方法的本地原始值并引用该方法中的其他对象。
方法结束后,该块将立即立即变为未使用状态,用作下一个方法使用。
与堆内存分配,栈内存的大小要小一点。
让我们用一个简单的程序来了解堆和交替的内存使用情况。
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 }
下图显示了与上述程序有关的堆空间和栈内存,以及如何将其用作存储原始,对象和引用变量。
让我们看一下程序的执行步骤。
根据以上解释,我们可以轻松得出以下堆空间和栈内存的区别。
java.lang.stackoverflowerror
引发,而如果堆内存已满,则将引发java.lang.outofmemoryerror: java heap space
错误。就java应用程序而言,这就是java堆空间与栈内存的全部,我希望它能在执行任何java程序时消除您对内存分配的疑问。
“不积跬步,无以至千里”,希望未来的你能:有梦为马 随处可栖!加油,少年!
关注公众号:「java 知己」,每天更新java知识哦,期待你的到来!
如对本文有疑问, 点击进行留言回复!!
荐 深入理解Java中的BigInteger和 BigDecimal,再也不怕面试了
tomact正常启动,但是在日志文件报错java.lang.NoClassDefFoundError: java/util/logging/Logger
servlet整合quartz:servlet中使用quartz,服务器启动时加载任务
荐 Java——集合中的Map接口通过HashMap类实现一些常用的方法
SpringBoot整合mybatis访问时报错Invalid bound statement (not found)
网友评论