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

JVM 调优篇7 调优案例2-元空间的优化解决

一  元空间

1.1 功能概述

方法区(Method Area)与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、即时编译器编译后的代码等数据。虽然Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。

垃圾收集行为在这个区域是比较少出现的,其内存回收目标主要是针对常量池的回收和对类型的卸载。当方法区无法满足内存分配需求时,将抛出 OutOfMemoryError 异常。

二  案例实操优化

2.1 代码

2.2 参数设置

1.参数:

-XX:+PrintGCDetails -XX:MetaspaceSize=60m -XX:MaxMetaspaceSize=60m -Xss512K -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=e:/heapdumpMeta.hprof  -XX:SurvivorRatio=8 -Xms60M  -Xmx60M -Xloggc:e:/gc-oomMeta.log

2.3 启动

2.4 通过vm分析

2.4.1 实时查看

1.通过命令 jstat 查看堆变化:  设置的元空间60m,已经几乎用尽。几乎把整个方法区空间占用,所以得出的结论是方法区空间设置过小,或者存在大量由于反射生成的代理类

 查看堆内存变化

2.4.2 离线分析

读取dump文件

1.基本信息

2.oom信息

查看对象信息: 

1.运行期间生成了大量的代理类,导致方法区被撑爆,无法卸载

2. 应用长时间运行,没有重启

3. 元空间内存设置过小

2.4.3 优化解决

优化代码:将相同对象,就不再通过invoke,反射机制进行创建,放到缓存中。

enhancer.setUseCache(false),选择为true的话,使用和更新一类具有相同属性生成的类的静态缓存,而不会在同一个类文件还继续被动态加载并视为不同的类,这个其实跟类的equals()和hashCode()有关,它们是与cglib内部的class cache的key相关的。

查看结果:可以看到,几乎不变了,方法区也没有溢出。到此,问题基本解决

没有报oom异常,所以没有dump文件生成

查看堆动态变化:jstat -gc 4656 1000 5

查看vm

2.5 原因以及解决方案*

原因:

1.运行期间生成了大量的代理类,导致方法区被撑爆,无法卸载

2. 应用长时间运行,没有重启

3. 元空间内存设置过小

解决办法:

1. 检查是否永久代空间或者元空间设置的过小

2. 检查代码中是否存在大量的反射操作

3. dump之后通过mat检查是否存在大量由于反射生成的代理类

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【什么是B/S、C/S架构】
  • 408算法题leetcode--第11天
  • nginx架构篇(三)
  • PHP环境搭建
  • 数据结构--第七章查找
  • 机器翻译之Bahdanau注意力机制在Seq2Seq中的应用
  • Linux操作系统面试题记录
  • 国内可以使用的ChatGPT服务【9月持续更新】
  • 机器之心 | 阿里云Qwen2.5发布!再登开源大模型王座,Qwen-Max性能逼近GPT-4o
  • 【研发日记】嵌入式处理器技能解锁(六)——ARM的Cortex-M4内核
  • 新书速览|NestJS全栈开发解析:快速上手与实践
  • 数据结构之二叉树查询
  • JetLinks物联网学习(前后端项目启动)
  • HarmonyOS开发者基础认证考试试题
  • 生信初学者教程(七):数据库
  • 分享的文章《人生如棋》
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • js ES6 求数组的交集,并集,还有差集
  • Vue ES6 Jade Scss Webpack Gulp
  • 从PHP迁移至Golang - 基础篇
  • 第十八天-企业应用架构模式-基本模式
  • 给github项目添加CI badge
  • 京东美团研发面经
  • 力扣(LeetCode)56
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 三栏布局总结
  • 微服务核心架构梳理
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #Z2294. 打印树的直径
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • $.ajax()方法详解
  • (1)虚拟机的安装与使用,linux系统安装
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (zhuan) 一些RL的文献(及笔记)
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (实战篇)如何缓存数据
  • (原创)可支持最大高度的NestedScrollView
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .NET 8.0 发布到 IIS
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net 获取某一天 在当月是 第几周 函数
  • .Net 知识杂记
  • .NET_WebForm_layui控件使用及与webform联合使用
  • @Repository 注解
  • @Transactional事务注解内含乾坤?
  • [.net] 如何在mail的加入正文显示图片
  • []C/C++读取串口接收到的数据程序
  • [2016.7.Test1] T1 三进制异或
  • [20161101]rman备份与数据文件变化7.txt
  • [20171101]rman to destination.txt
  • [240903] Qwen2-VL: 更清晰地看世界 | Elasticsearch 再次拥抱开源!
  • [BZOJ 1040] 骑士