美文网首页
jvm系列之-内存模型

jvm系列之-内存模型

作者: fkxuexi | 来源:发表于2018-08-07 11:46 被阅读0次

    一、前言:

    现在的一遍的博文大多讲的是1.7的版本,当然现在使用的jdk的版本的主流是1.7和1.8。估计大家本地安装的一般都是1.8的,所以这篇博文会讲一下它们的异同点。

    二、jvm的内存布局以及各个区域存放的内容

    1、 1.7版本的
    image.png
    1.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
    我们大体的介绍一下,具体的调节指令我们下篇博文中在介绍

      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.png

    jdk8把永久区从堆区移除了,MetaSpace本质上也是方法区在jvm中的实现,存储的内容和方法区类似,但是元数据区域现在不存在于jvm中了,可以直接使用本地内存,这样所带来的直接好处是:

    • 1.类和方法信息难以确定其大小,所以难以指定永久区的大小,如果指定大了则容易造成老年代的益处,指定小了则易造成永久去的溢出

    相关文章

      网友评论

          本文标题:jvm系列之-内存模型

          本文链接:https://www.haomeiwen.com/subject/arfovftx.html