BlackHole开发日记-一次压力测试及JVM调优的经过

基于模型上下文协议(MCP)的可插拔式临床AI工具链Clinical DS研究(下) 本研究深入探讨了医疗AI在临床落地中的核心矛盾,即如何从“模型能答”迈向“系统可信、可用、可追溯”。为解决此矛盾,我们创新性地提出并详细设计实现了一套基于模型上下文协议(MCP)的**“可插拔式临床AI工具链”**架构。通过将复杂的医疗AI系统解构为Host、MCP Server和标准协议三层,并将各类能力(临床决策、影像分析、合规审计)封装为标准的、可独立演进的Server,我们成功地构建了一个模块化、高内聚、低耦合的系统。 阅读详情

BlackHole开发很久了,目前稳定性、性能都还可以了,但是作为一个Java程序,内存开销一直是硬伤,动不动100M内存下去了,对于单机用户实在是不太友好。

怎么办?优化先从分析开始!

获取内存信息

获取内存信息一般使用jmap。

jmap -histo pid

这种方式获取到得比较简略,我们可以先把内存dump下来,再进行离线分析。jhat是一个离线内存分析工具,会开启一个web服务以供展示。

jmap -dump:file=dumpfile pid
jhat -J-Xmx512m dumpfile

访问 http://127.0.0.1:7000 即可。默认是Class列表,翻到页面底部可以查看其他功能。

参考资料:

http://www.lhelper.org/newblog/?tag=jhat

http://blog.youkuaiyun.com/gtuu0123/article/details/6039474

详细分析

以下分析仅针对JDK 7 HotSpot虚拟机。jmap -histo的结果:

