WeakHashMap引起内存溢出,线程数剧增

news2024/9/27 7:23:51

1.问题背景

代码通过jarLoader的方式,实现了一个数据库多个客户端版本兼容的情况,一个客户端使用一个jarLoader,实现jar的隔离。

同时,jarLoader使用weekhashmap做缓存。

hive做批量查询表的元数据时,引入了线程池。

2.现象

程序卡住,接收不到任何请求

3.dump日志

dump三次日志,三次有间隔时间。

发现相同名称的线程出现了n次,原则上仅能出现一次。

4. 分析原因

三次dump日志中,线程都没有回收,说明有强引用

weekHashmap的value是弱引用,在gc时会回收该对象。实际上并不是回收该对象,而是置该对象为null

源码如下:

queue存放gc后被清除的弱引用实体。

通过queue来清除table中已被回收的对象。

将e=null帮助gc回收

/**
   * Reference queue for cleared WeakEntries
  */
private final ReferenceQueue<Object> queue = new ReferenceQueue<>();
 
private void expungeStaleEntries() {
        for (Object x; (x = queue.poll()) != null; ) {
            synchronized (queue) {
                @SuppressWarnings("unchecked")
                    Entry<K,V> e = (Entry<K,V>) x;
                int i = indexFor(e.hash, table.length);

                Entry<K,V> prev = table[i];
                Entry<K,V> p = prev;
                while (p != null) {
                    Entry<K,V> next = p.next;
                    if (p == e) {
                        if (prev == e)
                            table[i] = next;
                        else
                            prev.next = next;
                        // Must not null out e.next;
                        // stale entries may be in use by a HashIterator
                        e.value = null; // Help GC
                        size--;
                        break;
                    }
                    prev = p;
                    p = next;
                }
            }
        }
    }

当value被置为null后,缓存中找不到classLoader,会重新创建一个classLoader,新的classLoader又创建了线程,这时候就出现了同名线程有多个的情况。

线程为什么不被回收?

因为线程池定义中,

private static ExecutorService executorPool = new ThreadPoolExecutor(
        10, 10, 60L, TimeUnit.SECONDS,
        new LinkedBlockingQueue<Runnable>(5000), new ThreadFactoryBuilder().setNameFormat("HiveServer2Executor-%d").build());

超过 keepAliveTime 时间的闲置线程会被回收掉。回收的是非核心线程,核心线程一般是不会回收的。

如果设置 allowCoreThreadTimeOut(true),则核心线程在闲置 keepAliveTime 时间后也会被回收。

由此定位到线程数剧增的情况。

同时服务运行时间很长时,整个服务创建不了任何线程,导致服务假死现象。

5.结论

代码中找不到该对象了,但是实际还是占用着内存,浪费堆空间。

由此说明,weekhashmap在有强引用的情况下,不是一个很好的缓存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/127147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NodeJS学习笔记一

文章目录1. 模块化1.1 模块作用域2. 内置API模块3. 自定义模块3.1 向外共享模块作用域中的成员3.2 使用误区3.3 CommonJS模块化规范4. 第三方API模块4.1 npm包管理目录4.2 包管理配置文件 package.json4.3 devDependencies节点4.4 切换npm的包镜像源4.5 包的分类4.5.1 项目包4.…

【cfeng-Work】work项目理解

work 项目 内容管理入职项目环境搭建商用项目 和 学习项目经验分享easily 分享work 见解 学习项目&#xff08;非商用&#xff09;相比工作中的商用项目差别还是很大的… Cfeng 最近开始工作&#xff0c; 接下来我将分享一下对于学校中的project环境和 work环境的相关理解 入职…

生成式对抗网络(GAN)原理推导与网络构建思路

0 引言 设想这样的场景&#xff1a;你是一个工作室的老板&#xff0c;你的工作室主要用来生产名画的赝品&#xff1b;而真正的名画则为前人所创造&#xff0c;存放在收藏室中。你的赝品画会和真品画一起被鉴定家鉴定&#xff0c;而你的终极目标是成为一个以假乱真的工艺大师。…

设置 Postman 环境并调用 API

云开发自带 API 调试 功能&#xff0c;可快速进行 API 接口调试&#xff0c;同时也支持通过 Postman 调用 API 获取设备信息或控制设备。本文介绍如何设置调用云开发 API 的 Postman 开发环境及调用接口实践。 配置环境 安装 Postman 8.2.2 及以上版本桌面软件。 版本过低会出…

Python类中的__init__() 和 self 的解析

1、Python中self的含义 self&#xff0c;英文单词意思很明显&#xff0c;表示自己&#xff0c;本身。 此处有几种潜在含义&#xff1a; 1.这里的自己&#xff0c;指的是&#xff0c;实例Instance本身。 2.同时&#xff0c; 由于说到“自己”这个词&#xff0c;都是和相对而…

《计算机网络》——第七章知识点

防火墙:特殊编程的路由器&#xff0c;实施访问控制策略。分为网络级防火墙(防止网络出现非法入侵)和应用级防火墙(进行应用的访问控制)。 本次文章详细PDF请点击以下链接查看&#xff1a; https://download.csdn.net/download/qq_53142796/87353770https://download.csdn.n…

市场回暖进行时,实体店商户们千万不要做这三件事!

