Java程序内存区域总体分为线程私有区域、线程共享区域和堆外内存区
线程私有区域
程序计数器
记录线程执行到的字节码行号
虚拟机栈
执行、退出方法时生成、删除栈帧
栈帧中有编译期确定的局部变量表、操作数栈、返回地址、动态连接
栈帧满栈溢出,栈满扩栈失败OOM
本地方法栈
native方法栈帧保存处
栈帧超限栈溢出,栈满扩栈失败OOM
线程共享区域
堆区
存储对象和数组实例
堆满扩堆失败OOM
方法区
包含运行时常量池,存储类加载信息、常量、静态变量、即时编译缓存
方法区满OOM
直接内存
不属于运行时数据区,属于应用程序可用内存区域
保存堆外内存引用直接操作,避免native堆和Java堆复制开销
可能导致OOM
参考资料
周志明. 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)[M]. 3. 北京:机械工业出版社, 2019.