范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

精美图文带你掌握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 调参:

神武4电脑版门派推荐之盘丝岭精于减益的封印大师神武大胖熊,陪你看遍光华繁荣,你们的大胖熊又回来了说起盘丝,相信不少小伙伴的第一印象都是其好卖的防御符与神魂颠倒的强封。盘丝岭不仅擅长使用各种增减益法术,还能吸收敌人的气血和魔法归30元起玩转王牌竞速?不同玩家不同玩法!我也想做思聪党热门赛车手游王牌竞速自从开启了S2赛季之后,又推出了很多福利活动。作为玩家自然是非常高兴的,特别是最近的限时返利,购买纪念币就可以获得巨额的礼品点。入手越多,送的礼品点也就越多。想王者荣耀单排打到了101星,巅峰赛靠自己打到全国28,请问我能做主播吗?另外我给你一点实际的回答。首先刚刚开始播的前面几个月你不要想着赚钱扩张人气搞几个粉丝群每天抽一小时带粉丝!!不要带太高段位就带你能带动的段位哪怕钻石星耀能保证胜率的段位!然后找几个九阴真经游戏之如何野外打怪九阴真经这个游戏号称的是让所有小伙伴们都能平等的享受到江湖之中的武侠精神。正是因为九阴真经这款游戏讲究的是真武侠真江湖。所以我们想要证明自己的途径就是苦练武功,才能够在江湖之中有一体验服两个英雄被暗改,达摩普攻新形态,黄忠大招位移加穿墙大家好我是指尖,英雄调整要先公布调整内容,这是每个游戏在更新时游戏方都要做的事情,但是有些时候会因为客观原因,导致没有公布,可能因为调整内容无意加入,也可能是忘了补充公告,但不管怎黑神话悟空实机演示到底展现了什么内容?距离游戏科学公布第一段13分钟的实机演示预告一年后,玩家们终于迎来了黑神话悟空的最新实机演示视频,这次的实机演示视频长达12分钟,这部预告片中展现了游戏更多的细节和内容。预告片细节天美大动作!黄忠偷偷被加强,开启大招自动闪现,居然还能穿墙就在今天我还像往常一样登录体验服的时候,突然发现天美又有大动作了,黄忠竟然被偷偷加强了。虽然体验服的更新日志中并没有明确表示,黄忠此次被加强了,但是在实战中却可以发现,黄忠一旦开启RNG止步六强,世界赛形势仍然乐观!甚至有可能不用打冒泡赛近日,伴随着2021年英雄联盟LPL夏季赛季后赛六进四RNG对阵LNG的比赛结束,以13不敌LNG的RNG其实也是提前结束了自己的夏季赛之旅。不过因为全球总决赛积分的优势缘故,已经古色古香的国风江湖世界,武林志2让玩家感受明朝风光为什么说武侠类的游戏在游戏界是经久不衰的话题呢?因为作为国风元素的游戏,中华文化博大精深热爱国风的国人大有人在,只要中华文化不熄灭,那么这样经典的元素就永不会在历史的长河中泯灭。而最近大火的神佑释放生活技能怎么赚钱?生活技能赚钱心得分享神佑释放生活技能怎么赚钱?游戏种技能有不少,各种技能是可以不断升级的,这里给大家带来了神佑释放生活技能赚钱心得分享,需要的玩家一起来看下文中介绍吧。生活技能赚钱心得神佑释放生活技能黑神话悟空时隔一年又炸了!瞎喷国产游戏的网友闭嘴吧斗罢艰险,再出发耐心看完,你一定会有所收获大家还记得那个展示孙悟空72般变化骑白龙斗天兵吹毫毛的国产单机游戏黑神话悟空吗?去年的一则预告片播出,曾引起了巨大轰动,彻底点燃了整个国内
冰雪传奇盟重冰雪打金传奇,打金玩家首选打金传奇哈喽,大家好,我是散人。冰雪传奇从上线以来受到了无数玩家的喜爱,也是传奇手游下载榜第一名。这款盟重冰雪传奇手游,小编亲测是一款特别适合打金的手游。安卓苹果都可以玩。这款冰雪传奇有单LPL2个世界冠军都有水分,LCK总结S11嘲讽LPL,列举3件争议事小伙伴们大家好,欢迎您收看本期游戏资讯,我是小米!经过漫长的休赛期,LPLS12春季赛也快要开赛了,之前有知情人爆料是1月10日,但还没正式官宣,但按照以往的情况,差不多是这个时间弹射世界我该如何设计一个能用盘子作者NGAMydg尘埃引言队伍为什么这么叫认识各类型队伍。可能经常会在版里看到一些队伍的命名如Fever技伤浑身以及属PF等,这是以该队伍的特色作为命名的方式。这个界面显示了角色的Steam海盗游戏ATLAS促销仅售29元,主播酒后战场上天旋地转一提到海盗,大家可能自然而然就会联想到酒,在诸多喝海盗相关的小说或者电影中,酒这个元素几乎无处不在,海盗的人生似乎就是离不开酒的。作为Steam上一款经典的以海盗为题材的生存沙盒游远征军罗马试玩版上线提供4小时游戏体验THQNordic负责发行的回合战略角色扮演游戏将于2022年登陆Steam,目前该作的试玩版正式上线,据外媒所提供的数据,该试玩版将提供4个小时左右的游玩时间,感兴趣的玩家不要错穿越火线大米从S级到C级跌宕起伏的一年,接受考验不断成长2021年对于许多队伍来说都是特殊的一年,S17赛季AG再创辉煌,同时一举夺得了CFS世界总决赛冠军的殊荣,S18赛季R。LGD作为一支年轻的队伍顺利拿到了自己的首个CFPL冠军奖剑与远征觉醒英雄是必然,出就退坑没必要哈喽,大家好!欢迎大家收看,不肝不游戏!我是疯子最近关于觉醒凤凰的节奏有点起飞,那疯子也来掺一脚,聊聊自己的看法。在这个所谓的觉醒凤凰上线之前,所有的讨论爆料都是YY,具体还是得看被玩家戏称为一方50元的八方旅人真的值那个价吗如果说美术和音乐是一个游戏最重要的部分的话,那么八方旅人可以说是当之无愧的满分神作,可惜美术和音乐并不是一个游戏的全部。老实说近年来好看的皮囊是越来越多了,从手游到PC游戏再到主机发育路唯一的出路,神鸡营五排遇到养猪流,三路全破都打不赢?基本上每个赛季都有玩家吐槽发育路,其他分路的强度越来越高,发育路也相应得越来越难玩,这个赛季更是多了绝育路的称号,不过最近神鸡营赖神吕德华等人五黑的时候就遇到了一个以发育路为核心的最终幻想7重制版PC版与主机版几方面对比(无剧透)画面与帧数PS4版是动态1080P30FPS,PS4PRO是动态1620P30FPS,PS5版是动态1620P60FPS。PC版有图像设定选项(废话),最高可以开4K120FPS,王者荣耀英雄的前世今生噬灭日蚀东皇太一篇平庸是恶。他如此坚信。虽则他自己也不过是芸芸众生中的一员,可那副平凡的身躯中,却跳动着一颗执着而冷酷的心。他在倒悬天曾经遥遥目睹女娲的现身,仅仅惊鸿一瞥,那种威严和力量令人无限向往