多了解些底层总归是让自己向着真相靠近

JVM内存模型

JVM内存模型主要如上图所示

  • 线程私有
    • 程序计数器
    • 虚拟机栈
    • 本地方法栈
  • 线程共享
    • 元数据区
    • 直接内存

程序计数器

线程私有,指向当前线程正在执行的字节码的行号。
如果当前线程执行的是native方法,那么此时是本地方法在工作所以不需要Java去进行记录,其值为Null。

虚拟机栈

线程私有,是Java方法执行的内存模型。Java栈中存放的是一个个栈帧,栈帧包括

  • 局部变量表
  • 操作数栈
  • 动态链接
  • 方法返回地址

本地方法栈

线程私有,功能与Java虚拟机栈十分相似,区别在于其服务于虚拟机使用的native方法。

堆.jpeg
线程共享,堆的主要作用是存放对象实例,也是管理最复杂的一个区域,空间分配如下:

  • Young Generation (1/3堆空间)
    • Eden (8/10 Young)
    • From (1/10 Young)
    • To (1/10 Young)
  • Old Generation (2/3堆空间)

元数据区

从1.8开始,元数据区取代了1.7的永久代,作用是存放虚拟机加载的类信息、静态变量,常量等

直接内存

JDK1.4引入了NIO,它可以使用Native函数直接分配堆外内存。