JVM-内存模型

 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区,将被移动到老年代。

5:方法区(Method Area)

  (1):与Java堆一样,所有线程共享。

  (2):用于存储虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码 等数据。

原文地址:https://www.cnblogs.com/zgq7/p/12459926.html