JVM内存模型

JVM由程序计数器,虚拟机栈,本地方法栈,堆,方法区这五大区域组成。具体分配如图所示。


共享区域:方法区,堆

线程隔离:虚拟机栈,本地方法栈,程序计数器

1. 程序计数器

        每个线程独有,各个线程之间计数器互不影响,独立存储,指向下一条指令的地址。

2. 虚拟机栈

        java虚拟机栈描述的是java方法执行的内存模型,每个方法在执行的时候都会创建一个栈帧。

        用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个方法从调用到执行完成的过程就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

        1)局部变量表:存放编译期间可知的各种基本数据类,,对象引用或对象本身,编译时确定

        2)操作数栈:所有操作码都是对操作栈上的数进行操作,对每一个方法的调用,jvm都会建立一个操作数栈,以供计算使用,栈深度在将源码编译为class文件,就确定了。

        3)动态链接:每个栈帧内部都包含一个指向运行时常量池的引用来支持当前方法的代码实现动态链接

        4)方法出口:正常返回,使调用者的代码能被调用的方法返回并且返回值被推入调用者栈帧的操作数栈后继续正常执行;抛异常,则不会有返回值被返回。

3. 本地方法栈

        与虚拟机栈类似,为native方法服务

4. 堆

        所有new出来的东西都在堆上分配(对象实例和数组)。堆被分成新生代(YongGeneration)和老年代(OldGeneration),新生代又分成Eden和两个Survivor区。

        1)MinorGC

        新生代是所有新对象产生的地方。当新生代内存空间被用完时,就会触发垃圾回收。这个垃圾回收叫做MinorGC。新生代被分为3个部分——Enden区和两个Survivor区。

        新对象在新生代产生,当新生代空间占满后,会触发MinorGC开始垃圾回收,大多数新建对象位于Eden区,一些大对象(例如:大数组)则会直接进入老年代,Eden区满后触发一次MinorGC,存活下来的对象转到survivor0区,survivor0区满后触发执行MinorGC,survivor0区存活对象全部转入survivor1区,这样保证一段时间内总有一个survivor区为空。经过多次MinorGC仍然存活的对象会转入老年代,这是由设定的年龄阈值来决定的。

        2)MajorGC

        老年代空间存储长期存活的对象,老年代占满时会触发MajorGC,花费时间较长,由于垃圾回收会导致“stop the world”事件,即所有线程都会停下来等待垃圾回收执行完成,所以对响应要求高的应用应尽量减少发生MajorGC,如微博后台程序发生MajorGC就会导致前台页面刷新超时,若是股票等实时交易应用发生MajorGC导致响应超时,可能会给客户带来损失,这都是系统调优要考虑到的问题。

        3)FullGC

        清理整个堆空间,包括新生代和老年代。

        触发场景:年代晋升失败,比如eden区的存活对象晋升到Survivor区放不下,又尝试直接晋升到Old区又放不下,这时会发生FullGC。

        在分代收集算法中,由于新生代中对象的存活率低,通常使用复制算法进行垃圾回收。老年代一般使用"标记-清理"或"标记-整理"算法回收存活率较高的对象。

5. 方法区

        被各个线程共享的内存区域,用于寻出已被虚拟机加载的类信息,常量,静态变量,即时编译的代码(类变量,类方法),运行时常量池等。

        在1.6时,方法区一般被称为永久代,其实本质上两者并不等价,是用永久代管理的方法区。但容易遇到内存溢出问题;在1.7时,已经将原本放在方法区中的字符串常量池,字面量,类的静态变量转移到堆中,将符号引用转移到了native heap中;在1.8时,移除了整个永久代,取而代之的是一个叫元空间的区域。元空间在直接内存中,不在虚拟机栈中,因此元空间的大小依赖于内存大小,当然你也可以自定义元空间大小。

为什么叫元空间呢?因为这里边存放的是类的元数据信息。

        元数据,是用来描述数据的数据。简单的说,就是最小的数据单元。元数据可以为数据说明其元素或属性(名称、大小、数据类型等)或其结构(长度、字段、数据列)或其相关数据(位于何处、如何联系、拥有者)。

        写到这时,发现自己不太清楚运行时常量池与class常量池是什么关系,就顺便查下资料,分享下我查到的资料。

字符串常量池,class常量池,运行时常量池

        字符串常量池:存放字符串常量,

        class常量池:我们写的每一个Java类被编译后,就会形成一份class文件,class文件中除了包含类的版本,字段,方法,接口等描述信息外,还有一项信息就是常量池,用于存放编译器生成的各种字面量和符号引用.

        字面量包括:1.文本字符串 2.八种基本类型的值 3.被声明为final的常量等;

        符号引用包括:1.类和方法的全限定名 2.字段的名称和描述符 3.方法的名称和描述符。

         运行时常量池: 运行时常量池更具动态性,在运行期间也可以将新的变量放入常量池中,而不是一定要在编译时确定的常量才能放入,类加载后,class常量池也存放于这里.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容