专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

精美图文带你掌握JVM内存布局

  本 JVM 系列属于本人学习过程当中总结的一些知识点,目的是想让读者更快地掌握 JVM 相关的知识要点,难免会有所侧重,若想要更加系统更加详细的学习 JVM 知识,还是需要去阅读专业的书籍和文档。
  本文主题内容:
  JVM 内存区域概览  堆区的空间分配是怎么样?堆溢出的演示  创建一个新对象内存是怎么分配的?  方法区 到 Metaspace 元空间  栈帧是什么?栈帧里有什么?怎么理解?  本地方法栈  程序计数器  Code Cache 是什么?
  注:请区分 JVM 内存结构 (内存布局) 和 JMM(Java 内存模型) 这两个不同的概念!
  概念
  内存是非常重要的系统资源,是硬盘和 CPU 的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM 内存布局规定了 Java 在运行过程中内存申请、分配、管理的策略,保证了 JVM 的高效稳定运行。
  上图描述了当前比较经典的 JVM 内存布局。 (堆区画小了 2333,按理来说应该是最大的区域)
  如果按照线程是否共享来分类的话,如下图所示:
  PS:线程是否共享这点,实际上理解了每块区域的实际用处之后,就很自然而然的就记住了。不需要死记硬背。
  下面让我们来了解下各个区域。
  Heap (堆区)
  1. 堆区的介绍
  我们先来说堆。堆是 OOM 故障最主要的发生区域。它是内存区域中最大的一块区域,被所有线程共享,存储着几乎所有的实例对象、数组。所有的对象实例以及数组都要在堆上分配,但是随着 JIT 编译器的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生,所有的对象都分配在堆上也渐渐变得不是那么"绝对"了。  延伸知识点:JIT 编译优化中的一部分内容 - 逃逸分析。
  推荐阅读:深入理解 Java 中的逃逸分析
  https://www.hollischuang.com/archives/2583
  Java 堆是垃圾收集器管理的主要区域,因此很多时候也被称做"GC 堆"。从内存回收的角度来看,由于现在收集器基本都采用分代收集算法,所以 Java 堆中还可以细分为:新生代和老年代。再细致一点的有 Eden 空间、From Survivor 空间、To Survivor 空间等。从内存分配的角度来看,线程共享的 Java 堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。不过无论如何划分,都与存放内容无关,无论哪个区域,存储的都仍然是对象实例,进一步划分的目的是为了更好地回收内存,或者更快地分配内存。
  2. 堆区的调整
  根据 Java 虚拟机规范的规定,Java 堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,就像我们的磁盘空间一样。在实现时,既可以实现成固定大小的,也可以在运行时动态地调整。
  如何调整呢?
  通过设置如下参数,可以设定堆区的初始值和最大值,比如  -Xms256M -Xmx 1024M ,其中 -X  这个字母代表它是 JVM 运行时参数,ms  是 memory start  的简称,中文意思就是内存初始值,mx  是 memory max  的简称,意思就是最大内存。
  值得注意的是,在通常情况下,服务器在运行过程中,堆空间不断地扩容与回缩,会形成不必要的系统压力所以在线上生产环境中 JVM 的  Xms  和 Xmx  会设置成同样大小,避免在 GC 后调整堆大小时带来的额外压力。
  3. 堆的默认空间分配
  另外,再强调一下堆空间内存分配的大体情况。
  这里可能就会有人来问了,你从哪里知道的呢?如果我想配置这个比例,要怎么修改呢?
  我先来告诉你怎么看虚拟机的默认配置。命令行上执行如下命令,就可以查看当前 JDK 版本所有默认的 JVM 参数。
  java -XX:+PrintFlagsFinal -version输出
  对应的输出应该有几百行,我们这里去看和堆内存分配相关的两个参数
  >java -XX:+PrintFlagsFinal -version [Global flags]     ...     uintx InitialSurvivorRatio                      = 8     uintx NewRatio                                  = 2     ... java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)参数解释
  因为新生代是由  Eden + S0 + S1  组成的,所以按照上述默认比例,如果 eden  区内存大小是 40M,那么两个 survivor  区就是 5M,整个 young  区就是 50M,然后可以算出 Old  区内存大小是 100M,堆区总大小就是 150M。 4. 堆溢出演示 /**  * VM Args:-Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError  * @author Richard_Yi  */ public class HeapOOMTest {      public static final int _1MB = 1024 * 1024;      public static void main(String[] args) {         List byteList = new ArrayList<>(10);         for (int i = 0; i < 10; i++) {             byte[] bytes = new byte[2 * _1MB];             byteList.add(bytes);         }     } }输出 java.lang.OutOfMemoryError: Java heap space Dumping heap to java_pid32372.hprof ... Heap dump file created [7774077 bytes in 0.009 secs] Exception in thread "main" java.lang.OutOfMemoryError: Java heap space     at jvm.HeapOOMTest.main(HeapOOMTest.java:18)-XX:+HeapDumpOnOutOfMemoryError 可以让 JVM 在遇到 OOM 异常时,输出堆内信息,特别是对相隔数月才出现的 OOM 异常尤为重要。   创建一个新对象内存分配流程
  看完上面对堆的介绍,我们趁热打铁再学习一下 JVM 创建一个新对象的内存分配流程。
  绝大部分对象在  Eden  区生成,当 Eden  区装填满的时候,会触发 Young Garbage Collection ,即 YGC 。垃圾回收的时候,在 Eden  区实现清除策略,没有被引用的对象则直接回收。依然存活的对象会被移送到 Survivor  区。Survivor  区分为 so 和 s1 两块内存空间。每次 YGC  的时候,它们将存活的对象复制到未使用的那块空间,然后将当前正在使用的空间完全清除,交换两块空间的使用状态。如果 YGC 要移送的对象大于 Survivor  区容量的上限,则直接移交给老年代。一个对象也不可能永远呆在新生代,就像人到了 18 岁就会成年一样,在 JVM 中 -XX:MaxTenuringThreshold  参数就是来配置一个对象从新生代晋升到老年代的阈值。默认值是 15,可以在 Survivor  区交换 14 次之后,晋升至老年代。
  上述涉及到一部分垃圾回收的名词,不熟悉的读者可以查阅资料或者看下本系列的垃圾回收章节。
  Metaspace 元空间
  在  HotSpot JVM  中,永久代( ≈ 方法区) 中用于存放类和方法的元数据以及常量池,比如 Class  和 Method 。每当一个类初次被加载的时候,它的元数据都会放到永久代中。
  永久代是有大小限制的,因此如果加载的类太多,很有可能导致永久代内存溢出,即万恶的  java.lang.OutOfMemoryError: PermGen ,为此我们不得不对虚拟机做调优。
  那么,Java 8 中  PermGen  为什么被移出 HotSpot JVM  了?(详见:JEP 122: Remove the Permanent Generation) :
  1. 由于  PermGen  内存经常会溢出,引发恼人的 java.lang.OutOfMemoryError: PermGen ,因此 JVM 的开发者希望这一块内存可以更灵活地被管理,不要再经常出现这样的 OOM
  2. 移除  PermGen  可以促进 HotSpot JVM  与 JRockit VM  的融合,因为 JRockit  没有永久代。
  根据上面的各种原因, PermGen  最终被移除,方法区移至 Metaspace ,字符串常量池移至堆区。
  准确来说,Perm 区中的字符串常量池被移到了堆内存中是在 Java7 之后,Java 8 时,PermGen 被元空间代替,其他内容比如类元信息、字段、静态属性、方法、常量等都移动到元空间区。比如  java/lang/Object  类元信息、静态属性 System.out、整形常量 100000 等。
  元空间的本质和永久代类似,都是对 JVM 规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。 (和后面提到的直接内存一样,都是使用本地内存)
  In JDK 8, classes metadata is now stored in the native heap and this space is called Metaspace.
  对应的 JVM 调参:

盘点10款Steam冬季特卖中的史低游戏,少吃一个汉堡就能入手岁月如梭,很快Steam就又要开启一年一度的冬季特卖活动了,在这一次活动里许多游戏会以历史低价对外出售,今天我就来为大家推荐10款,少吃一个汉堡就能买到这些游戏,希望大家能够喜欢。Steam冬季特卖方块方舟史低价29元,主播骑着飞船追杀恐龙方块方舟是一款有趣的Steam体素类生存沙盒游戏,在神奇的方块世界,玩家将会遇上各种各样的远古生物,除了能够和它们亲密互动之外,还有机会驯服它们,让它们成为自己忠实的好伙伴。除了生Steam冬季特卖最值得剁手的10款游戏,大作史低价的机会少有Steam冬季特卖将于明天开启,相信不少玩家都有所关注,这是Steam年末最后一次促销活动里,折扣力度很大。下面为大家推荐本次促销当中10款最值得剁手的游戏,大作史低价的机会少有,部落与弯刀新手知识盘点,沙盒游戏异域新玩法,6种特色自由发展各位小伙伴大家好,我是飞梦,随着科技的进步,游戏类的发展日益俱增,像动作类冒险类角色扮演休闲类沙盒类等游戏越来越多,其中沙盒类游戏在近两年十分的火爆,受到大批玩家的追捧好评,而今天吃鸡新皮肤上线,灵感来自封神榜!还有全新蹦蹦皮肤Hello,小伙伴们大家好,吃鸡趣味多,一说话就多欢迎来到新一期的鹏程趣聊吃鸡!眼看进入圣诞节,各大游戏厂商也相继推出了圣诞节的专属活动,作为和平精英的制作方,光子工作室自然也不会Fly追星马龙成功!网友评论好好学习运动精神,这个赛季太飘了由虎牙直播的王者荣耀KPL秋季赛正在如火如荼的进行当中,在本次败者组决赛当中狼队与TTG给观众们呈现了一场精彩绝伦的对决,最终是TTG这一边获胜晋级到下一轮。但随之网上便开始出现许Steam冬季特卖开启逐光之旅折扣价26。6元由微光工作室制作的横版平台跳跃游戏逐光之旅现已在PC和NS平台上线,PC平台的冬季特卖活动将于12月22日开启,此次游戏折扣为30off,约26。6元人民币,喜欢平台跳跃游戏的小伙G胖游戏特惠冬季特惠开始了!新平史低的优质佳作游戏推荐这次冬季促销,G胖的后庭花可以说遭受了致命打击,被隔壁按在地上反复摩擦。这么说吧,本期安利的游戏,如果没有特殊的信仰加持,单从售价考虑的话,都大可放心投入E宝的怀抱。以后别再联系了怀旧游戏(千年手游)一周没有更新啦,工作有点小忙,所以呢,每天都是做作日常任务。可以收获一些绑定的药品啦。因为是新人,王陵完全没有机会,所以我只能靠挂机让自己的小角色慢慢成长。人生也是一样,没有VIP腾讯光子将研发雪中悍刀行正版手游能否让武侠文化重回巅峰?一曲歌英豪,刀剑一出,群雄逐鹿。一曲歌侠客,值此今生,共赴江湖。今天,我们先从武侠谈起。雪中悍刀行IP剧空降热播剧首位,再次点燃武侠文化热前两天,万众期待的古装武侠剧雪中悍刀行开播雪中悍刀行手游光子操刀,怕不是要拿命氪了当前,由当年大火的小说雪中悍刀行改编的古装武侠剧正在热播。不得不说腾讯果然蹭得一手好热度,在雪中悍刀行热播的同时,近日,著名游戏研发团队光子工作室群宣布操刀雪中悍刀行IP手游开发。
DRX官宣新阵容,金教练原神哥搭档deft,能打出好成绩吗?DRX官宣新阵容,金教练原神哥搭档deft,能打出好成绩吗?DRX战队日前官宣了新阵容,原神哥beryl也是正式亮相了。同他一同加入的,还有deftzeka和金教练。DRX的上野没原神雪山活动结局引热议,假阿贝多去向成谜,细思极恐随着皑尘与雪影第三幕的结束,这次雪山活动终于圆满落下了句号,比较可惜的直到最后真阿贝多都没有透露其与假阿贝多在第二幕最后交涉时的细节,仅告诉旅行者假阿贝多的计划没有成功,让人意犹未嘟嘟租号诚邀工作室主播商家合作什么游戏都有低至03。一个小时嘟嘟租号诚邀工作室主播合作DD373欢迎各位商户免费入驻内测享有分销商的扶持返利活动有意向的合作共赢招转租招转租招转租招分销商招分销商招分销商我们提供LOLChashao谈目前BLG最大挑战,IG让人不懂了让游戏成为一位调味料,给乏味的生活带来一点轻松和娱乐,大家好,欢迎收看游戏君为大家带来的最新的游戏资讯!目前正处在冬季转会期,每天都有各种各样的消息曝出,下面就跟随游戏君一起来了解管泽元黄旭东空降大师赛,FIFA品类游戏联动国际豪门玩出新花样12月3日,FIFA品类游戏2021大师挑战赛在上海展开了激烈角逐。本次赛事共设置FIFAOnline4和FIFA足球世界两个项目的比拼,邀请了包括英超西甲德甲法甲四大顶级联赛冠名EDG喜提第二个青训状元!阿布评价他的实力完全可以打LPL2021英雄联盟职业青训营选秀大会也是首次开启全程直播,对于青训的印象,如果提起50W状元上单小祥的话,相信大家一定不会陌生,小祥就是此前的青训营状元最后加入了EDG,而今年经历了原神资讯八重神子消息整理,2。5版本上线,甘雨雷神好姐妹?我即鸣神大社宫司八重神子是也,好久不见呀,帝君咦,怎么没见甘雨姐姐啊!八重神子是五星法器角色,根据大佬消息,八重神子将在2。5版本上线,我预测2。5版本第一个卡池,即2022年2月KPL樊叔赛评季后赛E星恐怖如斯,谁能与之一战?12月4日,KPL胜者组对决,武汉eStar对阵佛山GK。eStar老板何猷君以及王嘉尔现场督战,eStar高歌猛进,41战胜GK,拿下季后赛首胜。eStar这个赛季的表现过于亮眼12月4号,王者最新更新攻略,你确定不关注一下王者荣耀时不时更新,让玩家越来越喜欢了,下面给大家讲解最新更新攻略。一,英雄调整(项羽,娜可露露,吕布)项羽大招新增效果,生命值越低伤害越高,最高可达基础伤害两倍。技能伤害调整在娜机械战神勇士滑梯圆你一个英雄梦机械战神是游戏地下城与勇士里面的一种职业,它可以制造众多的机器人来打造自己想要的机甲世界。因此作为一个做气模设备的专业厂家怎能不仅紧跟潮流。在2021年机械战神这个款式可以说是卖得苹果AppStore公布年度精选榜单英雄联盟手游获选年度游戏1苹果AppStore公布年度精选榜单英雄联盟手游获选年度游戏昨日,苹果AppStore公布全球年度精选App和游戏名单。其中腾讯旗下的游戏英雄联盟手游荣获AppStoreAwar
友情链接:快好知快生活快百科快传网中准网文好找聚热点快软件