JVM的元空间了解吗?

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

笔者近期在面试的时候被问到了这个问题,元空间也是Java8当时的一大重大革新,之前暑期实习求职的时候有专门看过,但是近期秋招的时候JVM相关的内容确实有点生疏了,故在此进行回顾。


结构

首先,我们应了解JVM的堆结构,主要有两个版本及Java7以及Java8。

JVM的元空间了解吗?,Java,面试,jvm

元空间的前身-永久代(Permanent Generation)

JAVA永久代的演化

  • JDK7开始,字符串常量和符号引用等就被移出永久代,字符串字面量迁移至Java堆 /符号引用转移到了native heap。
  • JDK8,永久代被彻底地移出了JVM,取而代之的是元空间MetaSpace,把类的元数据放到本地化的堆内存native heap中,这块区域就叫Metaspace。

JDK 1.7 为什么要将字符串常量池移动到堆中?

主要是因为永久代(方法区实现)的 GC 回收效率太低,只有在整堆收集 (Full GC)的时候才会被执行 GC。Java 程序中通常会有大量的被创建的字符串等待回收,将字符串常量池放到堆中,能够更高效及时地回收字符串内存。

作用

JVM的MetaSpace存储JVM的元信息,而且是在堆外存储。主要涉及以下内容:

  • JVM中类的元数据在Java堆中的存储区域
  • Java类对应的HotSpot虚拟机中的内部表示也存储在这里
  • 类的层级信息,字段,名字
  • 方法的编译信息及字节码
  • 变量
  • 常量池和符号解析

注意到,堆外内存就是把内存对象分配在堆(新生代+老年代+永久代)以外的内存,这些内存直接受操作系统管理(而不是虚拟机),这样做的结果就是能够在一定程度上减少垃圾回收对应用程序造成的影响。

理论上以上信息占用的内存空间在服务启动后就会比较稳定,并不会出现上文中提到的一直增长的,甚至导致OOM的情况出现。


回到正题,元空间的引入是为了替代原来使用的 PermGen 区域,PermGen 区域主要用于存储永久代(Permanent Generation)中的类信息和常量池信息。随着Java应用程序对内存需求的不断增加,PermGen 区域经常会出现内存泄漏和 OutOfMemoryError 的问题,因此引入了元空间来解决这些问题。

元空间的大小可以通过参数配置的方式指定。在启动JVM时,可以使用以下参数来指定元空间的大小:

-XX:MaxMetaspaceSize:指定元空间的最大大小,单位是字节。

-XX:MinMetaspaceSize:指定元空间的最小大小,单位是字节。

-XX:InitialMetaspaceSize:指定元空间的初始大小,单位是字节。

这些参数可以通过命令行或配置文件的方式传递给JVM。在默认情况下,元空间的大小是动态调整的,根据应用程序的需要自动扩展或缩小。当元空间快要达到最大或最小大小时,JVM会尝试进行垃圾回收来释放不再使用的类信息和常量池信息。


参考资料

JVM Metaspace OOM的排障以及原理分析 - 掘金

https://www.cnblogs.com/snowwhite/p/9532311.html

Java内存区域详解(重点) | JavaGuide(Java面试 + 学习指南)文章来源地址https://www.toymoban.com/news/detail-663381.html

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

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

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

