jvm虚拟机阅读笔记

jvm虚拟机阅读笔记_第1张图片
在jvm用信运营内存中包括了以下几部分:

  1. 程序计数器(线程私有)
    程序计数器是内存装很小的一块,展现方式有两种:一种是这种方法开始的偏移量,也就是betecode index,简称bci,另一种是Java执行的字节码指令在内存中的地址,也就是bytecode point ,简称bcp。
    在jvm的解释器运行的时候,通过程序计数器来取出下一条指令,用来执行java程序的分支、循环、跳转、异常处理、线程恢复等基础功能。如果当前正在执行的是本地方法,则存储的为null
  2. 虚拟机栈(线程私有)
    虚拟机栈和程序计数器一样,也是线程私有的。虚拟机栈在Java执行一个方法开始的时候创建一个栈帧,会把方法的一些信息( 存储局部变量表、操作数栈、动态连接、方法出口等信息)放到栈中,在方法执行完毕之后从栈中弹出。在调用这个方法的时候,如果没有结束节点,那么就会报栈溢出。
    虚拟机栈中的另一部分是局部变量表局部变量表包括了已知的基础数据类型、对象引用和返回类型的指令地址。局部变量表默认存储单位(槽)为32个比特,而对于long类型和double类型会占用两个基础大小。
  3. 本地方法栈(线程私有)
    本地方法栈和java虚拟机栈一样,本地方法栈执行的是本地方法,虚拟机栈执行的是java方法,同样也会报出栈溢出。
  4. java堆(共有)
    Java堆是Java虚拟机中最大的一块内存,在java虚拟中,所有的线程都共享着这一块内存,所有的对象的实例都在堆中。而java堆就是gc回收的主要区域。
    对于垃圾回收来说,有一个经典分派,分为新生代老年代和永久代对于新生代来说又分为两部分,一部分eden,另一部分为survuvor,其中survuvor为两分用于gc垃圾回收。
  5. 方法区(共有)
    Java的方法区和Java的堆一样,是所有线程共享的一块内存区域存储。虚拟机加载的类型信息、常量、静态变量、即时编译后的代码缓存等数据。
    在jdk8以前,方法区的数据保存在了永久代上,但是在jdk8,把方法区的数据保存到了本地内存中。在jdk7把字符串常量池、静态变量等移出(学习J9,JRockit)
  6. 运行时常量(共有)
    运行时常量是方法区的一部分,主要保存了常量,池表和编译器生成的字面量和符号引用。对于运行时常量池,是可以动态扩充的,对于内存满了以后内存溢出
  7. 直接内存
    直接内存是在1.4之后出现的,为了满足Java的io需求,加入了NIO,通过DirectByteBuffer直接使用本地内存,跳过了Java虚拟机。

你可能感兴趣的:(笔记)