一次元空间FullGC导致OOM问题分析
原文,作者:kkyeer
原文需要翻墙,所以转载。
现象
-
观测平台告警:FullGC次数大于阈值,5分钟内大于11次,频次大概1-2周有一次
-
告警后服务概率性会自动恢复,控制台打印
Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "Thread-17" Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "SimpleAsyncTaskExecutor-1" -
不自动恢复时,服务对应容器会挂掉,需要被kill
#过程
-
首先查看监控平台截取的部分GC日志,发现FullGC出现在MetaSpace元空间
-
下载完整的GC日志分析,暂时未发现更多线索
-
将堆整体Dump下来,上传 HeapDump 网站分析,在“类加载器”视图发现有大量的
sun.reflect.DelegatingClassLoader类加载器,且大部分只加载了1个类:sun.reflect.GeneratedMethodAccessor6036。- 疑问1:
sun.reflect.DelegatingClassLoader类加载器是做什么的? - 疑问2: 为什么有7000个
DelegatingClassLoader类加载器类加载器?类加载器有一个不就够了,毕竟是用来加载别的类的。 - 疑问3: 为什么类加载器只加载1个类?
sun.reflect.GeneratedMethodAccessor6036相似的类为什么有7000多个 - 疑问4: 为什么这些类加载器的parent类加载器是
org.springframework.boot.loader.LaunchedURLClassLoader?
解决了上面的上面的疑问,对于问题最终的定位应该有极大的帮助
- 疑问1:

反射与sun.reflect.DelegatingClassLoader
按以往所学的双亲委派和Spring的知识,加载器一般只有
BootStrap,AppClassLoader,ExtClassLoader,再加上Spring的LaunchedURLClassLoader几种,且数量不会太多,毕竟是类加载器,有一个能把类加载进VM即可
经过对DelegatingClassLoader关键字的检索,大部分网页都提到了反射,参考简书这篇贴子的方案,结合自己的理解,验证代码如下
public class TestReflection {public static class SomePojo{private String f1;public String getF1() {return f1;}}public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InterruptedException{Method method = SomePojo.class.getDeclaredMethod("getF1");SomePojo target = new SomePojo();target.f1 = "aaa";for (int i = 0; i < 15; i++) {method.invoke(target);}String result = (String) method.invoke(target);System.out.println(result);}
}
在sun.reflect.NativeMethodAccessorImpl#invoke方法里,针对某个方法反射的次数不同有2种方案
- 反射调用15次及以下的时候,使用字节码解释执行
- 反射调用15次以上的时候,值得为此构建一个专门的类来调用反射,虽然这第16次会慢,但是后续因为JIT的原因会大大变快
public Object invoke(Object obj, Object[] args)throws IllegalArgumentException, InvocationTargetException{// 当反射调用次数>阈值15次的时候,会调用new MethodAccessorGenerator().generateMethod方法来实现invokeif (++numInvocations > ReflectionFactory.inflationThreshold()&& !ReflectUtil.isVMAnonymousClass(method.getDeclaringClass())) {MethodAccessorImpl acc = (MethodAccessorImpl)new MethodAccessorGenerator().generateMethod(method.getDeclaringClass(),method.getName(),method.getParameterTypes(),method.getReturnType(),method.getExceptionTypes(),method.getModifiers());parent.setDelegate(acc);}// 当反射调用次数<=阈值15次的时候,使用native的字节码解释执行来实现invokereturn invoke0(method, obj, args);}
问题就出在多次反射调用的new MethodAccessorGenerator().generateMethod方法,此方法内部最终会调用如下代码来生成一个Class,过程中有2步操作涉及到类的创建
- 新创建一个ClassLoader:
sun.reflect.DelegatingClassLoader,父类加载器是反射调用者的类加载器 - 新构造一个类,使用上面新的ClassLoader来加载
static Class<?> defineClass(String name, byte[] bytes, int off, int len,final ClassLoader parentClassLoader){ClassLoader newLoader = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {public ClassLoader run() {return new DelegatingClassLoader(parentClassLoader);}});return unsafe.defineClass(name, bytes, off, len, newLoader, null);}
核心代码的时序见下图:

