加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

这一次,终于体系的进修了 JVM 内存布局

发布时间:2019-11-05 16:51:49 所属栏目:建站 来源:平头哥
导读:最近在看《 JAVA并发编程实践 》这本书,内里涉及到了 Java 内存模子,通过 Java 内存模子顺理成章的相识到 JVM 内存布局,关于 JVM 内存布局大概大学的教室上先生给我们讲过,大概没有,横竖我对这一块有一点点的相识,可是从来没有体系的进修过,以是这
副问题[/!--empirenews.page--]

 这一次,终于体系的进修了 JVM 内存布局

最近在看《 JAVA并发编程实践 》这本书,内里涉及到了 Java 内存模子,通过 Java 内存模子顺理成章的相识到 JVM 内存布局,关于 JVM 内存布局大概大学的教室上先生给我们讲过,大概没有,横竖我对这一块有一点点的相识,可是从来没有体系的进修过,以是这一次我把《 深入领略Java假造机JVM高级特征与最佳实践 》、《 Java假造机类型 Java SE 8版 》这两本书中关于 JVM 内存布局的部门都看了一遍,算是对 JVM 内存布局有了新的熟悉。JVM 内存布局是指:Java 假造机界说了多少种措施运行时代会行使的运行时数据区,个中有一些会跟着假造机启动而建设,跟着假造机退出而烧毁,另一些则与线程逐一对应,跟着线程的开始而建设,跟着线程的竣事而烧毁。详细的运行时数据区如下图所示:

这一次,终于体系的进修了 JVM 内存布局

JVM 内存布局

在 Java 假造机类型中,界说了五种运行时数据区,别离是 Java 堆、要领区、假造机栈、当处所法区、措施计数器,个中 Java 堆和要领区是线程共享的。接下来就详细看看这 五种运行时数据区。

Java 堆(Heap)

Java 堆是全部线程共享的一块内存地区,它在假造机启动时 就会被建设,而且单个 JVM 历程有且仅有一个 Java 堆。Java 堆是用来存下班具实例及数组,也就是说我们代码中通过 new 要害字 new 出来的工具都存放在这里。以是这里也就成为了垃圾接纳器的首要勾当营地了,于是它就有了一个体名叫做 GC 堆,按照垃圾接纳器的法则,我们可以对 Java 堆举办进一步的分别,详细 Java 堆内存布局如下图所示:

这一次,终于体系的进修了 JVM 内存布局

Java 堆内存布局

我们可以将 Java 堆分别为新生代和晚年月两个大模块,在新生代中,我们又可以进一步分为 Eden 空间、From Survivor 空间(s0)、To Survivor 空间(s1),Survivor 空间有一个为空,用于产生 GC 时存放存活工具,晚年月存放的是颠末多次 Minor GC 如故存活的工具可能是一些大工具,FGC 就是产生在晚年月。

上面就是 Java 堆的详细布局,我们也知道 Java 堆中的各空间巨细,我们是可以动态节制的,这个在图中我也举办了简朴的标注,下面我们一路来具体的相识一下这三个参数:

  • -Xms:JVM启动时申请的初始Heap值,默以为操纵体系物理内存的1/64,譬喻-Xms20m
  • -Xmx:JVM可申请的最大Heap值,默认值为物理内存的1/4,譬喻-Xmx20m,我们最好将 -Xms 和 -Xmx 设为沟通值,停止每次垃圾接纳完成后JVM从头分派内存;
  • -Xmn:配置新生代的内存巨细,-Xmn 是将NewSize与MaxNewSize设为同等,我们也可以别离配置这两个参数

在 Java 堆中会产生 OOM 非常,当我们的 Java 堆内有足够的空间去完成实例分派时,而且堆也无法扩展,将会抛出我们常见的OutOfMemoryError 非常,如下图所示:

这一次,终于体系的进修了 JVM 内存布局

OutOfMemoryError 非常

关于 OOM 非常,我照旧想多说一句,网上有一道很是火的口试题:JVM 堆内存溢出后,其他线程是否可继承事变?,我小我私人认为不少答复是错误的,有乐趣的可以研究一下。

要领区(Method Area)

要领区(Method Area)与 Java 堆一样,是各个线程共享的内存地区,是 Java 假造机中唯二的内存共享地区。在 Java 假造机类型中是这样界说要领区的:它存储了每个类的布局信息,譬喻运行时常量池、字段、要领数据、结构函数和平凡要领的字节码内容,还包罗一些在类、实例、接口初始化时用到的非凡要领。

要领区在假造机启动的时辰被建设,固然要领区是堆的逻辑构成部门,可是简朴的假造机实现可以选择在这个地区不实现垃圾网络与压缩,要领区在现实内存空间中可以不是持续的,对付要领区的容量,你可所以牢靠的,也可以跟着措施的执动作态扩展,而且在不必要过多空间时自动紧缩。

上面都是 Java 假造机中的类型,来看看详细的实现,拿我们常用的 HotSpot 假造机来说,在 JDK1.8 之前,要领区也被称作为永世代,这个要领区会产生我们常见的 java.lang.OutOfMemoryError: PermGen space 非常,我们也可以通过启动参数来节制要领区的巨细:

  • -XX:PermSize 配置最小空间
  • -XX:MaxPermSize 配置最大空间

在 JDK1.8 之后,HotSpot 假造机对要领区举办了不小的窜改,彻底移除了永世代,将原本存放在永世代的数据迁徙至 Java 堆 可能 Metaspace,要领区被移至到了 Metaspace,字符串常量移至 Java Heap,换句话说就是 JDK1.8 开始,Metaspace 也就是我们所谓的要领区,为什么要做这个改变呢?大概是基于以下两点缘故起因:

  • 因为 PermGen 内存常常会溢出,激发恼人的 java.lang.OutOfMemoryError: PermGen,因此 JVM 的开拓者但愿这一块内存可以更机动地被打点,不要再常常呈现这样的 OOM
  • 移除 PermGen 可以促进 HotSpot JVM 与 JRockit VM 的融合,由于 JRockit 没有永世代。

我们也可以通过配置参数来节制 Metaspace 的空间巨细,首要有以下几个呼吁:

  • -XX:MetaspaceSize :分派给类元数据空间(以字节计)的初始巨细。MetaspaceSize的值配置的过大会延迟垃圾接纳时刻。垃圾接纳事后,引起下一次垃圾接纳的类元数据空间的巨细也许会变大。
  • -XX:MaxMetaspaceSize:分派给类元数据空间的最大值,高出此值就会触发Full GC,此值默认没有限定,但应取决于体系内存的巨细。JVM会动态地改变此值。
  • -XX:MinMetaspaceFreeRatio:暗示一次GC往后,为了停止增进元数据空间的巨细,空闲的类元数据的容量的最小比例,不足就会导致垃圾接纳。
  • -XX:MaxMetaspaceFreeRatio:暗示一次GC往后,为了停止增进元数据空间的巨细,空闲的类元数据的容量的最大比例,不足就会导致垃圾接纳。

Java 假造机栈(JVM Stacks)

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读