Java内存区域

运行时数据区域

1、栈 :存放值

“线程私有”且生命周期与线程相同。

每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机中从入栈到出栈的过程。

 

2、Java堆:存放对象

是虚拟机所管理的内存中最大的一块,被所有线程共享的一块区域,在虚拟机启动时创建,唯一目的是存放对象实例。

Java堆是垃圾收集器管理的内存区域。

Java堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续。

3、方法区

与Java堆相似,是线程共享的内存区域,不过是用于存储被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。

方法区无法满足新的内存分配需求时,将抛出OutOfMemoryError异常。

4、程序计数器 :存放位置

Java虚拟机的多线程是通过线程轮流切换、分配处理器执行时间的方式来实现的,在任何一个确定是时刻,一个处理器(对于多核处理器来说都是一个内核)都只会执行一条线程中的指令。

所以为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,这类内存区域称为”线程私有内存“。

5、本地方法栈

与虚拟机栈所发挥的作用是相似的,区别是虚拟机栈为虚拟机执行Java方法(字节码)服务,而本地方法栈则是为虚拟机使用到本地(Native)方法服务。

例子:

变量a和s的都是对对象的引用,它们在栈里开辟了空间存变量引用对象的地址。当执行完毕之后,栈遵循先进后出原则自动删除a、s、x。但是堆里面的String和A此时不会被清理,因为不知道是否还会被其他变量引用,清理堆要用到垃圾回收机制(GC)。

原文地址:https://www.cnblogs.com/codercql/p/13435653.html