上面可以解释疑问1和疑问3,疑问2也很简单,既然反射调用的时候会对每一个方法来调用上面的逻辑,在POJO很多的服务中,大量应用反射来调用setter和getter方法,自然会导致 7000+ 的DelegatingClassLoader类加载器和对应的sun.reflect.GeneratedMethodAccessor
- 疑问1:
sun.reflect.DelegatingClassLoader类加载器是做什么的?----反射用的- 疑问2: 为什么有7000个
DelegatingClassLoader类加载器类加载器?类加载器有一个不就够了,毕竟是用来加载别的类的?----JDK内部实现如此,具体为什么这么实现待确认- 疑问3: 为什么类加载器只加载1个类?
sun.reflect.GeneratedMethodAccessor6036相似的类为什么有?----JDK内部实现如此,具体为什么这么实现待挖掘
至此,表面上看是因为代码中反射用的太多导致,下一步是需要定位具体有哪些地方用到了反射,除了MetaSpace的参数修改(线上用-XX:MaxMetaspaceSize=256m 参数限定了最大空间),还需要注意哪些?
彩蛋,生成类名的逻辑
private static synchronized String generateName(boolean isConstructor, boolean forSerialization){if (isConstructor) {if (forSerialization) {int num = ++serializationConstructorSymnum;return "sun/reflect/GeneratedSerializationConstructorAccessor" + num;} else {int num = ++constructorSymnum;return "sun/reflect/GeneratedConstructorAccessor" + num;}} else {int num = ++methodSymnum;return "sun/reflect/GeneratedMethodAccessor" + num; ↑↑↑↑这里就是生成的反射调用类的类名,可以看到有一个数字尾号,是一个全局的自增数字}}
疑点2:被SpringLaunchedURLClassLoader加载的DelegatingClassLoader?
DelegatingClassLoader的父类加载器为调用者的类加载器,当本地调试时,由于IDEA自动解析并把依赖jar包放入classpath,最终所有依赖是App类加载器载入,所以DelegatingClassLoader的父类加载器为sun.misc.Launcher$AppClassLoader;当生产环境运行时,运行的是Spring打包出的FatJar,依赖也在其中,此时依赖的类(举例:Gson)是由Spring的UrlClassLoader加载,因此反射的父类加载器也为SpringLaunchedURLClassLoader
明白了反射的原理后,接下来需要定位导致OOM的原因,有2种可能
- 第三方SDK等原因导致目标应用加载的类异常增加
- 因为长期滥用反射,导致现有的256M空间不足以支撑业务运行
定位上述原因有多种方案,比如临时扩容元空间,查看内存占用是否会无序增长。在运维修改发布参数的同时,好奇看看生成的GeneratedMethodAccessor在堆快照里是否有线索?
考虑到sun.reflect.GeneratedMethodAccessor6036类名后缀的4位是自增的,而应用启动越往后生成的越有可能是最终导致OOM的罪魁祸首(也有可能是冲垮大堤的最后一只蚂蚁),因此从类名+后缀4位入手倒着查。

最后的680x这些类,看到一片待回收的对象,抽查后发现类加载器的父类加载器都是 org.springframework.boot.loader.LaunchedURLClassLoader

