小说网站开发背景中铁建设集团招聘700人

news/2025/9/27 2:06:44/文章来源:
小说网站开发背景,中铁建设集团招聘700人,数据网站建设工具模板,定制网站开发介绍图从 Java Agent 报错开始#xff0c;到 JVM 原理#xff0c;到 glibc 线程安全#xff0c;再到 pthread tls#xff0c;逐步探究 Java Agent 诡异报错。 背景 由于阿里云多个产品都提供了 Java Agent 给用户使用#xff0c;在多个 Java Agent 一起使用的场景下#xff0…从 Java Agent 报错开始到 JVM 原理到 glibc 线程安全再到 pthread tls逐步探究 Java Agent 诡异报错。 背景 由于阿里云多个产品都提供了 Java Agent 给用户使用在多个 Java Agent 一起使用的场景下造成了总体 Java Agent 耗时增加各个 Agent 各自存储导致内存占用、资源消耗增加。 MSE 发起了 one-java-agent 项目能够协同各个 Java Agent同时也支持更加高效、方便的字节码注入。 其中各个 Java Agent 作为 one-java-agent 的 plugin在 premain 阶段是通过多线程启动的方式来加载从而将启动速度由 O(n)降低到 O(1)降低了整体 Java Agent 整体的加载时间。 问题 但最近在新版 Agent 验证过程中one-java-agent 的 premain 阶段发现有如下报错 2022-06-15 06:22:47 [oneagent plugin arms-agent start] ERROR c.a.o.plugin.PluginManagerImpl -start plugin error, name: arms-agent com.alibaba.oneagent.plugin.PluginException: start error, agent jar::/home/admin/.opt/ArmsAgent/plugins/ArmsAgent/arms-bootstrap-1.7.0-SNAPSHOT.jarat com.alibaba.oneagent.plugin.TraditionalPlugin.start(TraditionalPlugin.java:113)at com.alibaba.oneagent.plugin.PluginManagerImpl.startOnePlugin(PluginManagerImpl.java:294)at com.alibaba.oneagent.plugin.PluginManagerImpl.access$200(PluginManagerImpl.java:22)at com.alibaba.oneagent.plugin.PluginManagerImpl$2.run(PluginManagerImpl.java:325)at java.lang.Thread.run(Thread.java:750) Caused by: java.lang.InternalError: nullat sun.instrument.InstrumentationImpl.appendToClassLoaderSearch0(Native Method)at sun.instrument.InstrumentationImpl.appendToSystemClassLoaderSearch(InstrumentationImpl.java:200)at com.alibaba.oneagent.plugin.TraditionalPlugin.start(TraditionalPlugin.java:100)... 4 common frames omitted 2022-06-16 09:51:09 [oneagent plugin ahas-java-agent start] ERROR c.a.o.plugin.PluginManagerImpl -start plugin error, name: ahas-java-agent com.alibaba.oneagent.plugin.PluginException: start error, agent jar::/home/admin/.opt/ArmsAgent/plugins/ahas-java-agent/ahas-java-agent.jarat com.alibaba.oneagent.plugin.TraditionalPlugin.start(TraditionalPlugin.java:113)at com.alibaba.oneagent.plugin.PluginManagerImpl.startOnePlugin(PluginManagerImpl.java:294)at com.alibaba.oneagent.plugin.PluginManagerImpl.access$200(PluginManagerImpl.java:22)at com.alibaba.oneagent.plugin.PluginManagerImpl$2.run(PluginManagerImpl.java:325)at java.lang.Thread.run(Thread.java:855) Caused by: java.lang.IllegalArgumentException: nullat sun.instrument.InstrumentationImpl.appendToClassLoaderSearch0(Native Method)at sun.instrument.InstrumentationImpl.appendToSystemClassLoaderSearch(InstrumentationImpl.java:200)at com.alibaba.oneagent.plugin.TraditionalPlugin.start(TraditionalPlugin.java:100)... 4 common frames omitted 熟悉 Java Agent 的同学可能能注意到这是调用 Instrumentation.appendToSystemClassLoaderSearch 报错了。 但首先 appendToSystemClassLoaderSearch 的路径是存在的其次这个报错的真实原因是在 C部分比较难排查。 但不管怎样还是要深究下为什么出现这个错误。 首先我们梳理下具体的调用流程下面的分析都是基于此来分析的 - Instrumentation.appendToSystemClassLoaderSearch (java)- appendToClassLoaderSearch0 (JNI)- appendToClassLoaderSearch|- AddToSystemClassLoaderSearch| -create_class_path_zip_entry| -stat-convertUft8ToPlatformString- iconv 打日志、确定现场 因为这个问题在容器环境下有 10% 的概率出现比较容易复现于是就用 dragonwell8 的最新代码加日志确认下现场。 首先在 JNI 的实际入口处也就是 appendToClassLoaderSearch 的方法入口添加日志 加了上面的日志后发现问题更加令人头秃了 没有报错的时候appendToClassLoaderSearch entry 会输出。有报错的时候appendToClassLoaderSearch entry 反而没有输出没执行到这儿 这个和报错的日志对不上啊难道是 stacktrace 信息骗了我们 过了难熬的一晚上后第二天请教了 dragonwell 的同学大佬打日志的姿势是这样的 tty-print_cr(internal error);如果上面用不了再用 printf(xxx\n);fflush(stdout); 这样加日志后果然我们的日志都能打出来了。 这是踩的第一个坑printf 要加上 fflush 才能保证输出成功。 分析代码 后面又是不断加日志最终发现 create_class_path_zip_entry 返回 NULL。 找不到对应的 jar 文件 继续排查发现是 stat 报错返回 No such file or directory。但是前面也提到了jarFile 的路径是存在的难道 stat 不是线程安全的 查了下文档[1]发现 stat 是线程安全的。 于是又回过头来再看这时候注意到 stat 的路径是不正常的有的时候路径是空有的时候路径是/home/admin/.opt/ArmsAgent/plugins/ahas-java-agent/ahas-java-agent.jarSHOT.jar从字符末尾可以看到基本上是因为两个字符写到了同一片内存导致的而且对应字符串长度也变成了一个不规律的数字了。 那么问题就很明确了开始查找这个字符串的生成。这个字符是 convertUft8ToPlatformString 生成的。 字符编码转换有问题 于是开始调试 utf8ToPlatform 的逻辑这时候为了避免频繁加日志、重启容器所以直接在 ECS 上运行 gdb 调试 jvm。 结果发现在 Linux 下utf8ToPlatform 就是直接 memcpy而且 memcpy 的目标地址是在栈上。 这怎么看都不太可能有线程安全问题啊 后来仔细查了下发现和环境变量有关ECS 上编码相关的环境变量是 LANGen_US.UTF-8在容器上 centos:7 默认没有这个环境变量此种情况下jvm 读到的是 ANSI_X3.4-1968。 这儿是第二个坑环境变量会影响本地编码转换。 结合如上现象和代码发现在容器环境下还是要经过 iconv从 UTF-8 转到 ANSI_X3.4-1968 编码的。 其实这儿也可以推测出来如果手动在容器中设置了 LANGen_US.UTF-8这个问题就不会再出现。额外的验证也证实了这点。 然后又加日志最终确认是 iconv 的时候目标字符串写挂了。 难道是 iconv 线程不安全 iconv不是线程安全的 查一下 iconv 的文档发现它不是完全线程安全的 通俗的说iconv 之前需要先用 iconv_open 打开一个 iconv_t而且这个 iconv_t不支持多线程同时使用。 至此问题已经差不多定位清楚了因为 jvm 把 iconv_t 写成了全局变量这样在多个线程 append 的时候就有可能同时调用 iconv导致竞态问题。 这儿是第三个坑iconv 不是线程安全的。 如何修复 先修复 one-java-agent 对于 Java 代码非常容易修改只需要加一个锁就可以了 但是这儿有一个设计问题instrument 对象已经在代码中到处散落了现在突然要加一个锁几乎所有用到的地方都要改代码改造成本比较大。 于是最终还是通过 proxy 类来解决 这样其他地方就只需要使用 InstrumentationWrapper 就可以了也不会触发这个问题。 jvm要不要修复 然后我们分析下 jvm 侧的代码发现就是因为 iconv_t 不是线程安全的导致 appendToClassLoaderSearch0 方法不是线程安全的那能不能优雅的解决掉呢 如果是 Java 程序直接用 ThreadLoal 来存储 iconv_t 就能解决了。 但是 cpp 这边虽然 C 11 支持 thread_local但首先 jdk8 还没用 C 11这个可以参考 JEP 其次C 11 的也仅仅支持 thread_local 的 set 和 getthread_local 的初始化、销毁等生命周期管理还不支持比如没办法在线程结束时自动回收 iconv_t 资源。 那咱们就 fallback 到 pthread因为 pthread 提供了 thread-specific data可以做类似的事情。 pthread_key_create 创建 thread-local storage 区域pthread_setspecific 用于将值放入 thread-local storagepthread_getspecific 用于从 thread-local storage 取出值最重要的pthread_once 满足了 pthread_key_t 只能初始化一次的需求。另外也需要提到的pthread_once 的第二个参数就是线程结束时的回调我们就可以用它来关闭 iconv_t避免资源泄漏。 总之 pthread 提供了 thread_local 的全生命周期管理。于是最终代码如下用 make_key 初始化 thread-local storage 于是编译 JDK 之后打镜像、批量重启数次 pod就没有再出现文章开头提到的问题了。 总结 在整个过程中从 Java 到 JNI/JVMTi再到 glibc再到 pthread踩了很多坑 printf 要加上 fflush 才能保证输出成功环境变量会影响本地字符编码转换iconv 不是线程安全的使用 pthread thread-local storage 来实现线程局部变量的全生命周期管理 从这个案例中沿着调用栈、代码逐步还原问题、并提出解决方案希望大家能对 Java/JVM 多了解一点。 参考链接 [1] 文档 https://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_09.html [2] one-java-agent 修复的链接 https://github.com/alibaba/one-java-agent/issues/31 [3] dragonwell 修复的链接 https://github.com/alibaba/dragonwell8/pull/346 [4] one-java-agent 给大家带来了更加方便、无侵入的微服务治理方式 https://www.aliyun.com/product/aliware/mse 原文链接 本文为阿里云原创内容未经允许不得转载。

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

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

