和jvm(Java Virtual Machine)
相关的内存,一般分为栈区、堆区、方法区(永久区)
等。
一、栈区
栈区是程序运行时,一个线程的私有空间;
- 局部变量区:存放该线程运行时的局部变量
- 操作数栈:局部变量数据声明先进入操作数栈,再压如入局部变量表,需要时再从局部变量表取出
- 动态链接:全局变量被方法引用时,为了 动态连接使用
- 方法出口:
- 正常退出,执行引擎遇到方法返回的字节码,将返回值传递给调用者
- 异常退出,遇到Exception,并且方法未捕捉异常,那么不会有任何返回值。
二、堆区
堆区是和java应用程序关系最密切的内存空间,几乎所有的对象和数组数据都存在其中。
-
从内存回收角度,Java堆被分为新生代和老年代;这样划分的好处是为了更快的回收内存;
新生代分为eden区、from和to区;
对大多数情况下,对象首先分配到eden区,在一次新生代回收后(gc)
,如果对象还存活,就会进入from或者to区;之后每经过一次新生代回收,如果对象还存活则它的年龄就增加1,当对象达到一定的年龄(默认15)
后,则进入老年代 -
从内存分配角度,Java堆可以划分出线程私有的分配缓冲区TLAB
(Thread Local Allocation Buffer)
;这样划分的好处是为了更快的分配内存。
三、方法区
方法区主要存放的是已被虚拟机加载的类信息、常量、静态变量、编译器编译后的代码等数据。GC在该区域出现的比较少;
堆、方法区是线程共享的,在Java虚拟机中只有一个堆、一个方法栈。并在JVM启动的时候就创建,JVM停止才销毁。
网友评论