JVM第二篇 — JVM的内存模型

    先从这张图来看JVM的内存模型,而后我再分别介绍各内存区的做用:java

            JVM内存模型

ClassLoader,类装载子系统

    类装载子系统根据类的全限定名获取定义类的二进制字节流;将这个字节流所表明的静态存储结构转化为方法区中的运行时数据结构;而后在堆中建立一个表明这个类的java.lang.Class对象,做为方法区中静态数据的访问入口。数据结构

Method Area, 方法区

    方法区被全部线程共享,方法区存放的信息有:线程

a. 类的类型信息,这类型信息由类加载器从类文件中提取,包括:对象

  • 类的完整有效名
  • 父类的完整有效名(interface and java.lang.Object 除外,由于无父类)
  • 类的修饰符
  • 类的直接接口列表

b. 类的static变量、final变量(全部对象共享一分拷贝)接口

c. 类的属性信息,也称域信息,包括:内存

  • 属性名
  • 属性类型
  • 属性修饰符(public private protected static final volatile transient…)

d. 类的方法信息,包括:it

  • 方法名
  • 方法返回类型
  • 方法参数
  • 方法的修饰符
  • 方法的字节码(abstract and native 除外)(被程序寄存器指向)
  • 操做数栈和方法栈帧的局部变量区的大小
  • 异常表

e. 常量池,用于存放类、方法的各类符号引用。变量

f. 加载一个类的类加载器的引用引用

g. Class类的引用二进制

Heap, 堆区

    堆区存放运行时的全部对象、实例,它也是GC管理的主要区域。

Java Stack, Java栈

    每启动一个新的线程,就会被分配一个栈;每一次的方法调用,就是一次从入栈到出栈的过程。

Native Method Stack, 本地方法栈

    与Java栈相似,只是它用于本地方法调用。

Program Counter Register, 程序计数器

    程序计数器,老是指向该线程下一步要执行的指令,指令的位置放在方法区的方法字节码中。程序计数器的值或内容是相对第一个指令的偏移量。

相关文章
相关标签/搜索