在堆上更进一步的挖掘,没有找到更多有用的信息,考虑使用Arthas的stack命令来监控Spring的哪些位置使用了反射?以及为什么容器运行了7天后还有反射,是invoke的次数少没有达到15次?还是边缘代码路径?
Arthas trace
Arthas的使用不是本文的重点,不再赘述,此处仅列举stack指令相关内容。
- 对于有JAVA_TOOL_OPTIONS注入的,外部启动arthas的流程
unset JAVA_TOOL_OPTIONS
java -jar arthas/arthas-boot.jar
- 进入以后,先选择进程
options unsafe true
stack sun.reflect.MethodAccessorGenerator generateMethod >> stack-monitor-reflect.out &
- 一定要正常exit
最后拿到输出举例如下
ts=2024-01-10 16:22:32;thread_name=http-nio-8080-exec-1;id=17;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@3ee0fea4@sun.reflect.MethodAccessorGenerator.generateMethod()at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:53)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓关注这里↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓at org.springframework.beans.BeanUtils.copyProperties(BeanUtils.java:821)at org.springframework.beans.BeanUtils.copyProperties(BeanUtils.java:719)at com.kkyeer.study.spring.controller.DemoController.pingPong2(DemoController.java:32)↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-2)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)at javax.servlet.http.HttpServlet.service(HttpServlet.java:696)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)at javax.servlet.http.HttpServlet.service(HttpServlet.java:779)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:750)
从上述arthas采集到的调用栈可以看到,由于DemoController.pingPong2内部调用了BeanUtils.copyProperties方法,此方法内部使用反射,进一步导致 new DelegatingClassLoader以及类加载,导致MetaSpace的使用量增加。业务代码中有部分同学使用此方法来进行浅拷贝,以完成DTO到VO的转换,这是导致MetaSpace随着迭代快速增加的原因。
类似的还有Spring内部的Jackson反序列化、Gson、FastJson库,均会导致MetaSpace的使用量增加。
解决
根据代码的不同类型,确定解决方案
-
短期方案:MetaSpace上限调整,比如从256M提升到384M
-
中长期方案:代码优化,降低反射的使用
- 优化浅拷贝:去除BeanUtils.copyProperties()方法使用,改造成MapStruct等方式进行浅拷贝
- 优化反序列化:随着业务持续发展,负载持续增加,考虑将部分payload的编码从JSON切换到ProtoBuf,Avro等二进制方案
- 优化深拷贝:深拷贝在此业务代码中出现比较多,但抽样部分代码CR后发现,前期因为业务快速迭代原因,在部分原本应该是只读对象的业务中出现了少量的属性修改,临时使用深拷贝解决,这种情况需要进行代码优化,保证只读对象使用引用共享,而不需要大量拷贝
结果
- 增大MetaSpace空间后,观察1周,暂时没有新的FullGC或者OOM出现,元空间大小稳定在300M左右
- 代码优化是一个长期的过程,待进一步观察
相关文章:
一次元空间FullGC导致OOM问题分析
原文,作者:kkyeer 原文需要翻墙,所以转载。 现象 观测平台告警:FullGC次数大于阈值,5分钟内大于11次,频次大概1-2周有一次 告警后服务概率性会自动恢复,控制台打印 Exception: java.lang.OutOf…...
Web前端开发工具和依赖安装
各种安装: node.js https://nodejs.org/zh-cn/ 安装完node.js 可以使用npm,npm跟随nodejs一起安装 node --version 查看已安装node.js的版本,确认是否安装nodejs npm -v 查看npm版本npm install <Module Name> 安装模块 npm insta…...
【学习心得】远程root用户访问服务器中的MySQL8
一、Ubuntu下的MySQL8安装 在Ubuntu系统中安装MySQL 8.0可以通过以下步骤进行1. 更新包管理工具的仓库列表: sudo apt update 2. 安装MySQL 8.0,root用户默认没有密码: sudo apt install mysql-server sudo apt install mysql-client 【…...
lust变频器维修电梯变频器CDD34.014.W2.1LSPC1
LUST伺服在安装时须注意,不可有任何的铁屑、螺丝、导线等掉人驱动器内。在安装完成后应作基本的检测动作,如对地阻抗,和短路检测等。 所有的安装及使用事项需要符合安全规定,并且也需要符合当地的相关规定和灾害预防措施。DC BUS…...
跨越地域限制:在线原型设计软件的自由与便捷
网络原型设计软件因其便捷性和灵活性,在现代设计工作中扮演着至关重要的角色。与传统的桌面端软件相比,网络原型设计工具无需安装,不受地域限制,且兼容各种操作系统,无论是Linux、Solaris、Mac还是Windows,…...
flash-waimai:高仿饿了么外卖平台,使用他轻松打造自己的外卖平台
嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和工作学习方法 flash-waimai 是一个完整的外卖平台解决方案,包括手机端、后台管理端和 API 服务。该项目仿照了饿了么的外卖服务,为用户提供了一个…...
2.5 塑性力学—应变状态
个人专栏—塑性力学 1.1 塑性力学基本概念 塑性力学基本概念 1.2 弹塑性材料的三杆桁架分析 弹塑性材料的三杆桁架分析 1.3 加载路径对桁架的影响 加载路径对桁架的影响 2.1 塑性力学——应力分析基本概念 应力分析基本概念 2.2 塑性力学——主应力、主方向、不变量 主应力、主…...
1.机器人抓取与操作介绍-深蓝学院
介绍 操作任务 操作 • Insertion • Pushing and sliding • 其它操作任务 抓取 • 两指(平行夹爪)抓取 • 灵巧手抓取 7轴 Franka 对应人的手臂 6轴 UR构型去掉一个自由度 课程大纲 Robotic Manipulation 操作 • Robotic manipulation refers…...
六,Linux基础环境搭建(CentOS7)- 安装HBase
Linux基础环境搭建(CentOS7)- 安装HBase 大家注意以下的环境搭建版本号,如果版本不匹配有可能出现问题! 一、HBase下载及安装 HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“…...
《计算机网络网络层:连接虚拟世界的关键桥梁》
一、网络层概述 网络层在计算机网络中占据着至关重要的地位,它作为连接不同网络的关键层次,起着承上启下的作用。网络层的主要任务是实现网络互连,将数据设法从源端经过若干个中间节点传送到目的端,为分组交换网上的不同主机提供通…...
【AIGC】2024-arXiv-CtrLoRA:一种可扩展且高效的可控图像生成框架
2024-arXiv-CtrLoRA: An Extensible and Efficient Framework for Controllable Image Generation CtrLoRA:一种可扩展且高效的可控图像生成框架摘要1. 引言相关工作3. 方法3.1 准备工作3.3 有效适应新条件3.4 条件嵌入网络的设计 4. 实验4.1 实验设置4.2 与现有方法…...
立仪光谱共焦在玻璃上奥秘与应用
在现代工业和科学研究中,玻璃因其透明、坚硬和易加工的特性被广泛应用于各个领域。然而,玻璃的厚度测量一直是困扰业界的一大难题。传统的千分尺或电容式传感器虽然在一定程度上能满足生产需求,但在精度、效率以及适用范围上存在明显的局限。…...
【天气识别系统】Python+卷积神经网络算法+人工智能+深度学习+TensorFlow+算法模型训练+Django网页界面
一、介绍 天气识别系统,以Python作为主要编程语言,通过收集了4种常见的天气图像数据集(多云、雨天、晴天、日出),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练,最后得到一个识…...
MiniCTX:面向大语言模型定理证明的上下文相关基准测试系统
卡内基梅隆大学的研究人员推出MiniCTX,这是一个强大的基准测试系统,旨在通过整合前所未有的多重上下文元素(包括前提、先前证明、注释、符号以及导入和声明等结构组件)来彻底改变大型语言模型中定理证明能力的评估方式,…...
树莓派开发相关知识三PWM控制转速
基于树莓派PWM控制 控制L298N马达驱动转速 马达驱动转速 1、L298N电路图: 2、需要留意的有几点 INA~IND四个引脚分别控制OUTA-OUTD,即,INA高电平则OUTA有电。 ENA,ENB分别使能控制OUTA~OUTB以及OUTC~OUTD。 OUT口有VCC电压驱动…...
SpringBoot最常用的注解
1、RestController 作用:与Controller类似,但是RestController会自动将返回值转换为JSON格式。 2、RequestMapping 作用:用于映射请求URL和处理方法。 RequestMapping是Spring MVC框架中的一个核心注解,它用于映射HTTP请求和控…...
js 获取当前时间与前一个月时间
// 获取当前时间的毫秒数 var currentTimeMillis new Date().getTime();// 获取前一个月的Date对象 var dateLastMonth new Date(); dateLastMonth.setMonth(dateLastMonth.getMonth() - 1);// 获取前一个月的毫秒数 var timeMillisLastMonth dateLastMonth.getTime();conso…...
深度了解flink rpc机制(四) 组件启动流程源码分析
前言 目前已发布了3篇关于Flink RPC相关的文章,分别从底层通信系统akka/Pekko,RPC实现方式动态代理以及Flink RPC相关的组件做了介绍 深度了解flink rpc机制(一)-Akka/Pekko_flink pekko akka-CSDN博客 深度了解flink rpc机制&…...
C++基于opencv的视频质量检测--遮挡检测
文章目录 0.引言1. 原始代码分析1.1 存在的问题 2. 优化方案3. 优化后的代码4. 代码详细解读4.1. 输入检查4.2. 图像预处理4.3. 高斯模糊4.4. 梯度计算4.5. 计算梯度幅值和方向4.6. 边缘检测4.7. 计算边缘密度4.8. 估计遮挡程度4.9. 限定结果范围4.10. 返回结果 0.引言 视频质…...
手机玩潜水员戴夫?GameViewer远程如何随时随地玩潜水员戴夫教程
如果你是潜水员戴夫的忠实玩家,你知道如何在手机上玩潜水员戴夫吗?潜水员戴夫是一个以神秘蓝洞为背景的海洋冒险游戏。在这个游戏里你白天可以在美丽的大海里打鱼,晚上可以经营寿司店。现在这个游戏也能实现用手机随时随地畅玩了!…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
