【自动内存管理机制】(1)Java内存区域(方法区、虚拟机栈、本地方法栈、堆、程序计数器)与内存溢出异常

时间:2022-12-27 21:41:43

自动内存管理机制概述:

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙, 墙外面 的人想进去,墙里面的人却想出来。

1、对于C/C++开发人员,在内存管理领域,他们即使拥有最高权力的皇帝,也是也是从事最基础工作的劳动人民。

2、对于Java开发人员,在虚拟机的自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,而且不容易出现内存泄漏和内存溢出的问题。

(一)运行时数据区域:

Java虚拟机运行时数据区:

【自动内存管理机制】(1)Java内存区域(方法区、虚拟机栈、本地方法栈、堆、程序计数器)与内存溢出异常

可以看出,Java虚拟机运行时数据区所分的区域有:

①方法区(Method Area)

②虚拟机栈(VM stack)

③本地方法栈(Native Method Stack)

④堆(Heap)

⑤程序计数器(Program Couter Regsiter)

其中:

方法区和堆是由所有线程共享的数据区;

虚拟机栈、本地方法栈、程序计数器是线程隔离的数据区。

程序计数器:

程序计数器:Program Counter Register。

定义为:

是一块较小的内存空间。

作用:

它的作用可以看作是当前线程所执行的字节码的行号指示器。

对于计数器的详细说明:

(1)字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成。

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

(3)因此,为了线程切换后能恢复到正确的的执行位置,每条线程都需要一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。

(4)如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;

(5)如果正在执行的是native方法,这个计数器值则为(underfine的)。

(6)因此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemeryError

Java虚拟机栈:

本地方法栈:

Java堆:

方法区:

(二)运行时常量池: