一、前言:
现在的一遍的博文大多讲的是1.7的版本,当然现在使用的jdk的版本的主流是1.7和1.8。估计大家本地安装的一般都是1.8的,所以这篇博文会讲一下它们的异同点。
二、jvm的内存布局以及各个区域存放的内容
1、 1.7版本的
image.png1.1、程序计数器
这个基本就是各种指令的执行都需要来依赖这个程序计数器来完成。这个区域是线程私有的。
1.2、java虚拟机栈
同程序计数器一样这个区域也是线程私有的。java虚拟机栈也可以称作为线程栈,描述的是java方法执行的内存模型,每个方法在执行的过程中都会创建一个栈帧用于存储:局部变量表、操作数栈、动态链接、方法出口信息,局部变量表:基本数据类型、对象的引用(对象的实例是在堆区的),如果线程的请求的栈的深度大于虚拟机所允许的深度,将会抛出StackOverflowError(直接给一个没有终止条件的递归程序体验一下即可),如果没有申请到足够的内存,则会抛出OutOfMemoryError的异常。
1.3、本地方法栈
本地方法栈则为虚拟机使用到的Native方法服务
1.4、java堆
java虚拟机堆是java虚拟机所管理的最大的一块,这个区域是被所有的线程所共享的。次区域的唯一的目的就是存储对象的实例、常量(池),java的回收机制主要也是管理这一个区域的
image.png
Edon:surviro from :survior to = 8:1:1
我们大体的介绍一下,具体的调节指令我们下篇博文中在介绍
- 新生代:
新生对象的存放区域,当对象刚生成的时候,会存在放在Eden区域(如果对象的占用的内存很大,会直接进入老年代),当Eden区域内存不够的时候就会触发GC,Edon和Survior From中的还存活下来的对象将会被复制到Survior To中,同时对象的年龄+1,如果达到代际年龄则进入老年代,然后To和From互换角色,确保to一直是空的。
- 新生代:
1.5、方法区(Permanent Generation)
方法区和java堆一样是所有线程共享的区域,在jdk7中这个区域是被划分为堆区的一部分,这一部分也有一个别名(“Permanent Generation”)即永久区。注意这个地方依旧占用堆的内存空间。这个区域主要存放的是:类信息、静态变量
1.6、 1.8版本的
image.pngjdk8把永久区从堆区移除了,MetaSpace本质上也是方法区在jvm中的实现,存储的内容和方法区类似,但是元数据区域现在不存在于jvm中了,可以直接使用本地内存,这样所带来的直接好处是:
- 1.类和方法信息难以确定其大小,所以难以指定永久区的大小,如果指定大了则容易造成老年代的益处,指定小了则易造成永久去的溢出
网友评论