Java8 JVM内存模型

妖狐艹你老母 2023-02-15 15:59 276阅读 0赞

4### 一、JDK1.8 JVM内存模型
在这里插入图片描述

二、各区域介绍

1、程序计数器
指向当前线程正在执行的字节码指令的行号(地址)

2、本地方法栈
为虚拟机使用的Native方法服务

3、虚拟机栈
每个Java方法在被调用的时候都会创建一个栈帧,用来存储局部变量表(八大原始类型、封装类型)、作数栈、动态链接、方法出口
在这里插入图片描述
4、堆
几乎所有的对象实例及数组都在堆上进行分配;生明的全局变量。在jdk1.7中,符号引用(Symbols)转移到了Native Memory;字符串常量池(interned strings)转移到了Java Heap;类的静态变量(class statics)转移到了Java Heap。
在这里插入图片描述

5、方法区
HotSpot虚拟机上开发、部署的程序员来说,方法区也称作永久代。在Java8中,时代变了,Hotspot取消了永久代。
6、元数据区
Java8中,HotSpot取消了永久代,元空间(Metaspace)登上舞台,方法区存在于元空间(Metaspace)。同时,元空间不再与堆连续,而且是存在于本地内存(Native memory)。

本地内存(Native memory),也称为C-Heap,是供JVM自身进程使用的。当Java Heap空间不足时会触发GC,但Native memory空间不够却不会触发GC。
如下图所示:
在这里插入图片描述

针对Java8的调整,我们再次对内存结构图进行调整。

元空间存在于本地内存,意味着只要本地内存足够,它不会出现像永久代中“java.lang.OutOfMemoryError: PermGen space”这种错误。看上图中的方法区,是不是“膨胀”了。

默认情况下元空间是可以无限使用本地内存的,但为了不让它如此膨胀,JVM同样提供了参数来限制它使用的使用。

-XX:MetaspaceSize,class metadata的初始空间配额,以bytes为单位,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当的降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize(如果设置了的话),适当的提高该值。
-XX:MaxMetaspaceSize,可以为class metadata分配的最大空间。默认是没有限制的。
-XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为class metadata分配空间导致的垃圾收集。
-XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为class metadata释放空间导致的垃圾收集。

永久代为什么被替换了
思考一下,为什么使用元空间替换永久代?

表面上看是为了避免OOM异常。因为通常使用PermSize和MaxPermSize设置永久代的大小就决定了永久代的上限,但是不是总能知道应该设置为多大合适, 如果使用默认值很容易遇到OOM错误。

当使用元空间时,可以加载多少类的元数据就不再由MaxPermSize控制, 而由系统的实际可用空间来控制。

更深层的原因还是要合并HotSpot和JRockit的代码,JRockit从来没有所谓的永久代,也不需要开发运维人员设置永久代的大小,但是运行良好。同时也不用担心运行性能问题了,在覆盖到的测试中, 程序启动和运行速度降低不超过1%,但是这点性能损失换来了更大的安全保障。

发表评论

表情:
评论列表 (有 0 条评论,276人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java jvm 内存模型

    Java 的 JVM 内存模型是用来描述 Java 程序如何在虚拟机上分配和使用内存的。它由四个部分组成:堆、栈、方法区和本地方法栈。 堆是 JVM 中最大的内存区域,用于存

    相关 JVMjava内存模型

    一、硬件的效率与一致性        在计算机中处理器是用来处理任务的,而内存是用来存储数据的,计算器处理任务仅仅靠处理器是无法完成任务的,通常需要读取内存数据,处理器处

    相关 Java8内存模型

    一、JVM 内存模型   根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。 ![820406-20160326200119386

    相关 JVMJava内存模型

    简述 Java内存模型(Java Memory Model,JMM),是用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现Java程序在各种 平台下都能达到一致的内存访问

    相关 JVMJava内存模型

    JVM—Java内存模型 并发处理的广泛应用是使得Amdahl定律代替摩尔定律 成为计算机性能发展源动力的根本原因, 也是人类"压榨"计算机运算能力的最有利武器