Java自动内存管理机制

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java⾃动内存管理机制
1、运⾏时数据区域划分
2、程序计数器
作⽤:可以看做是当前线程所执⾏的字节码的⾏号指⽰器。

解释:字节码指⽰器就是通过改变程序计数器的值来指定下⼀条需要执⾏的指令。

分⽀,循环等基础功能就是依赖程序计数器来完成的。

说明:由于java虚拟机的多线程是通过轮流切换并分配处理器执⾏时间来完成,⼀个处理器同⼀时间只会执⾏⼀条线程中的指令。

为了线程恢复后能够恢复正确的执⾏位置,每条线程都需要⼀个独⽴的程序计数器,以确保线程之间互不影响。

所以程序计数器是“线程私有”的内存。

注明:程序计数器区域是Java虚拟机中唯⼀没有定义OutOfMemory异常的区域
3、Java虚拟机栈
作⽤:虚拟机栈描述的是Java⽅法执⾏的内存模型
说明:每个⽅法被执⾏的时候都会创建⼀个栈帧⽤于存储局部变量表,操作栈,动态链接,⽅法出⼝等信息。

每⼀个⽅法被调⽤的过程就对应⼀个栈帧在虚拟机栈中从⼊栈到出栈的过程。

异常:(1)线程请求的栈深度⼤于虚拟机允许的栈深度,将抛出StackOverflowError。

(2)虚拟机栈空间可以动态扩展,当动态扩展是⽆法申请到⾜够的空间时,抛出OutOfMemory异常。

注明:Java虚拟机栈也是线程私有的,⽣命周期与线程相同
4、Java本地⽅法栈
说明:本地⽅法栈与Java栈的作⽤和原理⾮常相似。

区别只不过是Java栈是为执⾏Java⽅法服务的,⽽本地⽅法栈则是为执⾏本地⽅法(Native Method)服务的。

在JVM 规范中,并没有对本地⽅发展的具体实现⽅法以及数据结构作强制规定,虚拟机可以⾃由实现它。

在HotSopt虚拟机中直接就把本地⽅法栈和Java栈合⼆为⼀
注明:本地⽅法栈中也会抛出StackOverflowError和OutOfMemory异常。

5、Java堆
作⽤:Java 中的堆是 JVM 所管理的最⼤的⼀块内存空间,主要⽤于存放各种类的实例对象。

说明:在 Java 中,堆被划分成两个不同的区域:
(1)新⽣代 ( Young )。

新⽣代 ( Young ) ⼜被划分为三个区域:Eden、From Survivor、To Survivor
(2)⽼年代 ( Old )。

⽬的:这样划分的⽬的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。

注明:各个线程共享的内存区域
6、⽅法区、运⾏时常量池、直接内存
(1)⽅法区也是线程共享的区域,⽤于存储已经被虚拟机加载的类信息,常量,静态变量
(2)运⾏时常量池也是⽅法区的⼀部分。

(3)直接内存并不是虚拟机运⾏时数据区的⼀部分,也不是Java迅疾规范中定义的内存区域。

注明:⽅法区、直接内存⽆法满⾜内存分配需求时将抛出OutOfMemoryError异常。

相关文档
最新文档