java运行时内存模型

运行时内存分为:

1、方法区

2、堆

3、虚拟机栈

4、本地方法栈

5、程序计数器

 

方法区、堆是共享的,所有线程都可以读取

虚拟机栈、本地方法栈、程序计数器是线程私有的,每个线程单独一套,它们在线程创建时生成,在线程死亡时销毁

堆分为年轻代,老年代,永久代。分区的目的是为了更快的分配内存和更好的执行垃圾回收。主要作用是存户对象实例,绝大部分实例和数据都存储在堆中,gc就作用于堆

hotspot虚拟机的方法区存储在永久区,方法区的实现jvm规范没有强制规定,hotspot虚拟机这么实现完全是为了懒省事,方法区放到永久代后gc也可以管理方法区,不用单独实现垃圾回收。

1.8之后hotspot虚拟机移除了整个永久区,改用直接使用物理内存的元空间替代永久代。

程序计数器是唯一不会出现oom的区域,虚拟机实现程序的跳转,循环等操作是基于程序计数器的,程序计数器就是指令的行号,虚拟机通过计数器知道下一个应该执行的指令是哪个。

当线程创建的时候会在栈内存中为线程的每个方法创建一个栈帧,该栈帧中保存着每个方法的局部变量表,方法的出口,动态链接,操作数栈等信息。当前栈帧指的是当前正在执行的线程的方法。

本地方法栈存储的是被执行的本地方法(也就是native方法)的栈帧,存储的内容和线程方法的栈帧存储的内容类似。

posted on 2019-02-26 16:26  走一趟再说  阅读(314)  评论(0编辑  收藏  举报

导航