Java 堆空间与堆栈 - Java 中的内存分配

某些时候,我写了一些关于Java Garbage Collection(/community/tutorials/java-jvm-memory-model-memory-management-in-java)和 [Java is Pass by Value](/community/tutorials/java-is-pass-by-value-and-not-pass-by-referenceJava is Pass by Value and Not Pass by Reference)的帖子。

Java Heap 空间

Java Heap 空间被 Java 运行时用来分配内存到 Objects 和 JRE 类。 每当我们创建一个对象时,它总是在 Heap 空间中创建的。

Java Stack 记忆

Java Stack 记忆是用来执行一个线程的。它们包含方法特定的值,这些值是短寿命的,并且是引用从方法中引用的堆积中的其他对象的引用。 Stack 记忆总是以 LIFO (Last-In-First-Out) 顺序引用。 每当方法被召唤时,在堆积记忆中会创建一个新的块,以便该方法存储本地原始值和引用该方法中的其他对象。

Java 程序中的堆积和堆积内存

让我们用一个简单的程序来理解堆积和堆积内存的使用。

 1package com.journaldev.test;
 2
 3public class Memory {
 4
 5    public static void main(String[] args) { // Line 1
 6    	int i=1; // Line 2
 7    	Object obj = new Object(); // Line 3
 8    	Memory mem = new Memory(); // Line 4
 9    	mem.foo(obj); // Line 5
10    } // Line 9
11
12    private void foo(Object param) { // Line 6
13    	String str = param.toString(); //// Line 7
14    	System.out.println(str);
15    } // Line 8
16
17}

The below image shows the Stack and Heap memory with reference to the above program and how they are being used to store primitive, Objects and reference variables. java memory management, java heap space, heap vs stack, java heap, stack vs heap Let's go through the steps of the execution of the program.

  • 联合国 一旦我们运行这个程序,它会把所有的跑步时间课都加载到Heap空间. 当在一行找到主()方法时, Java 运行时会创建堆栈内存, 供主( ) 方法线程使用.
  • 我们在2号线创建原始本地变量,因此它创建并存储在主()方法的堆栈内存中.
  • 由于我们在三行中创建一个对象,它在堆积的内存中创建,堆积的内存中包含了它的参考. 当我们在第4行创建内存对象时会发生类似的过程.
  • 现在,当我们把foo () 方法叫做 第 5 行时, 堆栈上方的块会被创建出来, 用于 foo () 方法 。 自兹 Java是通过值,在第6行的 foo () 堆栈块中创建了对对象的新引用. (_) ( )* 第7行创建了字符串,它进入了string pool "什么是爪哇弦池?"). 在堆放空间中,并在 foo () 堆放空间中创建引用 。
  • foo () 方法在第8行被终止, 此时分配给 foo () 堆放的内存块会变成自由 。
  • 在第9行,主()方法终止,为主()方法创建的堆栈内存被销毁. 另外,程序结束于此行,因此Java Runtime释放出所有内存并结束程序的执行. (_) (英语)

Java堆积空间和堆积内存的区别

基于上述解释,我们可以很容易地得出下列堆积和堆积内存之间的差异。

  1. 联合国 堆栈内存被应用程序的所有部分所使用,而堆栈内存则只被一个执行线程所使用.
  2. 每当一个物体被创建时,它总是被存储在Heap空间中,堆栈内存中包含它的引用. 堆栈内存仅包含本地原始变量和堆积空间中对象的参考变量.
  3. 堆积中存储的物体可以全球访问,而堆积内存不能被其他线程访问.
  4. 堆栈的内存管理是用LIFO的方式完成的,而Heap内存中则比较复杂,因为它被全球使用. 平时记忆分为"永生","老生"等,详见"贾瓦垃圾收集"(/社区/道教/java-jvm-memory-model-memory-management-in-java). (英语). 5. 堆积内存是短寿命的,而堆积内存从一开始一直活到应用程序执行结束.
  5. 我们可以使用**-Xms-Xmx** JVM选项来定义堆积内存的起动大小和最大大小. 我们可以使用**-Xs**来定义堆栈内存大小.
  6. 当堆栈内存满载时, Java 运行时会抛出"java.lang.Stack OverFlowError",而如果堆栈内存满载,则会抛出"java.lang.OutOf MemoryError: Java Heap Space 错误.
  7. 与Heap内存相比,堆叠内存大小要小得多. 由于内存分配(LIFO)简单,与堆积内存相比,堆积内存非常快. ( (英语)

就 Java 应用而言,这就是 Java Heap Space vs Stack Memory 的全部,我希望在运行任何 java 程序时,它会清除您对内存分配的疑虑。

链接: https://en.wikipedia.org/wiki/Java_memory_model

Published At
Categories with 技术
comments powered by Disqus