- JVM 运行时内存区 (图片为引用,非自创,非商业)
jvm的内存区可以根据受访权限的不同,定义为线程共享和线程私有两大类。
线程共享:所有的线程都可以访问的内存区域。
线程共享区:
java 堆区
java 方法区
- java 运行时常量池
1.
java 堆区: 存储对象实例,是GC执行垃圾回收的重点区域,GC的回收频率和效率,主要跟该区域的特性有关。
根据jvm对象的存活时间长短,堆区可以更细分为新生代和老年代,其中新生代又分为Edge区,From Survivor区,To Survivor区。
2.
java 方法区:存储每一个java类的结构信息。比如:运行时常量池,字段和方法数据,构造函数,普通方法的字节码内容,以及类, 实例,接口需要用到的特殊方法数据。 该区也被称之为永久代。
该区域并不会像java堆区那样,频繁的被GC执行回收,还可以显式指定是否需要GC回收方法区内容。没有指定不对该区域回收时,GC仅针对该区域的常量池和类型卸载进行回收
3.
运行时常量池:属于方法区的一部分。主要包含一些常量。比如字节码文件中,编译期就已经确定的值。
当类装载器成功将一个类或接口装载到JVM后,就会创建对应的运行时常量池。
线程私有区:
- PC寄存器
- java栈
- 本地方法栈
1.
PC计数器:JVM是基于栈结构的。PC计数器作为线程私有,是为了记录线程执行到了哪一条字节码指令,方便CPU进行线程间的切换。
2.
java栈 线程私有,生命周期同线程一致,存储局部变量,操作数栈,方法出口。java堆区存储的是对象实例,则java栈存储的是对象引用,原始数据类型。
3.
本地方法栈:用于支持native方法,(c/c++实现的方法)。
小结1:
以上内存区,除了PC计数器,都会抛出OutOfMemoryError 异常。栈还会抛出StackOverFlowError 异常。