随着防控措施的进一步优化&#xff0c;市场环境逐渐复苏&#xff0c;许多商户都趁着这段时间开始着手做准备&#xff0c;想要趁年前赚到消费回暖的第一波红利。 但是方向一旦错了&#xff0c;不管付出的努力有多少&#xff0c;最终也只能和想要的结果背道而驰&#xff1b;为了避…

图文结合带你搞懂MySQL日志之Slow Query Log(慢查询日志)

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a;KAiTO文章来源&#xff1a;GreatSQL社区原创 什么是慢查询日志 MySQL 的慢查询日志&#xff0c;用来记录在 M…

ORB-SLAM2 --- Tracking::Track 追踪线程解析

1.函数作用 ORB-SLAM2的三大线程之一---跟踪线程&#xff0c;负责估计运动信息、跟踪局部地图。 追踪线程的主要工作原理就是我们从数据集中读入一帧帧&#xff0c;刚开始的时候跟踪线程没有进行初始化&#xff08;没有初始化不知道世界坐标系的原点和相机的位姿&#xff09;&a…

做开发的朋友说软件测试是个人都能学,我当面怒怼

那就分析一下测试工程师需要会哪些技能&#xff1a; 01 软件测试理论 作为一个软件测试人员&#xff0c;总不能不知道软件测试本身的东西吧。 你总要知道软件测试是什么&#xff1f;什么是测试用例&#xff1f;什么是缺陷&#xff1f;软件测试有些什么特点&#xff1f;这些…

OpenHarmony#深入浅出学习eTs#(八)“猜大小”小游戏

本项目Gitee仓地址&#xff1a;[深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com)]( 上一章节提到的模拟器存在的BUG问题&#xff0c;目前没有办法直接改善&#xff0c;本来打算直接使用鸿蒙远程设备来实现&#xff0c;但是发现支持API8的设备都被抢光了&#xff08;包括模…

如何使用谷歌地图和LightningChart创建地理空间地图图表?

LightningChart JS 是一款高性能的 JavaScript 图表工具&#xff0c;专注于性能密集型、实时可视化图表解决方案。 LightningChart .JS | 下载试用&#xff08;qun&#xff1a;740060302&#xff09;https://www.evget.com/product/4189/download Google Static Maps API 是一…

前端基础(二)_JavaScript变量、JavaScript标识符、JavaScript获取元素、JavaScript的鼠标事件

一、JavaScript变量 变量是存储数据的容器&#xff0c;例x10&#xff0c;则x中存储的值为10。 语法&#xff1a;var 变量名 值。 1.1、变量的声明 先声明后赋值 var x; // 声明变量x alert(x); // undefined 所有声明了但是没有赋值的变量&#xff0c;结果都为undefined X…

单商户商城系统功能拆解55—后台设置

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

水文监测系统 水文遥测终端机 遥测终端机-助力母亲河平稳度汛

平升电子水文监测系统/水文遥测终端机/遥测终端机实现对江河流域水位、降水量、流量、流速、水质、闸门开启度、墒情等数据的实时采集、报送和处理。为防汛抗旱减灾提供科学依据和有效信息共享&#xff0c;保障人民群众生命财产安全&#xff0c;满足水利和经济社会发展对水文服…

虚拟化平台安装并升级显卡驱动

前言 在虚拟化平台上&#xff0c;虚拟化要使用vGPU&#xff0c;需要同时在主机和虚拟机上安装显卡驱动&#xff0c;主机和虚拟机的显卡驱动需要保守一致。安装驱动时先安装主机驱动&#xff0c;再安装虚拟机驱动。 驱动下载 可以从显卡官网许可中心下载对应的虚拟化驱动&…

一篇文章教小白学会搭建 vite + ts + vue3 项目,手把手教程,不会算我输

目录 一、基础环境和工具 1. 使用 pnpm 代替 npm 2. 使用 pinia 代替 vuex 3. 使用 windicss 4. 使用 vscode 5. 使用 sourcetree 6. 了解 vite ts vue 二、项目搭建 1. 流程图 2. 初始化项目 2.1 使用命令初始化项目 2.2 项目结构 3. 使用 git 3.1 创建本地的…

【JavaSE成神之路】数组思考题讲解

哈喽&#xff0c;我是兔哥呀&#xff0c;今天就让我们继续这个JavaSE成神之路&#xff01; 这一节啊&#xff0c;咱们要学习的内容是数组的思考题讲解&#xff0c;也就是上一节我留下的两个小作业。 数组是非常重要的知识点&#xff0c;也是我们后续学习各种数据结构的基础&am…

【MMC子系统】 一、MMC/SD/SDIO介绍

个人主页&#xff1a;董哥聊技术我是董哥&#xff0c;嵌入式领域新星创作者创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01;文章目录1、前言2、MMC/SD/SDIO介绍3、总线接口4、参考文章1、前言 该节学习Linux Kernel的MMC子系统&#xff…

JVM学习笔记(3)—— 运行时数据区—— 程序计数器、虚拟机栈、本地方法栈

程序计数器、虚拟机栈、本地方法栈都是线程私有的&#xff0c;jvm中每个线程都有一份 一、程序计数器 JVM中的程序计数器是一个与PC寄存器功能类似的逻辑结构&#xff0c;用于记录当前线程要执行的下一条jvm指令的地址&#xff0c;解释器读取到对应的jvm指令后将其翻译成机器指…