Jvm运行时数据区
2020-04-24 本文已影响0人
于占伍

浅色为线程共享,深色为线程私有

堆
用于存放对象实例的一块区域,几乎所有的对象都在这里分配内存
堆在jvm启动时创建,堆中对象不用显式释放,gc会帮我们释放并回收内存。
(通过 -Xmx 和 -Xms 控制)。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出 OutOfMemoryError 异常。

方法区
主要是存储类信息(类版本号,方法,接口),常量,静态变量,即时编译后的代码等
hotspot同永久代
本地方法区
主要为Native方法服务(rt.jar)
Java虚拟机栈
用于方法执行的一块内存区域,执行顺序跟栈一样,先进后出
栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操作数栈,方法出口等信息
局部变量表存放编译期可知的基本数据类型boolean byte char short int float long double以及对象引用reference
线程请求深度大于虚拟机允许的最大深度抛出异常StackOverFlowError(典型场景,递归死循环)
程序计数器
记录当前线程执行的行号,为了线程切换能恢复到正确的执行位置,各个线程之间互不影响
运行时常量池
String a = “123” String b = ‘123’ == 为true 在方法区里面分配内存
String c = new String(“123) 分配到堆里 ==为false