方法区
运行时数据区结构图

堆和方法区图例

1、栈、堆、方法区的交互关系
从线程共享与否角度来看



2、方法区的理解




3、设置方法区大小与OOM



OOM 举例

如何解决OOM

4、方法区内部结构


1、类型信息

2、域信息

3、方法信息

运行时常量池VS常量池
常量池是什么





运行时常量池

5、方法区使用举例
不涉及堆空间()因为没有new


sipush_500 => 往操作数栈中放入500

istore_1 往局部变量表中1号下标的位置放500的数值

bipush_100 往操作数栈中入栈100

istore_2 在局部变量表下标为2的地方存100,操作数栈内的100出栈

iload_1 iload_2 把局部变量表里的 1和2号下标的值,压入到操作数栈中

除法操作 在操作数栈中操作,栈顶放最终结果

把计算的最终结果放到栈顶

把50存到局部变量表的4号下标位置

常量池内容 ,找对应的常量

getstatic #2 找常量池中 #2的符号引用对应的常量信息,最终转换成直接引用。

iload_3 iload_4 将局部变量表中下标 3和4的数字放到操作数栈中


iadd做累加运算

通过#3的符号引用找到对应的常量信息

return 方法执行结束

6、方法区的细节演示

演变过程



永久代为什么会被元空间替代


StringTable 为什么要调整

静态变量放在那里

7、方法区的垃圾回收



8、总结

9、常见面试题




被折叠的 条评论
为什么被折叠?



