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

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

十三前往九寨沟的随行名额,谁更有资格前往当13起飞前往成都前,对于那一张九寨沟门票的归属还在网上继续争论,对于这次到底带谁前往还是议论纷纷。一梦梦是新加入公司的,但毕竟是一个女生,如果同行会有很多的不便以及争议,对13或十二铜表法的产生背景实质立法目的历史法制观内容产生背景古代罗马国家建立在欧洲地中海中央的亚平宁半岛上,并且不断向亚非欧三大洲进行扩张,频繁的对外经济贸易往来,使其形成了高度发达的奴隶制商品经济。平民与贵族进行了长期斗争。十二铜大家对演员以及著名相声演员曹云金的评论太可爱了这句话在头条展现量,已经超过了80万。但是曹云金啊,对于网友的评论是做到了打不还手,骂不还口。他就默默的看着广大的网友,争论越多。他就默默的挣钱。不知道,因为这个头条所产生的效益。吴亦凡都被刑拘了,周炜的报警何时能回应?德艺双馨艺术家周炜,在河南郑州遭遇了特大洪灾后,捐赠物资给河南夕阳红养老院,此次共装车捐献了1000箱矿泉水以及1000箱方便面。也艾特了众多河南的新闻媒体。特意用了彩色和黑白两种君士坦丁十一世的人物生平身后影响婚姻子女影视形象人物生平君士坦丁十一世的个人旗帜君士坦丁十一世出生于拜占庭帝国首都君士坦丁堡,是曼努埃尔二世皇帝的十个孩子中的第八个,约翰八世皇帝的弟弟。他的童年大部份时间在君士坦丁堡度过,在父母为了聪明就可以无所顾忌吗?竟然打扰烈士的英灵此视频已经曝光。网友们看到的第一反应就是愤怒。八月三日有网友拍摄到的视频显示,有多名青年在广东抗日阵亡战士陵园跳舞拍视频。视频中显示他们摆出整洁的步法,在陵园内跳着欢快的舞曲,边上维特里乌斯的早年生活帝国内战皇帝韦帕芗起兵灭亡早年生活维特里乌斯的祖父普布里乌斯出身于罗马的骑士阶级,曾任奥古斯都皇帝的管家他的父亲鲁基乌斯在克劳狄乌斯皇帝时期曾担任执政官。维特里乌斯本人在与皇室关系良好的环境下长大,并与皇帝五秒面对低迷,昏招迭出。爆百万料,组团,都是为了几两碎银子曾经的反岳联盟,因为星宿派掌门丁修的加入,曾经也风光无限。一时间也是人强马壮,粮草充足。围观的吃瓜群众也是乐呵了一回,对于吃瓜群众来说,能够窥探到所谓的网红隐私,也是一种乐趣。随着横店13黑粉为什么黑他?升米恩,斗米仇,既然做了为什么不敢认?昨天有朋友在某主播直播间,碰到了一位叫粗人秋的网友,这个网友,一直再喊的就是打倒岳不群。而且在横店的其他各类主播的直播间,也经常在喊这句话。看着他这种锲而不舍的精神,真怀疑他是不是横店风云之西瓜嘉年华落幕,横店三大门派表现及收获如何?西瓜嘉年华已经落下了帷幕,众多的主播也对这次盛典进行了全程的记录。这一次的盛典也是举办的相当的精彩出色。左起十三,巧克力,农人老肥接上一篇文章,这一次横店圈也是多方云集,三大门派齐查理马特的宫相世家铁锤查理封建采邑建国准备宫相世家查理马特(CharlesMartel,688741)法兰克王国墨洛温王朝末期的宫相。他抚平内乱,抗击外敌,实行采邑改革,为后来加洛林王朝的建立奠定基础。出生于法兰克王国贵族
重返游戏战神PC版配置要求公布,最低GTX960即可游玩本内容来源于什么值得买APP,观点仅代表作者本人作者ACG头号玩家索尼今日公布了战神PC版配置要求,PC版将于2022年1月15日发售,售价279元,包含中文。特点如下1原生4K,游戏日报PUBG永久免费!原神获TGA年度手游!施瓦辛格代言WOT每天一篇游戏资讯汇总,为你带来最新鲜,最劲爆的游戏资讯。足不出户看尽圈内大事小事,成为游戏圈中的百事通。新的一年,所长会继续努力把优质的内容带给大家!游戏网游绝地求生明年起成为免费原神获TGA2021最佳移动游戏奖项,为玩家送上1600原石IT之家12月10日消息,在今日举行的TGA2021颁奖典礼上,官方公布了多个奖项提名和重磅新作信息,目前各大奖项正陆续颁布当中。目前,原神获得最佳移动游戏奖项2021英雄联盟全球CyberCat(赛博猫)具体玩法及公开版ROI上周游戏上线后,很多人在抢创世宠物繁殖,目前基本都在打金了,这几天还是有很多人问我CyberCat(赛博猫)这款游戏怎么玩,今天就来介绍一下这款游戏开服后的具体玩法及ROI废话不多天堂W怎么下载注册下载注册教程天堂的续作天堂W,已经开始了预载小伙伴们蜂拥而至,想要赶快体验游戏,为了小伙伴们的游戏体验,小编为大家准备了天堂W下载教程以及天堂W账号注册预载更新教程可供参考。天堂W怎么下载注册战地2042大量概念图火箭发射场原本有洪水根据战地2042的概念图,火箭发射场地图原计划有一个洪水事件,但在正式版游戏中这一动态活动被取消。从概念图可以看到,火箭发射场地图有潮汐,在交战中期,潮水会漫过河堤淹没地图的部分地英雄联盟的小彩蛋有哪些?1曙光女神的被动对所有带墨镜的英雄或皮肤造型伤害都会1,婕拉受到她的技能攻击会变大一点,来自植物的光合作用。2婕拉和塞恩相互击杀会获得额外的一点点金币2金币,致敬植物大战僵尸。3茂暗黑破坏神不朽慢慢提升自己,并且刷刷刷中遇到惊喜游戏暗黑破坏神不朽慢慢提升自己,并且刷刷刷中遇到惊喜。暗黑就是刷刷刷,我喜欢的也是刷刷刷,刷刷刷慢慢提升自己,并且刷刷刷中遇到惊喜。做成手游绝对会被卡关逼氪的,而且你绝对遇不到惊喜整天靠玩游戏赚钱,游戏搬砖天天玩游戏真的能赚钱吗,游戏搬砖是什么?不管端游手游,随着游戏市场需求,一部分玩家靠在游戏中赚钱,网称游戏搬砖。玩游戏也确实能赚钱,勤奋一点甚至不比在外奔波赚的少,当然有人是下班业不可思议!XYG晋级四强把水友看懵了,就连拖米都爆出了排比句本周,由斗鱼直播的王者荣耀KPL季后赛,进入到了败者组第二轮赛程!身为斗鱼平台王者荣耀领域的超人气主播拖米,对本周四场比赛进行了全程OB解说,下面就来一起看看拖米对这周比赛的看法吧方舟生存进化手游恐熊领土意识超强,靠近它就有可能被攻击在沙盒手游方舟生存进化手游的世界里,玩家们能够遇见400多种来自于古代的生物,这些生物的年代覆盖面很广,有侏罗纪时期的恐龙泥盆纪里面的三叶虫等等,其中也包含了冰河时期出现的巨型大熊