根据《java虚拟机规范》,java虚拟机所管理的内存区域如下图所示:
线程共享的内存区域,存储的是对象的实例。
从回收内存的角度看,由于大部分的垃圾回收器都是基于分代回收理论进行垃圾回收的,所以可以将其分为新生代,老年代等。但现在hotspot里面也出现了很多不采用分代回收的新垃圾回收器,所以上述划分仅针对经典的基于分代回收的垃圾回收器
从分配内存的角度看,所有线程共享的对可划分为多个线程私有的分配缓冲区,用来提升对象分配是的效率
- 方法区
线程共享的内存区域,用于存储已被虚拟机加载的类型信息、常量、静态变量、及时编译器编译后的代码缓存等数据。永久代和元空间都是hotspot虚拟机中对方法区的一个实现,在jdk1.8就用元空间取代了永久代,彻底废弃了永久代。
- 程序计数器
线程私有的,记录了当前线程执行到了哪一步,如正在执行的是一个java方法,则记录的是正在执行的虚拟机字节码指令的地址
为什么需要?需要在线程的切换后恢复到正确的执行位置;程序控制流如分支,循环,跳转,异常处理,线程恢复都需要依赖于这个程序计数器来完成
- 虚拟机栈
线程私有的,生命周期与线程相同,当调用一个方法时,java虚拟机就会创建一个栈帧,这个栈帧中包含着局部变量表,操作数栈,动态连接,方法出口等信息。从一个方法的被调用到执行完毕的过程就对应着栈帧在虚拟机中从入栈到出栈的过程。
- 本地方法栈
线程私有的,与虚拟机栈类似,只不过他是为执行本地方法(native)提供服务的。《java虚拟机规范》并没有规定其实现方式,hotspot虚拟机直接将本地方法栈与虚拟机栈合二为一
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。