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"); } } }
在上面的示例中,我们有两个线程:
主线程
子线程
执行方法后,将从堆栈中删除相应的方法条目。
执行完所有方法调用后,堆栈将变为空,并且该空堆栈将在终止线程之前被JVM销毁。
堆栈内存不是全局的(即一个堆栈变量或方法不能在另一堆栈中使用)。
堆栈中的每个条目都称为堆栈框架或激活记录。
JVM为每个线程创建一个单独的运行时堆栈(即,存储在堆栈中的数据仅可用于相应的线程,而另一个线程无法访问该数据,这意味着数据是该线程专用的,因此我们将其称为线程安全的)。
堆叠框架由三部分组成:
局部变量数组:
它包含方法的所有参数(或参数)和局部变量。
数组中的每个块均为4个字节。int,float和reference的值仅占用一个块,而double和long的值占用两个块和字节,short和char将在存储前转换为int。
操作数堆栈:
它是执行中间数据或结果的堆栈。
帧数据:它包含常量和对异常表的引用,在异常情况下,这些表提供了相应的捕获块信息。
2)Java中的堆内存
堆内存将在JVM启动时创建。
堆内存需要“new”关键字。
堆内存包含对象,而对象包含实例数据(即,堆包含对象和实例数据)。
堆内存中存储的数据不是线程安全的(即一个线程的对象将由另一线程共享,并且数据不是私有的)。
只允许一个堆内存(与堆栈内存不同),该内存将由多个线程共享。
我们可以创建Runtime对象,一旦获得Runtime对象,我们就可以调用特定于Runtime的方法,
方法:maxMemory()
,totalMemory()
,freeMemory()
示例:
Runtime r = Runtime.getRuntime(); r.maxMemory(); r.totalMemory(); r.freeMemory();
说明:
maxMemory():返回分配给堆的最大内存的字节数。
totalMemory():返回分配给堆的总内存字节数。
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