JVM 元空间、java中的元空间

这篇具有很好参考价值的文章主要介绍了JVM 元空间、java中的元空间。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

元空间

原空间(Meta Space)

​ 用于存放类信息、常量、静态变量、JIT即时编译器百年以后的机器代码等数据等。例如:java.lang.Object类的元信息、Integer.MAX_VALUE等常量。

JDK1.6

HotSpot JVM 使用Method Area方法区存储,也叫永久代(Permanent Generation)

  1. 方法区和“永久代(Permanent Generation)”的区别:方法区是JVM的规范,而永久代(Permanent Generation)是JVM规范的一种实现,并且只有HotSpot JVM才有永久代“Permanent Generation”,而对于其他类型的虚拟机。如JRockit(Oracle)、J9(IBM)并没有。
  2. 方法区是一片连续的堆空间,当JVM加载的类的信息容量超过了最大可分配空间,虚拟机会抛出OutOfMemoryError : PermGenspace 的Error 。
  3. 永久代的GC是和老年代( old generation )捆绑在一起的,无论谁满了,都会触发永久代和老年代的垃圾收集。
  4. 可以通过-XX:PermSize=N设置方法区(永久代)初始空间,-XX:MaxPermSize=N设置方法区(永久代)最大空间,超过这个值将会抛出错误:java.lang.outOfMemoryError: PermGen

JDK1.7

将字符串常量池、静态变量转移到了堆区。

JDK1.8:正式移除永久代,采用Meta Space元空间代替

​ 元空间的本质和永久代类似,都是对JVM规范中方法区的一种具体实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制,但可以通过运行参数来指定元空间的大小。
​ Java 8 中PermGen永久代为什么被移出HotSpot JVM ?
​ ·由于PermGen内存经常会溢出,容易抛出java.lang.outOfMemoryError: PermGen错误;
​ ·移除PermGen 可以促进HotSpot JVM与JRockit VM的融合,因为JRockit没有永久代;

示例1:不断的生成新的字符串,快速的消耗内存。通过JDK1.6、JDK1.7和JDK1.8分别运行。

public class TestOOM {
    static String base = "ApeSource";
    public static vois main(String[] args){
        List<String> list = new ArrayLiat<String>();
        for(int i = 0;i < Integer.MAX.VALUE;i++){
            String str = base + base;
            base = str;
           	list.add(str.intern());
        }
    }
}

JDK 1.6

JVM 元空间、java中的元空间,JVM,jvm,java,开发语言

JDK 1.7

JVM 元空间、java中的元空间,JVM,jvm,java,开发语言

JDK 1.8

JVM 元空间、java中的元空间,JVM,jvm,java,开发语言

​ 上述运行结果可以看出,相同的代码,在JDK 1.6会出现“PermGen Space”的永久代内存溢出,而在JDK 1.7和JDK 1.8中,会出现"Java heap space"堆内存溢出,并且DK 1.8中 PermSize和MaxPermGen参数已经无效。因此,在JDK 1.7和JDK 1.8中,已经将字符串常量由永久代转移到堆中,并且JDK 1.8中已经完全移除了永久代,采用元空间来代替。

示例2:在JDK 8下重新运行一下运行测试代码TestoOM,指定MetaSpacesize和MaxMetaSpacesize的大小,输出结果如下:

JVM 元空间、java中的元空间,JVM,jvm,java,开发语言

  • -XX:MetaspaceSize参数:主要控制Meta Space GC发生的初始阈值,也就是最小阈值,当使用的Meta Space空间到达MetaspaceSize的时候,就会触发Metaspace的GC。
    • XX:MaxMetaspaceSize参数:最大空间,默认是没有限制的。在jvm启动的时候,并不会分配 MaxMetaspaceSize这么大的一块内存出来,metaspace是可以一直扩容的,直到到达MaxMetaspacesize。

JVM 元空间、java中的元空间,JVM,jvm,java,开发语言文章来源地址https://www.toymoban.com/news/detail-789938.html

