jvm内存模型
jvm虚拟机的内存模型其实在jdk1.8开始有了一些变化,本文主要是针对jdk1.8版本讲述我的理解。jdk1.8与jdk1.7的不同我会在另外一篇博客具体谈谈 jvm内存模型jdk1.7和jdk1.8的区别
大家都知道在jdk1.8,Java虚拟机所管理的内存将会包括以下几个运行时的数据区域:
1.程序计数器(Program Counter Register)
2.虚拟机栈(Jvm Stack)
3.本地方法栈(Native Method Stack)
4.堆(Heap)
5.元空间(metaspace)
下面的图希望可以让你更好了解它的结构
线程私有的区域:程序计数器(Program Counter Register),虚拟机栈(Jvm Stack),本地方法栈 (Native Method Stack)
线程共有的区域:堆(Heap) ,元空间(metaspace)
程序计数器:程序计数器是一块较小的内存空间,说简单一点就是一个计数器,当字节码解释器工作时能够通过改变这个计数器的值来选取下一条需要执行的字节码指令。因此也不存在内存溢出的情况
虚拟机栈:虚拟机栈中存放的是一个个的栈帧,每个栈帧对应一个被调用的方法,在栈帧中包括局部变量表、操作数栈、指向当前方法所属的类的运行时常量池的引用、方法返回地址和一些额外的附加信息
本地方法栈:与虚拟机栈作用类似,区别不过是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为虚拟机使用到的本地方法服务
堆:堆是jvm内存管理的最大的一块区域,此内存区域的唯一目的就是存放对象的实例,所有对象实例与数组都要在堆上分配内存。它也是垃圾收集器的主要管理区域。java对可以处于物理上不连续的空间,只要逻辑上是连续的即可。
- 占比1/3的年轻代:Eden区,Survivor区(From Survivor区和 To Survivor区)
e d e n : F r o m : t o = 8 : 1 : 1 eden:From:to = 8:1:1 eden:From:to=8:1:1 - 占比2/3的老年代
-------------------------------------以上比值是默认值,是可以设定的------------------------------------
元空间:存储已被虚拟机加载的类信息。原方法区存储的信息被分成两部分:1、虚拟机加载的类信息,2、运行时常量池。