虚拟机内存结构

程序计数器:
        程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。
        如果线程正在执行一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是native方法,这个计数器值为空。
虚拟机栈:
        每个方法在执行的同时都会创建一个栈桢,栈桢用来存储局部产量、操作数栈、动态链接、方法出口等信息。每个方法从开始到结束的过程,就对应着栈桢在虚拟机栈中入栈到出栈的过程。局部产量在编译Java时就会分配好内存,long和dubble这种64位的基本数据类型会分配2个局部产量空间,其他分配1个。
        栈深度是栈桢中的可用内存大小,如果线程请求的栈深度大于虚拟机所允许的深度,会抛出StackOverflowError。
 
本地方法栈:
        本地方法栈和虚拟机栈的作用差不多,区别是虚拟机栈为虚拟机执行的Java方法服务,而本地方法栈是为虚拟机使用的Native方法服务。
 
Java堆:
        Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建,几乎所有的对象实例都存放在这里。
        JAVA堆是垃圾回收器管理的主要区域,从内存回收的角度看,由于收集器基本都采用分代收集算法,所以Java堆可以细分为:新生代和老生代,再细致一点可以分为Eden空间、Form Survior空间、To Survior空间等。
        虚拟机大小可以通过-Xmx -Xms控制
 
方法区:
        方法区与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
运行时常量池:
        方法区的一部分,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。运行时常量池具备动态性,可以在运行期间使用String.intern()方法将新的常量放入池中
 
posted @ 2019-06-04 09:35  沟渠映明月  阅读(233)  评论(0编辑  收藏  举报