乐趣区

关于jvm虚拟机:JAVA基础之JVM内存区域

明天开始温习 JVM 的常识了,看一遍忘一遍,再看一遍再忘一遍。。。。

  1. 程序计数器(Program Counter Register)是一块较小的内存空间,它能够看作是以后线程所执行的字节码的行号指示器。
  2. Java 虚拟机栈(Java Virtual Machine Stack)也是线程公有的,它的生命周期与线程雷同。虚拟机栈形容的是 Java 办法执行的线程内存模型:每个办法被执行的时候,Java 虚拟机都会同步创立一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动静连贯、办法进口等信息。每一个办法被调用直至执行结束的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。局部变量表寄存了编译期可知的各种 Java 虚拟机根本数据类型(boolean、byte、char、short、int、float、long、double)、对象援用(reference 类型,它并不等同于对象自身,可能是一个指向对象起始地址的援用指针,也可能是指向一个代表对象的句柄或者其余与此对象相干的地位)和 returnAddress 类型(指向了一条字节码指令的地址)。
  3. 本地办法栈(Native Method Stacks)与虚拟机栈所施展的作用是十分类似的,其区别只是虚拟机栈为虚拟机执行 Java 办法(也就是字节码)服务,而本地办法栈则是为虚拟机应用到的本地(Native)办法服务。
  4. Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创立。此内存区域的惟一目标就是寄存对象实例,Java 世界里“简直”所有的对象实例都在这里分配内存。
  5. 办法区(Method Area)与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、动态变量、即时编译器编译后的代码缓存等数据。也叫非堆。
  6. 运行时常量池(Runtime Constant Pool)是办法区的一部分。Class 文件中除了有类的版本、字段、办法、接口等形容信息外,还有一项信息是常量池表(Constant Pool Table),用于寄存编译期生成的各种字面量与符号援用,这部分内容将在类加载后寄存到办法区的运行时常量池中。
  7. 间接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是《Java 虚拟机标准》中定义的内存区域。然而这部分内存也被频繁地应用,而且也可能导致 OutOfMemoryError 异样呈现。
  8. new 的操作,到常量池查问类的援用,查看援用是否已被加载解析和初始化过,在 java 堆中分配内存,设置元数据,哈西码,gc 年龄等,执行构造函数。
  9. 对象在堆内存中的存储布局能够划分为三个局部:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头局部包含两类信息。第一类是用于存储对象本身的运行时数据,如哈希码(HashCode)、GC 分代年龄、锁状态标记、线程持有的锁、偏差线程 ID、偏差工夫戳等;对象头的另外一部分是类型指针,即对象指向它的类型元数据的指针,Java 虚拟机通过这个指针来确定该对象是哪个类的实例。实例数据局部是对象真正存储的无效信息,即咱们在程序代码外面所定义的各种类型的字段内容,无论是从父类继承下来的,还是在子类中定义的字段都必须记录起来。对象的第三局部是对齐填充,这并不是必然存在的,也没有特地的含意,它仅仅起着占位符的作用。如果数据局部没有是 8 的整数倍,则须要补齐为 8 的倍数。
  10. 后续应用该对象,咱们的 Java 程序会通过栈上的 reference 数据来操作堆上的具体对象。应用句柄拜访的话,Java 堆中将可能会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中蕴含了对象实例数据与类型数据各自具体的地址信息;应用间接指针拜访的话,Java 堆中对象的内存布局就必须思考如何搁置拜访类型数据的相干信息,reference 中存储的间接就是对象地址,如果只是拜访对象自身的话,就不须要多一次间接拜访的开销。
退出移动版