运行时数据区
程序计数器(线程独有)
标记下一条指令的位置!
本地方法栈(线程独有)
直接内存(线程共享)
jvm可以直接访问内核空间的内存(zero copy)
虚拟机栈(线程独有)
栈针(每个方法对应一个栈针)
本地变量表
操作数栈
动态链接
return address
一道面试题
打印结果是8,为什么?我们来分析一下它的方法指令!
bipush:把8进行压栈
istore_1:把8弹出,赋值给本地变量表标志位为1的变量,也就是i
iload_1:把本地变量表标志位1的变量进行压栈,也就是i
iinc 1 by 1: 把本地变量表i进行加1
istore_1:把操作数栈中的值赋值给本地变量表1的变量,也就是i
因为操作数栈中的值是8,所以最终i还是8
堆(线程共享)
方法区(线程共享)
1.Perm Space (<1.8)
字符串常量位于PermSpace
FGC不会清理
大小启动的时候指定,不能变
2.Meta Space (>=1.8)
字符串常量位于堆
会触发FGC清理
不设定的话,最大就是物理内存