美文网首页
Java堆空间和堆栈!!!

Java堆空间和堆栈!!!

作者: 程序媛小白 | 来源:发表于2022-02-28 17:57 被阅读0次

Java堆空间

Java运行时空间由Java运行时用于为Objects和JRE类分配内存。每当我们创建任何对象时,它总是在堆空间中创建。

垃圾收集在堆内存上运行,以释放没有任何引用的对象使用的内存。在堆空间中创建的任何对象都具有全局访问权限,可以从应用程序的任何位置引用。

Java堆栈内存

Java堆栈内存用于执行线程。它们包含特定于方法的特定值,以及对从该方法引用的堆中其他对象的引用。

堆栈存储器始终以LIFO(后进先出)顺序引用。每当调用一个方法时,都会在堆栈内存中创建一个新块,以便该方法保存本地原始值并引用该方法中的其他对象。

方法结束后,块将变为未使用状态,并可用于下一个方法。

与堆内存相比,堆栈内存大小非常小。

Java程序中的堆和堆栈内存

让我们通过一个简单的程序来理解堆和堆栈的内存使用情况。

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}

下图显示了堆栈和堆内存,参考上述程序以及它们如何用于存储基元,对象和引用变量。

让我们来完成程序的执行步骤:

1、一旦我们运行该程序,它就会将所有运行时类加载到堆空间中。当在第1行找到main()方法时,Java Runtime会创建要由main()方法线程使用的堆栈内存。

2、我们在第2行创建原始局部变量,因此它被创建并存储在main()方法的堆栈内存中。

3、由于我们在第3行创建了一个Object,它在堆内存中创建,堆栈内存包含它的引用。当我们在第4行创建Memory对象时,会发生类似的过程。

4、现在,当我们在第5行调用foo()方法时,会创建堆栈顶部的块以供foo()方法使用。由于Java是按值传递的,因此在第6行的foo()堆栈块中创建了对Object的新引用。

5、在第7行创建一个字符串,它在堆空间的String Pool中,并在foo()堆栈空间中为它创建一个引用。

6、foo()方法在第8行终止,此时在堆栈中为foo()分配的内存块变为空闲。

7、在第9行中,main()方法终止,并且为main()方法创建的堆栈内存被销毁。程序也在此行结束,因此Java Runtime释放所有内存并结束程序的执行。

Java堆空间和堆栈内存之间的区别

基于以上解释,我们可以很容易地得出Heap和Stack内存之间的以下差异:

1、堆内存由应用程序的所有部分使用,而堆栈内存仅由一个执行线程使用。

2、每当创建一个对象时,它总是存储在堆空间中,而堆栈存储器包含对它的引用。堆栈内存仅包含堆空间中对象的本地原始变量和引用变量。

3、存储在堆中的对象是全局可访问的,而其他线程无法访问堆栈内存。

4、堆栈中的内存管理以LIFO方式完成,而在堆内存中则更复杂,因为它是全局使用的。堆内存分为Young-Generation,Old-Generation等

5、堆栈内存是短暂的,而堆内存从应用程序执行的开始到结束都存在。

6、我们可以使用-Xms和-Xmx JVM选项来定义堆内存的启动大小和最大大小。我们可以使用-Xss来定义堆栈内存大小。

7、当堆栈内存已满时,Java运行时抛出,java.lang.StackOverFlowError而如果堆内存已满,则抛出java.lang.StackOverFlowError而如果堆内存已满,则抛出java.lang.OutOfMemoryError: Java Heap Space错误。

8、与堆内存相比,堆栈内存大小非常小。由于内存分配(LIFO)的简单性,与堆内存相比,堆栈内存非常快。

就Java应用程序而言,这就是Java Heap Space vs Stack Memory的全部内容。

Java学习视频

Java基础:

Java300集,Java必备优质视频_手把手图解学习Java,让学习成为一种享受

Java项目:

【Java游戏项目】1小时教你用Java语言做经典扫雷游戏_手把手教你开发游戏

【Java毕业设计】OA办公系统项目实战_OA员工管理系统项目_java开发

相关文章

  • Java堆空间和堆栈!!!

    Java堆空间 Java运行时空间由Java运行时用于为Objects和JRE类分配内存。每当我们创建任何对象时,...

  • c#中的堆与栈

    简介:我们把内存分为堆空间和栈空间线程堆栈:简称栈 Stack 栈空间比较小,但是读取速度快托管堆:...

  • java学习第一课 一切都是对象

    1.堆栈与堆的关系:首先他们都位于RAM中,使用堆栈时,Java系统必须知道所有在堆栈中项目的生命周期,而在堆中不...

  • 堆、栈

    栈, 也叫堆栈 堆和栈的区别: 堆栈空间分配区别:1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,...

  • 堆栈 存储空间

    参考文献 iOS--------对堆、栈 存储空间的理解 局部变量、 全局变量、 堆、 堆栈、 静态和全局 iOS...

  • JAVA内存模型-深入理解CPU-STACK内存走向

    JAVA 内存模型-堆和栈: 堆栈存储结构 堆 存放运行时创建的对象、数组。为JVM的主内存,为所有线程共享。 栈...

  • Java数据结构的热点问题

    1.对Java堆栈的理解 JVM内存中两个重要的空间,一种栈内存,一种堆内存 在方法中定义的一些基本类型的变量和对...

  • Java堆栈方法区

    JAVA 堆栈 堆 方法区 解析[https://www.cnblogs.com/eason-chan/p/364...

  • java 堆栈

    参考文章:1.JAVA 堆栈 堆 方法区 静态区 final static 内存分配 详解2.java里的静态成员...

  • JVM:堆、栈、方法区

    堆中内存划分Java堆是和Java应用程序关系最密切的内存空间,几乎所有的对象都放在其中,并且Java堆完全是自动...

网友评论

      本文标题:Java堆空间和堆栈!!!

      本文链接:https://www.haomeiwen.com/subject/wnnlrrtx.html