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

jdk8中元空间是否会触发GC

在 JDK 8 中,元空间(Metaspace)确实可以触发 GC(垃圾回收)。

背景知识

在 JDK 8 之前,Java 使用永久代(PermGen)来存储类的元数据(如类的字节码、名称、常量池等)。在 JDK 8 中,永久代被移除了,取而代之的是元空间。元空间不是在堆内存中分配的,而是使用本地内存(native memory)。

什么时候元空间会触发 GC

元空间可以触发一种特定的垃圾回收,称为类卸载(Class Unloading)。当类的元数据充满元空间时,JVM 会尝试回收未被使用的类及其关联的类加载器。这意味着如果元空间的使用接近其最大限制(可以通过 -XX:MaxMetaspaceSize 参数设置),JVM 会触发 Full GC 来进行类卸载,从而释放元空间中的内存。

参数设置

  • -XX:MetaspaceSize:设置元空间的初始大小,当达到这个大小时会触发垃圾回收来进行类卸载和压缩。
  • -XX:MaxMetaspaceSize:设置元空间的最大大小,如果没有设置,元空间会根据需要动态增长,直到达到系统内存的上限。

示例

以下是一个简单示例,展示如何通过参数控制元空间大小并观察 GC 行为:

public class MetaspaceExample {public static void main(String[] args) {for (int i = 0; i < 100000; i++) {createClass();}}private static void createClass() {// 使用 ASM 或 CGLIB 动态生成类// 这里仅作示例,可以使用第三方库来动态生成类}
}

运行这个程序并使用以下 JVM 参数:

java -XX:MetaspaceSize=16m -XX:MaxMetaspaceSize=64m -XX:+PrintGCDetails MetaspaceExample

在上述参数设置中,-XX:+PrintGCDetails 可以输出详细的 GC 日志,以便观察元空间相关的 GC 行为。

GC 日志

在 GC 日志中,您可以看到类似以下的输出,当元空间达到 MetaspaceSize 时会触发垃圾回收:

[Full GC (Metadata GC Threshold) ...

这表明垃圾回收是由于元空间的元数据达到阈值而触发的。

总结

在 JDK 8 中,元空间是会触发 GC 的,特别是在类卸载过程中。当元空间达到某个阈值时,JVM 会进行 Full GC 来回收未使用的类及其元数据。通过调整元空间的相关参数,可以控制元空间的大小和垃圾回收行为。

相关文章:

  • GitLab的原理及应用详解(四)
  • 打造坦克游戏:类方法的深入解析
  • 【ARMv7-A】——ATPCS(ARM-Thumb 过程调用标准)
  • 邦注科技三机一体除湿干燥机在工业中的应用
  • 达梦数据库登报测评命令
  • 适合下班做的副业兼职、1天挣300,7天涨粉2万
  • HTML5和CSS3的新特性
  • K8s集群中的Pod调度约束亲和性与反亲和性
  • 分布式事务解决方案(最终一致性【可靠消息解决方案】)
  • grafana大盘展示node_expod节点
  • springboot发送短信验证码,结合redis 实现限制,验证码有效期2分钟,有效期内禁止再次发送,一天内发送超3次限制
  • 【C++】牛客——小红的口罩
  • NodeJS安装并生成Vue脚手架(保姆级)
  • 从需求角度介绍PasteSpider(K8S平替部署工具适合于任何开发语言)
  • zabbix监控mysql
  • CentOS从零开始部署Nodejs项目
  • create-react-app项目添加less配置
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • ES6简单总结(搭配简单的讲解和小案例)
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Git初体验
  • Java多态
  • js操作时间(持续更新)
  • JS字符串转数字方法总结
  • learning koa2.x
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • SQL 难点解决:记录的引用
  • TypeScript实现数据结构(一)栈,队列,链表
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 关于springcloud Gateway中的限流
  • 规范化安全开发 KOA 手脚架
  • 模型微调
  • 消息队列系列二(IOT中消息队列的应用)
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • $forceUpdate()函数
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)常见O(n^2)排序算法解析
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (PySpark)RDD实验实战——求商品销量排行
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (过滤器)Filter和(监听器)listener
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (七)理解angular中的module和injector,即依赖注入
  • (区间dp) (经典例题) 石子合并
  • (四) 虚拟摄像头vivi体验
  • (四)js前端开发中设计模式之工厂方法模式
  • (四)Linux Shell编程——输入输出重定向
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)德国人的记事本