num     #instances         #bytes  class name
----------------------------------------------
 1:         28490        4057072  <constMethodKlass>
 2:         28490        3882464  <methodKlass>
 3:          2630        2820064  <constantPoolKlass>
 4:         46350        2412600  <symbolKlass>
 5:         32778        2372824  [C
 6:          2630        1990744  <instanceKlassKlass>
 7:          3418        1955208  [I
 8:         15491        1911568  [B
 9:          2347        1845400  <constantPoolCacheKlass>
10:         19246         615872  java.lang.String
11:           256         561152  [Lnet.sf.ehcache.store.chm.SelectableConcurrentHashMap$HashEntry;
12:          2930         304720  java.lang.Class
13:          3740         247280  [S
14:          4321         221520  [[I

其中[开头表示数组,[C [I [B 分别是char[] int[] byte[]。

constMethodKlass、都实现自sun.jvm.hotspot.oops.Klass,用于在永久代里保存类的信息。

换到JDK6之后,发现永久代的消耗下去了。

num     #instances         #bytes  class name
----------------------------------------------
 1:         10823        3072312  [B
 2:         16605        2318720  <constMethodKlass>
 3:         18687        1388088  [C
 4:         16605        1328608  <methodKlass>
 5:         27595        1296832  <symbolKlass>
 6:          1699         940392  <constantPoolKlass>
 7:          2520         883408  [I
 8:          1699         724944  <instanceKlassKlass>
 9:          1472         565136  <constantPoolCacheKlass>
10:           256         561152  [Lnet.sf.ehcache.store.chm.SelectableConcurrentHashMap$HashEntry;
11:         12148         291552  java.lang.String
12:          4505         288320  net.sf.ehcache.Element
13:          7290         233280  java.lang.ThreadLocal$ThreadLocalMap$Entry
14:          1946         186816  java.lang.Class
15:          4509         180360  net.sf.ehcache.store.chm.SelectableConcurrentHashMap$HashEntry

查看一下总的内存开销(参考资料: http://yytian.blog.51cto.com/535845/574527)

ps -e -o 'pid,comm,args,pcpu,rsz' | grep java |  sort -nrk5
1239 java            java -jar -Djava.io.tmpdir=  0.1 52816

或者:

top -pid pid

查看到只有52m,看来JDK7占用内存果然增加了!

压力测试

使用140,000个随机域名做压力测试。发现之前使用的JDK7 Developer Preview u04,在短时间产生大量对象的时候,GC会失去作用,内存迅速飙升到200M,后来更新到1.7.0u25,稳定到了130m,qps大概在49000~50000之间。

尝试使用ConcurrentHashMap代替EhCache,qps提高到50000~51000之间,变化不明显,EhCache还是相当优秀的。

为了提高吞吐量,查看GC情况:

sudo jstat -gcutil 2960
S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
0.00   0.75  30.35  12.06  72.92     25    0.063     0    0.000    0.063

140,000个请求产生了25次YGC。

参考了关于JVM的调优文章http://blog.youkuaiyun.com/kthq/article/details/8618052

重新设置新生代为200m,并开启并行收集:

JVM_OPTION="-XX:+UseParallelGC -XX:NewSize=200m"

140,000个请求只产生了3次YGC,但是qps变化并不明显。看来新生代设置大之后,虽然YGC少了,但是一次回收的时间多了,最终其实没啥影响啊,那还是弄小一点好了。

看来折腾JVM效果不明显,除了内存开销之外,其他没有明显变化。

GEE生物量碳储量——利用sens和MK检验方法计算1987-2022年森林地上生物量AGB和碳储量的时空变化特征 本文是将之前已经处理好的森林生物量和碳储量数据保存到GEE Assets中,然后分别将单张影像导入到代码编辑器中,构建一个时间序列集合,并且这里需要用到的是我们给影像添加指定的时间属性,这样方便进行下一步的时序分析和空间预测。首先,需要收集1987年至2022年期间森林地上生物量AGB和碳储量数据。该数据可以通过森林清查数据、卫星遥感数据等途径获取。然后,根据这些数据,可以使用sens(敏感性分析)和MK(Mann-Kendall)方法计算时空变化特征。 阅读详情

相关推荐

JavaScript 书签脚本实战:腾讯/优酷/爱奇艺等5大视频站m3u8链接一键提取

本文详细介绍了如何使用JavaScript书签脚本一键提取腾讯视频、优酷、爱奇艺等五大视频平台的m3u8流媒体链接。通过分析播放器内部对象结构,开发者可以高效获取视频源文件,避免录屏画质损失。文章包含各平台适配方案、实战增强功能开发及企业级解决方案设计,帮助用户快速掌握这一实用技术。

weixin_27945229的博客 596

ehcache2.5的源码分析 ---- 缓存失效机制

清超出的缓存的代码在这里: net.sf.ehcache.store.chm.SelectableConcurrentHashMap 第五百行 int runs = Math.min(MAX_EVICTION, SelectableConcurrentHashMap.this.quickSize() - (int) SelectableConcurrentHashMap.thi...

天将奔烈 409

Leaflet 加载天地图完整配置指南:从插件修改到无限缩放(附源码)

本文详细介绍了Leaflet与天地图深度集成的完整配置指南,包括插件修改、无限缩放实现及源码示例。通过解析天地图服务的WMTS协议、双投影支持和密钥机制,帮助开发者突破缩放级别限制,优化地图应用性能,适用于Web地图开发和高精度GIS系统。

weixin_27180827的博客 440

又一篇深入分析ConcurrentHashMap的文章

本文转自:http://www.infoq.com/cn/articles/ConcurrentHashMap 之前的一篇文章是:http://blog.csdn.net/caihaijiang/article/details/7435828 线程不安全的HashMap 因为多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情

caihaijiang的专栏 2231

Outlook总是提示登录微软,怎么办?

Outlook 2021反复弹出Microsoft登录窗口,可能是由于Modern Authentication身份验证机制或凭据问题导致。解决方案包括:1)通过注册表关闭Modern Authentication(适用于本地Exchange);2)清理Windows凭据管理器中的旧认证信息;3)手动配置Exchange服务器地址;4)通过注册表阻止Microsoft登录窗口弹出(适用于非M365环境)。建议按顺序尝试,尤其前两步通常能解决问题。经测试,步骤1和2已有效解决该问题。

剪刀石头布 4661

逆向实战:如何绕过iTunes 12.6.5.3的反调试机制(附X64dbg插件配置)

本文深入剖析了iTunes 12.6.5.3的反调试机制与登录协议。通过X64dbg动态调试与IDA静态分析,详细演示了如何绕过其反调试检测,并定位到核心的登录协议加密函数,揭示了其请求签名(X-Apple-ActionSignature)的生成逻辑与依赖关系,为客户端安全研究与协议分析提供了实战思路。

weixin_29202213的博客 740

Spring Cache缓存配置

一、pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <arti

搬山境KL攻城狮的修炼手册 972

从Safety Manual到系统安全概念

本文系统阐述了构建功能安全"证据链"的工程化方法论,核心要点包括:1)建立"风险→对策→验证→证据"闭环链条;2)SafetyManual和FMEDA作为关键证据支撑点,前者界定系统安全边界,后者量化诊断覆盖率;3)通过四步法继承芯片安全机制并扩展至系统级;4)形成"设计-分析-验证"三维闭环体系,包括安全目标、技术实现和验证矩阵;5)强调证据链闭环对安全认证和OEM认可的重要性。该方法论实现了从理论要求到工程实践的完整转化,确保安全设计可验证、可

VehSwHwDeveloper的博客 720

热数据本地缓存 - ehcache

什么是ehCache EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。 一、具体描述 Ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案。同时ehcache作为开放源代码项目,采用限制比较宽松的Apa...

Zoey~~ 798

通过情感分类实例 详细介绍如果借助Huggingface平台 完成Transformers模型运行(包括配置环境-tokenizer-Model-输出头-预测)

attention_mask和padding是配套使用的,当人为去修改padding的时候,也要把attention_mask里面的参数进行修改。下载Huggingface包,Huggingface可以说是一个社区,集成了很多nlp的模型、数据集、预训练权重文件等等,并且免费,只需要pip install下载即可。那么用什么做分类就选择什么输出头,就import什么东西。代码中使用了自动分词器选择,它是由checkpoint指定的预训练模型关联的,不用我们自己选择tokenizer,它自动帮我们选择好了。

LZL2020LZL的博客 1135

Android Framework WMS面试题及参考答案

什么是 WindowManagerService(WMS)?它的作用是什么? WindowManagerService(WMS)是 Android 系统中非常重要的一个系统服务。它运行在系统进程(system_server 进程)中。 从本质上来说,WMS 是 Android 窗口管理系统的核心。它负责管理系统中的所有窗口,包括应用程序窗口、系统窗口(如状态栏、导航栏)等。 它的主要作用有很多。首先是窗口的创建和销毁。当一个应用请求创建一个窗口时,WMS 会协调各个模块完成窗口的创建工

大模型大数据攻城狮的专栏 2162

jvm调优,tomcat溢出查找问题实战

前言 之前公司的一个项目部署在tomcat运行一段时间后老是jvm堆内存溢出,项目是用的jfanl框架做的,翻看整个项目的源码,并没有发现会大量占用内存的地方,开始用了个治标不治本的办法;通过curl命令监听web服务的状态shell脚本使用curl获取访问网站的状态码,后面通过一些对jvm的学习,终于找到症结所在。 一、准备好工具 JVisualVM, 是一款免费的性能分析工具。它通过 jvmst

愤怒的苹果ext的博客 868

Mamba-YOLOv8深度解析:基于状态空间模型的下一代目标检测架构(含完整代码与实战部署)文末含资料链接!

通过本文的完整指南,您将掌握从理论创新到工程落地的全流程技术细节。立即动手实践,开启目标检测的新纪元!

FJN110的博客 517

【JAVA】线上排查

1.首先说几个概念: PID:进程的身份证号 TOP命令:查询进程占用内存排名 PS命令:进程监控命令,查看进程以及进程中线程使用情况,属于当前状态采样数据 2.Linux下查看tomcat日志 ⑴先切换到:cd usr/local/tomcat5/logs ⑵tail -f catalina.out ⑶这样运行时就可以实时查看运行日志了 3.JPS命令 显示当前所有java进程pi...

屎蛋的铲屎官 2075

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

内存泄漏以及jmap命令的用法

查看内存泄漏命令: 命令 作用 jps 查看java进程号 jmp -histo:live 进程号 > 存放路径 将进程打印到文本中 start 路径名 打开文本,查看实例个数 过程如下: 这是用到的代码(也就是我放到TestDemo1.java中的代码): /** * 栈 */ class MyStack { private V[] elem; ...

中都 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java-ConcurrentHashMap实现缓存,(缓存数量,过期时间,过期缓存清理)

源代码连接地址:https://github.com/yanwankun/yan-study/blob/dev/yan-utils/src/main/java/cn/yan/study/utils/cache/ConcurrentHashMapCacheUtils.java package cn.yan.study.utils.cache; import org.slf4j.Logger; ...

qq_35030994的博客 2万+

ConcurrentHashMap(CHM)要点总结

1. Map根据并发级别一般默认为16个并发度,即最多16个线程写,同时存在其他读线程,因此读的结果可能不是最新的,同时每个segment使用RetreeenLock加锁,因此可以根据并发的线程数在构造时设置并发级别。 2.使用keySet返回的iterator是弱一致性的,即在使用该iterator遍历时如果修改了内容,会报ConcurrentModificationExceptoin异常。 ...

cloudeagle_bupt的专栏 515

jmap -histo pid 输出的[C [B [I [S methodKlass的含义

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34319111的博客 623

jmap的几个操作要慎用

最近中大招了,前一周开始偶尔在线上发现一些请求时长竟长达7秒,甚至在部分时段系统存在周期性的请求失败或者超时,各种招式都使用了还是不知道确定的原因,百思不得其解,头大的很!昨日晚上发现这个问题简直太严重了,必须要立刻马上处理掉,一会都耽误不得,遂持续奋斗到晚上一点多,早晨7掂掇又跑起来搞,用各种手段来找到问题的产生规律,一直到下午1点多,才终于发现症结所在了! 应用服务上曾经出现过Load突

张兆坤 1万+

EhCache详细解读

特性一览 1、快速轻量 过去几年,诸多测试表明Ehcache是最快的Java缓存之一。 Ehcache的线程机制是为大型高并发系统设计的。 大量性能测试用例保证Ehcache在不同版本间性能表现得一致性。 很多用户都不知道他们正在用Ehcache,因为不需要什么特别的配置。 API易于使用,这就很容易部署上线和运行。 很小的jar包,Ehcache 2.2.3才668kb。 最小的

只有想不到没有做不到,程序的力量。。。 6109

encache缓存网页

这是关于encache缓存页面的简单介绍,不对其进行深究。

木与石 472
上一篇: 如何选择合适的 GC 时间 —— USER, SYS, REAL?
下一篇: Redis sort命令详解
Viking_bird
博客等级 码龄11年 92粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值