深入理解java虚拟机二,内存管理机制

java 虚拟机自动内存管理。

java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同区域

1 程序计数器

每个线程都有一个独立的计数器,用来指示需要执行的字节码的位置。

2 虚拟机栈

虚拟机栈是用来描述java方法执行的内存模型,每个方法被执行的时候都会同时创建一个栈帧用于储存局部变量表,操作栈,动态链接,方法出口等信息。

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

虚拟机栈线程私有,声明周期和线程一样。

局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,

在方法运行期间不会改变局部变量表的大小

当线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常

当虚拟机栈自动扩展时无法申请到足够内存时会抛出OutOfMemoryError异常

3 本地方法栈

与虚拟机栈作用类似,不过是作用在本地方法上

4 java堆

用途是存放对象实例,在虚拟机启动的时候创建,被所有线程共享。

根据分代收集算法,分为新生代和老年代。

java堆可以处于物理上不连续的内存空间中。

5 方法区

被所有线程共享。用于存储已被虚拟机加载的类信息,常量,静态常量,即时编译器编译后的代码等数据。

垃圾收集行为在这个区域是比较少出现的,这个区域的内存回收目标主要是针对常量池和对类型的卸载。

6 运行时常量池

方法区的一部分,Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项是常量池。

用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载之后存放到方法区的运行时常量池。

7 直接内存

本机的直接内存,不受JAVA堆大小限制。

     

原文地址:https://www.cnblogs.com/keeley/p/4041079.html