Java中的堆和堆栈内存有什么区别?

1)Java中的堆栈内存

  • 对于堆栈内存,JVM在线程实例化(创建)时为每个单独的线程创建一个单独的运行时堆栈。

  • 堆栈内存不需要“ new”关键字。

  • 该线程和方法执行的每个方法调用将存储在相应的运行时堆栈中(即,新创建的线程负责调用其方法,并且该方法实例化时,方法条目将存储在所需的运行时堆栈中)。

示例

class ChildThread extends Thread{

	public void run(){
		System.out.println("I am in child thread");
	}

}

class MainThread{
	public static void main(String[] args){
		ChildThread ct = new ChildThread();
		ct.start(); 

		public static void m1(){
			System.out.println("I am in main thread");
		}
	}
}

在上面的示例中,我们有两个线程:

  1. 主线程

  2. 子线程

Child的运行时堆栈Main的运行时堆栈
run()m1()方法

main()方法


  • 执行方法后,将从堆栈中删除相应的方法条目。

  • 执行完所有方法调用后,堆栈将变为空,并且该空堆栈将在终止线程之前被JVM销毁。

  • 堆栈内存不是全局的(即一个堆栈变量或方法不能在另一堆栈中使用)。

  • 堆栈中的每个条目都称为堆栈框架或激活记录。

  • JVM为每个线程创建一个单独的运行时堆栈(即,存储在堆栈中的数据仅可用于相应的线程,而另一个线程无法访问该数据,这意味着数据是该线程专用的,因此我们将其称为线程安全的) 。

堆叠框架由三部分组成:

  1. 局部变量数组:

    • 它包含方法的所有参数(或参数)和局部变量。

    • 数组中的每个块均为4个字节。int,float和reference的值仅占用一个块,而double和long的值占用两个块和字节,short和char将在存储前转换为int。

  2. 操作数堆栈:

    • 它是执行中间数据或结果的堆栈。

    • 帧数据:它包含常量和对异常表的引用,在异常情况下,这些表提供了相应的捕获块信息。

2)Java中的堆内存

  • 堆内存将在JVM启动时创建。

  • 堆内存需要“ new”关键字。

  • 堆内存包含对象,而对象包含实例数据(即,堆包含对象和实例数据)。

  • 堆内存中存储的数据不是线程安全的(即一个线程的对象将由另一线程共享,并且数据不是私有的)。

  • 只允许一个堆内存(与堆栈内存不同),该内存将由多个线程共享。

  • 我们可以创建Runtime对象,一旦获得Runtime对象,我们就可以调用特定于Runtime的方法,

方法: maxMemory()totalMemory()freeMemory()

示例:

    Runtime r = Runtime.getRuntime();

    r.maxMemory();
    r.totalMemory();
    r.freeMemory();

说明:

  1. maxMemory():返回分配给堆的最大内存的字节数。

  2. totalMemory():返回分配给堆的总内存字节数。

  3. freeMemory():返回存在于堆中的可用内存的字节数。

示例

class Heap{

	public static void main(String[] args){
		Runtime r = Runtime.getRuntime();
		
		long max_memory = r.maxMemory();
		long total_memory = r.totalMemory();
		long free_memory = r.freeMemory();
		
		System.out.println(" Maximum Memory in bytes " + max_memory);
		System.out.println(" Total Memory in bytes " + total_memory);
		System.out.println(" Free Memory in bytes " + free_memory);
	} 

}

输出:

D:\Java Articles>java Heap
Maximum Memory in bytes 1888485376
Total Memory in bytes 128974848
Free Memory in bytes 127611672