相关文章

  • java八股文面试[JVM]——JVM内存结构

    参考: JVM学习笔记(一)_卷心菜不卷Iris的博客-CSDN博客 JVM 是运行在操作系统之上的,它与硬件没有直接的交互 JVM内存结构:   方法区:存储已被虚拟机加载的类元数据信息(元空间) 堆:存放对象实例,几乎所有的对象实例都在这里分配内存 虚拟机栈:虚拟机栈描述的是

    2024年02月12日
    浏览(47)
  • 深入JVM了解Java对象实例化过程

    new :最常见的方式、 Xxx 的静态方法, XxxBuilder/XxxFactory 的静态方法 Class的newInstance 方法:反射的方式,只能调用空参的构造器,权限必须是public Constructor的newInstance(XXX) :反射的方式,可以调用空参、带参的构造器,权限没有要求 使用 clone() :不调用任何的构造器,要求当

    2023年04月24日
    浏览(39)
  • 【JAVA面试】JVM

    提示:文章先作为初版,等后续时间充足后,补充更深的内容 JVM中的垃圾回收算法可以分为两种类型: 基于引用计数 的垃圾回收算法和 基于可达性分析 的垃圾回收算法。目前主流的JVM垃圾回收算法都是基于 可达性分析 的。 引用计数算法 引用计数算法是一种简单的垃圾回

    2024年02月03日
    浏览(40)
  • 3.Java面试题—JVM基础、内存管理、垃圾回收、JVM 调优

    一篇文章掌握整个JVM,JVM超详细解析!!! JVM (Java虚拟机) 是运行 Java 字节码 的 虚拟机 。 JVM 针对 不同系统 有 特定实现 ( Windows 、 Linux 等),目的是 同样的代码 在 不同平台 能运行出 相同的结果 。 Java 语言 要经过 编译 和 解释 两个步骤: 编译 :通过 编译器 将 代码 一

    2024年02月15日
    浏览(50)
  • Java面试题之JVM

    重新自己整理过后的JVM相关面试题,这里包括八股文和之前面试遇到的问题,后续会持续更新~ 程序计数器 :用于存放当前执行的字节码的行号指示器。它负责在多线程的情况下提供每个线程独立执行的能力,并保证每个线程都能正常运行。 java虚拟机栈 :与线程一一对应,

    2024年02月02日
    浏览(43)
  • Java面试汇总——jvm篇

    目录 JVM的组成: 1、JVM 概述(⭐⭐⭐⭐) 1.1 JVM是什么? 1.2 JVM由哪些部分组成,运行流程是什么? 2、什么是程序计数器?(⭐⭐⭐⭐) 3、介绍一下Java的堆(⭐⭐⭐⭐) 4、虚拟机栈(⭐⭐⭐⭐) 4.1 什么是虚拟机栈? 4.2 垃圾回收是否涉及栈内存? 4.3 栈帧内存分配越大越好吗? 4.4

    2024年01月17日
    浏览(43)
  • JAVA 学习 面试(三)JVM篇

    JAVA虚拟机(JVM) JDK、JRE、JVM的关系 JDK JRE = Java虚拟机 + Java核心类库 JVM组成结构: (1)类加载器 (2)运行时数据区 (3)执行引擎 (4)本地库接口 类加载器 Java程序运行的时候,编译器将Java文件编译成平台无关的Java字节码文件(.class),接下来对应平台JVM对字节码文件进

    2024年01月22日
    浏览(53)
  • “深入剖析JVM内部机制:了解Java虚拟机的工作原理“

    标题:深入剖析JVM内部机制:了解Java虚拟机的工作原理 摘要:本文将深入剖析JVM内部机制,详细介绍Java虚拟机的工作原理。我们将探讨JVM的组成部分、类加载过程、内存管理、垃圾回收以及即时编译等关键概念。此外,还将提供示例代码来帮助读者更好地理解JVM的内部机制

    2024年02月11日
    浏览(44)
  • JAVA工程师面试专题-JVM篇

    目录 一、运行时数据区 1、说一下JVM的主要组成部分及其作用? 2、说一下 JVM 运行时数据区 ? 3、说一下堆栈的区别 4、成员变量、局部变量、类变量分别存储在什么地方? 5、类常量池、运行时常量池、字符串常量池有什么区别? 6、JVM为什么使用元空间替换永久代 二、垃

    2024年02月21日
    浏览(47)
  • java八股文面试[JVM]——垃圾回收

    参考:JVM学习笔记(一)_卷心菜不卷Iris的博客-CSDN博客 GC垃圾回收 面试题: JVM内存模型 以及分区,需要详细到每个区放什么 堆里面的分区:Eden,survival from to,老年代,各自的特点。 GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方 针

    2024年02月11日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包