相关文章

网站建设linuxwordpress免费插件分享

一、概述 SortedList 类代表了一系列按照键来排序的键/值对,这些键值对可以通过键和索引来访问。排序列表是数组和哈希表的组合。它包含一个可使用键或索引访问各项的列表。 如果您使用索引访问各项,则它是一个动态数组(ArrayList&#xff0…

深圳东莞网站建设wordpress外网跳转

在网页抓取方面,可以使用 Python、Java 等编程语言编写程序,通过模拟 HTTP 请求,获取淘宝多网站上的商品页面。在数据提取方面,可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是,淘宝网…

php网站模板制作软件河北建设厅安监站官方网站

一、条件语句 条件语句基于不同的条件来执行不同的动作 1.if语句:只有当指定条件为true时,使用该语句来执行代码 2.if...else语句:当条件为true时执行代码,当条件为else时执行其他代码 3.if...else if...else语句:…

网站公司做文员网站建设需要学的

4种kill某个用户所有进程的方法 在linux系统管理中,我们有时候需要kill掉某个用户的所有进程,初学者一般先查询出用户的所有pid,然后一条条kill掉,或者写好一个脚本,实际上方法都有现成的,这边有4种方法&am…

新网站多久收录网站有些什么内容

文章目录 仲裁队列1、创建交换机2、创建仲裁队列3、验证主节点宕机不影响消息发送和接收 流式队列(不推荐,Kafka主场)概念 异地容灾一、Federation插件概述 二、Federation交换机1、总体说明2、准备工作3、启用联邦插件4、添加上游连接端点5、…

爱站网使用体验wordpress页脚二维码

💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 通道通道声明初始化缓冲机制无缓冲通道代码示例 带…

做个网站app吗南昌网站建设基本流程

2020/11/3操作记录搭建好Python的数据环境之后,接下来就是在Python代码中访问数据库我先在Navicat图形化界面创建一个数据库命名为pythontest,再在数据库中创建了一个表studentinfo有nid,nname,ngrade,nage四个字段,nid为主键递增。通过查询编…

wordpress国外主题网站wordpress的数据库名

作者主页:源码空间codegym 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 管理员:首页、个人中心、公告信息管理、班级管理、学生管理、教师管理、课程类型管理、课程信息管理、学生选课管理、作业布置管理…

合肥网站关键词张槎手机网站建设

今天天气很好,早上看了肺炎的病情如下图这个是丁香医生的统计数据,腾讯也出了一份统计数据,截止到写这篇文章的时候,已经确诊人数为 7766 人,但是我觉得丁香医生里面的截图内容比较多,也没有一些诱导二维码…

集团门户网站建设公司无锡seo关键词排名

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

网站备案现场浏览器官网入口

目录 一、前言:误差与拟合 (一)经验误差 (二)过拟合、欠拟合 二、评估方法 (一)评估总体的思路 (二)如何划分训练集和测试集 1.留出法 2.k折交叉验证 3.自助法 …

个人网站变现如何查网站是哪家公司做的

任务:将asterisk1.8.24.0移植到rt5350上面 交叉工具链:mipsel-linux(3.4.2) 1. 配置asterisk,执行./configure --hostmipsel-linux 找不到termcap和libxml2,分别对他们交叉编译,然后将生成的库拷贝到交叉工具链的lib…

成都 网站建设 公司汉中做网站

开源项目推荐 Reloader Reloader 是一个 Kubernetes 控制器,用于监控 ConfigMap 和 Secrets 中的变化,并对 Pod 及其相关部署、StatefulSet、DaemonSet 和 DeploymentConfig 进行滚动升级! Spegel Spegel 在瑞典语中意为镜像,…

Unity渲染时的排序规则

按照我们的常规理解,渲染顺序应该是: 1.不透明物体按照相机空间进行Z轴排序,从前往后排,先渲染前面再渲染后面,避免造成过多的OverDraw 2.绘制天空盒,天空盒在要不透明物体之后渲染,避免造成OverDraw 3.绘制透明…

商业网站开发的实训小结怎么写策划公司属于什么行业

微信搜一搜舒适11今天这篇文章,小壹就向大家科普一下空调和新风系统,告诉大家为什么装了空调还要装新风机。1、空调是什么? 对此大家都能够脱口而出:空调就是用来制冷或制热的机器,能够改变室内温度,让我们…

单位门户网站wordpress本地utc

官方文档地址:Index lifecycle actions | Elasticsearch Guide [7.12] | Elastic 索引生命周期操作(index lifecycle actions) Allocate 将分片移动到具有不同性能特征的节点并减少副本数量 Delete 永久删除索引。 Force merge 减少索…

建平县网站建设wordpress访问量统计

Python优化算法篇 scipy.optimize Scipy是一个用于数学、科学和工程的开源库,它建立在NumPy的基础上,提供了一系列强大的科学计算工具。在Scipy中,优化模块(scipy.optimize)提供了多种优化算法,用于求解最小…

专门做行业分析的网站ps做的网站

目录 1 创建工程3 配置文件4 静态资源 之前我们已经学习的Spring、SpringMVC、Mabatis、Maven,详细讲解了Spring、SpringMVC、Mabatis整合SSM的方案和案例,上一节我们学习了SpringBoot的开发步骤、工程构建方法以及工程的快速启动,从这一节开…

网站开发和企业级开发有什么区别wordpress languages

简介: 上海致拓软件有限公司利用云钉低代码应用构建平台——钉钉宜搭为合安建筑快速、低成本地搭建了个性化的项目管理系统,着力帮助合安建筑解决业务在线场景,形成场景化的工程项目管理数字化解决方案。 一封由工程公司发给项目管理数字化实…

US$79 Latest Version SBB Key Programmer V46.02 Multi-language

Latest Version SBB Key Programmer V46.02 Multi-languageSBB Key Programmer Features:1.Software Version: 46.022.Language: English,Italiano,Deutsch,Francais,Espaniol,Portugues,Turkish3.Support Toyota G Ch…