一、JVM 的内存结构
(1)线程私有区域:
1.程序计数器
2.虚拟机栈
(2)线程共享区域:
1.堆
2.方法区
二、JVM 中哪些区域会出现内存溢出
(1)不会出现内存溢出的区域:程序计数器
(2)出现 OutOfMemoryError 的情况:
1.堆内存耗尽 - 对象越来越多且一直在使用,不能被垃圾回收
2.方法区内存耗尽 - 加载的类越来越多,很多框架都会在运行期间动态产生新的类
3.虚拟机栈积累 - 每个线程最多会占用1M内存,线程个数越来越多,而又长时间运行不销毁时
(3)出现 StackOverFlowError 的区域:
1.虚拟机栈内部 - 方法调用次数过多
三、方法区、永久代和元空间之间的关系
(1)方法区是 JVM 规范中定义的一块内存区域,用来存储类元数据,方法字节码,即时编译器需要的信息等
(2)永久代是 HotSpot 虚拟机对方法区的实现(jdk 1.8 之前)
(3)元空间是 HotSpot 虚拟机对方法区的实现(jdk 1.8 以后),使用本地内存作为这些信息的存储空间