当前位置: 首页 > news >正文

深入元空间

元空间是干嘛的?

元空间存储的是类的相关信息,就是类的运行时表达。包括:

  1. Class文件

  1. 类的结构和方法

  1. 常量

  1. 注解

  1. 代码优化

JDK1.8分界

在1.8版本之前,类的meta信息、类变量、字符串常量池都存储在永久代。

1.8版本以后,类变量、实例变量、字符串常量池都在堆,meta放到了元空间

元空间上的内存分配

类首次使用的时候,由类加载器锁定Class文件的位置,并在元空间分配内存。类加载器是在堆内存上的,但是元空间的内存是归属于这个类加载器对象的。后续再使用同一类型,不再分配新的元空间内存了,因为使用的Class是同一个。

bootstrap类加载器和application类加载器是不会被回收的,而动态类加载器,在其负责加载的类对象不再使用时会被回收。

元空间的内存大小

元空间的内存大小,默认和本地内存大小一样。但是可以通过-XX:MetaspaceSize指定元空间的内存大小。

元空间在以下两种情况下会触发垃圾回收:

  1. OOM发生

  1. 元空间的内存占用超过了JVM的阈值

默认阈值的大小就是-XX:MetaspaceSize,可以通过-XX:MinMetaspaceFreeRatio和-XX:MaxMetaspaceFreeRatio来指定。

元空间内存回收

元空间分配的内存回收的前提是对应的类加载器不再使用。

类加载器被回收的前提是,这个类加载器负责的相关类的实例不再使用。

此时,存在两个类型为O的对象,一个类型为P的对象,对应的类加载器的实例是深蓝色的那个圆。元空间中分配了相关空间给O和P类存储相关信息。

如果两个O类型的对象不再使用,此时两个实例不再对应栈上的任何引用,但是尚未进行垃圾回收。

完成一次垃圾回收,此时O类型的两个对象已被清理,剩下的P类型的对象和类加载器的实例一起被复制到了Survivor区域。但是,此处虽然O类型不再使用,但是对应的元空间的内存占用不能被释放,因为这个类加载器,不仅仅负责O类型,还负责P类型,而P类型还存在实例,因此不可以被回收。

最终,P对象也被释放,meta空间也完成了释放。

http://www.lryc.cn/news/34068.html

相关文章:

  • 前端技术和框架
  • 02从零开始学Java之Java到底是个啥?
  • KEIL5中头文件路劲包含问题
  • 机智云目前我用过最便捷的物联网快速开发方案
  • MySQL基础篇1
  • AQS 源码解读
  • 使用 DataLoader 加载数据报错‘expected sequence of length 4 at dim 1 (got 0)’
  • 第十四届蓝桥杯第三期模拟赛B组C/C++原题与详解
  • 致敬三八女神节,致敬IT女生
  • 【Go语言学习笔记】数据
  • puzzle(0919)六宫数局
  • 脑机接口科普0016——独立BCI与非独立BCI
  • 女神节告白代码
  • 【数据结构】单链表:头部操作我很行,插入也不用增容!!!
  • SpringBoot——使用WebSocket功能
  • 博弈论小课堂:非零和博弈(实现双赢)【纳什均衡点】
  • 数组中的逆序对
  • C++基础了解-01-基础语法
  • phpmyadmin 文件包含(CVE-2014-8959)
  • SpringBoot集成MyBatis
  • MySQL-索引
  • 【STM32存储器映射-寄存器基地址-偏移】
  • 【华为OD机试2023】最多颜色的车辆 C++ Java Python
  • 特斯拉后端面试(部分)
  • 【python】使用python将360个文件夹里的照片,全部复制到指定的文件夹中,并且按照顺序重新命名
  • 【C语言】3天速刷C语言(初识)
  • 如何搞定MySQL锁(全局锁、表级锁、行级锁)?这篇文章告诉你答案!太TMD详细了!!!
  • 云计算生态该怎么做?阿里云计算巢打了个样
  • 小樽C++ 多章⑧ (贰) 指针与数组
  • MXNet的机器翻译实践《编码器-解码器(seq2seq)和注意力机制》