VM 概念模型
1:程序计数器(Program Counter Register)
(1)比喻:可以看做为线程所执行的字节码的行号显示器
(2)与线程的关系:每个线程都有自己的程序计数器
(3)作用:存放当前线程正在执行的虚拟机字节码指令地址
2:虚拟机栈(VM Stack)
帧栈
(1) 释义:每个方法从的调用,都会创建一个帧栈,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用到结束,就对应这一个帧栈的进栈与出栈。
(2) StackFlowOverError:线程请求的栈深度超过了虚拟机所允许的栈深度。
(3) OutOfMemoryErro:虚拟机动态拓展时无法申请到足够的内存。
3:本地方法栈(Native Method Stack)
(1) 和虚拟机栈不同的地方
· 虚拟机栈执行的是Java服务(字节码服务)
· 本地方法栈执行的是Native方法服务。
Native 方法是由飞Java语音上线的Java接口,如C++实现的Native方法。
二者大同小异
(2) 和虚拟机栈一样,也会抛出StackOverflowError和OutOfMemoryError异常。
4:Java堆(“垃圾堆”-Heap)
(1):所有线程共享。
(2):虚拟机启动时创建。
(3):垃圾收集器的主要管理区域(GC主要工作区域)。
唯一目的就是存放对象实例。
(4):可分为新生代和老年代,新生代又可分为Eden区、From Survivor区、To Survivor区。默认比例为8:1:1。
如图:当新生代产生A、B、C三个对象后 。
第1次GC:回收掉A,并将B和C从Eden区移动到From区。
第2次GC:回收掉B,由于C两次都未能被回收,因此转移到To区。
第3次GC:C还是未能被回收,将从To区转移到From区。
第4次GC:C又从From区转移到To区,如此反复15次后,若C还是未能被GC....
第16次GC:此时C应该在From区,将被移动到老年代。
4:方法区(Method Area)
(1):与Java堆一样,所有线程共享。
(2):用于存储虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码 等数据。