到了这里,关于JVM 元空间、java中的元空间的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java JVM中的GC机制详解

    垃圾回收(Garbage Collection,简称GC)机制是JVM中最重要的部分之一。在Java程序运行的过程中,运行时数据区域(包括堆和栈等内存区域)一直都需要使用和回收内存空间。由于Java中的内存分配方式是动态的,所以在程序运行期间,其内存空间的占用量会不断变化。 如果Java程

    2024年02月14日
    浏览(42)
  • 什么是Java中的JVMTI(JVM Tool Interface)?

    Java中的JNI(Java Native Interface)和JVMTI(JVM Tool Interface)都是与Java运行时环境(JVM)交互的工具,但它们有不同的目的和使用场景。下面我从新手的角度来幽默地解释一下它们的区别和用途。 JNI:Java Native Interface,就是Java Native库。当你需要在本地代码(C、C++等)中调用Java代

    2024年02月14日
    浏览(40)
  • 【JVM】Java堆 :深入理解内存中的对象世界

    人不走空                                                                            目录         🌈个人主页:人不走空       💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 ​编辑 什么是Java堆? 作用和特点 1. 存储对象实例 2. 垃圾收集 3. 对象

    2024年01月19日
    浏览(50)
  • 深入理解JVM虚拟机第二十七篇:详解JVM当中InvokeDynamic字节码指令,Java是动态类型语言么?

     😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨ 2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群: 583783824   📚📚  工作微信: BigTreeJava 拉你进微信群,免费领取! 🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞

    2024年02月04日
    浏览(44)
  • Java开发环境简介(JDK、JRE、JVM)

    目录 1、Java开发环境 2、JDK和JRE 3、JDK下载和安装 3.1 下载 3.2 安装 3.3 配置path环境变量 JDK8配置方案1:只配置path ⭐JDK8配置方案2:配置JAVA_HOME+path(推荐) path配置小结 JDK17配置方案:自动配置 4、Java核心机制:JVM 补充:Java字节码 JVM的优点 JVM的缺点 JVM的运行过程 5、Java程序

    2024年02月21日
    浏览(45)
  • Java开发 - 你不知道的JVM优化详解

    代码上的优化达到一定程度,再想提高系统的性能就很难了,这时候,优秀的程序猿往往会从JVM入手来进行系统的优化。但话说回来,JVM方面的优化也是比较危险的,如果单单从测试服务器来优化JVM是没有太大的意义的,不同的服务器即使环境相同,访问流量方面也是不一样

    2024年02月07日
    浏览(41)
  • JVM执行引擎——为什么Java是半编译半解释语言

            起初设计者的初衷是将字节码文件翻译为机器语言的指令来执行即可,就诞生了解释器。但是采用一行行来解释的 效率比较低 ,JIT编译器会将编译后的机器码做一个缓存的操作,放在方法区的JIT代码缓存中,是否需要启用JIT编译器直接将字节码编译为机器码,则

    2024年02月15日
    浏览(49)
  • JAVA后端开发面试基础知识(一)——JVM

    Class loader(类装载) 根据给定的全限定名类名(如: java.lang.Object)来装载class文件到 Runtime data area中的method area。 Execution engine(执行引擎) 执行classes中的指令。 Native Interface(本地接口) 与native libraries交互,是其它编程语言交互的接口。 Runtime data area(运行时数据区域) 这就是我们常说

    2024年03月10日
    浏览(58)
  • Java后端开发面试题——JVM虚拟机篇

    目录 什么是程序计数器? 你能给我详细的介绍Java堆吗? 什么是虚拟机栈 1. 垃圾回收是否涉及栈内存? 2. 栈内存分配越大越好吗? 3. 方法内的局部变量是否线程安全? 4.什么情况下会导致栈内存溢出? 5.堆栈的区别是什么? 能不能解释一下方法区(元空间)? 常量池 运行

    2024年02月09日
    浏览(39)
  • 关于java k8s容器环境中的jvm配置与优化

    环境 版本 备注 k8s v1.22+ 配置cpu/mem limit、健康/就绪检查 openjdk 8 openjdk version \\\"1.8.0_342\\\" k8s容器化(docker)环境更好的解决了 java app 运行环境的封装问题。但存在着一些限制,比如 Java 并不能发现 pod 设置的内存限制(mem limit,java 默认以宿主机的内存为基准),当 java 内存占用

    2024年02月16日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包