识别JVM –比预期的要复杂
在Plumbr,我们花了最后一个月的时间来为将来的重大改进奠定基础。 此类构件之一是为JVM添加唯一标识符,以便将来自同一JVM的所有会话链接在一起。
虽然一开始看起来似乎很琐碎的任务,但是当查看JVM捆绑的jps命令的输出时,围绕该问题的复杂性开始令人头疼,该命令列出了我的机器中所有当前正在运行的Java进程:
My Precious:tmp my$ jps
1277 start.jar
1318 Jps
1166
上面列出了jps命令的输出,列出了我的机器上当前正在运行的所有Java进程。 如果您不熟悉该工具,则它会在左侧列出所有进程的进程ID,并在右栏中列出进程名称。 显然,唯一一个以有意义的名称列出自己的人就是jps本身。 另外两个不太礼貌。 隐藏在start.jar首字母缩写后面的是Jetty实例,而完全匿名的实际上是Eclipse。 我的意思是,真的– Java世界上最大的IDE甚至不愿意在标准Java工具中用名称列出自己吗?
因此,一窥内置工具的最新技术,就可以回到我们手头的要求上。 我们当前的解决方案是通过进程ID +计算机名称组合来标识JVM。 这有一个明显的缺点–每当进程死掉时,它的轮回就不会从内核获得相同的ID。 因此,每当JVM Plumbr监视的监视重新启动或终止时,我们都会失去跟踪,无法将后续调用绑定在一起。 对于监视工具来说,这显然不是合理的行为,因此我们继续寻找更好的解决方案。
接下来的明显步骤是三个月前,当时我们允许用户通过-Dplumbr.application.name = my-precious-jvm启动参数指定计算机的名称。 看起来似乎很明智,但在这三个月中,只有2%的用户实际上不愿意指定此参数。 因此,现在该回到绘图板上,看看在尝试将唯一且易于理解的标识符自动绑定到JVM实例时,我们有哪些选择。
我们的第一种方法是使用main()方法获取类的名称,并将其用作标识符。 当我们在包含四个不同Jetty实例的开发箱中启动构建时,立即出现的弊端很快就会显现出来–您立即拥有四个不同的JVM,它们都在相同的但不太唯一的标识符下进行绑定。
下一个尝试是解析应用程序的内容并从部署描述符中识别应用程序–毕竟, Plumbr监视的大多数应用程序都打包为WAR / EAR捆绑软件,因此这将是有意义的,并使用捆绑软件中存在的信息。 实际上,绝大多数工程师的确在web.xml或application.xml的<display-name>参数中给出了有意义的名称。
这解决了部分问题–当所有四个Jetty实例都运行具有不同<display-name>的应用程序时,它们将显示为唯一。 确实如此,直到我们的登台环境表明情况并非总是如此。 我们在同一台计算机上有几个不同的Plumbr Server实例,它们使用不同的应用程序服务器,但是使用相同的<display-name>参数部署相同的WAR文件。 您可能会猜到,这再次扼杀了此类ID的唯一性。
另一个引起问题的事实是,有一些应用程序服务器正在运行多个Web应用程序-将多个WAR文件部署到容器中后会发生什么?
因此,我们不得不进一步挖掘。 为了区分在同一台机器上运行同一应用程序的多个JVM,我们添加了启动文件夹以保证标识符的唯一性。 但是多重战争的问题仍然存在。 为此,我们回到了最初的假设,即使用主类名称作为标识符。
还有一些技术上的细微差别,例如区分用于ID的实际哈希和同一哈希的用户友好版本,现在,我们提供了一种解决方案,它将在您监视的JVM列表中显示类似的内容:
机 | 虚拟机 | 由于 |
---|---|---|
青蒿素分期 | 自助服务(WAR) | 2014年7月7日11:45 |
青蒿素分期 | 网上商店(WAR) | 2014年8月7日18:30 |
芳纶 | com.ringbearer.BatchProcessor | 01.01.2001 00:00 |
因此,实际上,我们能够提出一个不错的解决方案,并在其他所有方法均失败的情况下使用-Dplumbr.application.name参数进行手动命名。 仍然存在一个问题–为什么JVM工具和API完全缺少系统管理员通常需要的东西?
翻译自: https://www.javacodegeeks.com/2014/07/identifying-jvm-trickier-than-expected.html
识别JVM –比预期的要复杂相关推荐
- jvm能识别什么字符集_识别JVM –比预期要难
jvm能识别什么字符集 在Plumbr,我们花费了上个月的时间来为将来的重大改进奠定基础. 此类构件之一是为JVM添加唯一标识符,以便将来自同一JVM的所有会话链接在一起. 尽管一开始似乎是一项琐碎的 ...
- 又一任务被Transformer攻陷!NVIDIA开源HORST,用Transformer解决早期动作识别和动作预期任务...
关注公众号,发现CV技术之美 本文分享论文『Higher Order Recurrent Space-Time Transformer for Video Action Prediction』,由 N ...
- JVM 优点与缺点的深入分析
Java 最初诞生的时候,它可以说是其他语言的进化版.不仅因为Java很简单,而且这一进化的语言还是一个可以运行第三方硬件字节码的虚拟机.它还是垃圾收集站,从而令存储管理和内核转储(core dump ...
- 三维全景导航、偏航识别、深度学习偏航引擎,滴滴导航若干关键功能的技术突破与实践...
导读:滴滴导航是滴滴出行旗下基于丰富的交通大数据和领先的算法策略,面向网约车及自驾场景而打造的一款技术领先的地图产品.伴随着海量网约车司机每日8小时+的导航使用,产品积累了大量的反馈并持续优化打磨.在 ...
- SOTIF预期功能安全分析方法
文章目录 1. 预期功能安全简介 2. SOTIF中的场景分类 3. SOTIF预期功能安全分析方法 1. 预期功能安全简介 在汽车四化(电动化.网联化.智能化.共享化)领域,尤其是自动驾驶领域,引入 ...
- 论文阅读丨神经清洁: 神经网络中的后门攻击识别与缓解
摘要:本文将带你了解深度神经网络的后门知识,作者提出了一种可靠且可推广的DNN后门攻击检测和缓解系统,这是了解对抗样本和神经网络后门攻击的深度解读. 本文分享自华为云社区<[论文阅读] (02) ...
- 11.JVMGC基础
一.JVM基础 1.基础术语 1.1 并行并发 并行 并行是多个线程同时在运行,其发生在多核心 CPU 下,每个 CPU 核心执行一个线程,多个线程同时执行 并发 并发偏重于任务交替执行,但是多个任务 ...
- csdn最牛“首发”性能测试系类文章---jmeter性能测试从理论基础到项目搭建【3-1】
[性能测试系类文章大纲] 最近看很多小伙伴问我凡叔什么时候出性能测试系类呢,这不就来了嘛,连续肝了几天终于是赶出来了,这段时间公司有点忙,所以可能更新的速度没用那么快哦,不过也不会慢到哪里去,, 好了 ...
- 【Java10】lambda表达式(函数式编程),Stream流,File类,字节/字符流,乱码,缓冲/转换/序列化/打印流,Properties
文章目录 1.lambda表达式标准语法:()->{} 2.lambda表达式简略语法:可推导即可省略 3.lambda表达式原理:lambda效率比匿名内部类高 4.两个函数式接口:Consu ...
最新文章
- [转载] Intention scheduling for BDI agent systems
- Qt修炼手册12_线程同步与线程等待条件
- 图像处理技术(三)白平衡
- TIOBE 11 月榜单:Python 挤掉 Java,Java的下跌趋势确立了?
- MySQL时间戳与日期格式的相互转换
- Java并发编程实战~软件事务内存
- 神经网络训练3次就准确率不变_1组高效徒手训练,6个动作每周3-5次,帮你在家高效率燃脂增肌!...
- html清除div虚线,纯CSS去除按钮以及链接点击时虚线
- Getphonenumber获得电话号码的例子
- sql server 按年月日分组
- 我对javascript面向对象编程的理解---------继承
- 宝藏级UI组件库:FirstUI,微信小程序版+uniapp版更新至1.6.0,完美支持vue3
- SXF2019集合遍历
- 412 Precondition Failed
- 基于GIS和Python的百度地图街景爬取
- 计算机二级c语言2019年3月,2019年3月计算机二级
- 计算机excel二进制,在Excel中实现二进制、八进制、十进制、十六进制之间的转换函数介绍...
- ThinkingInJava_吸血鬼数
- 求三个数的最小公倍数的解法之美
- 二维小球完全弹性碰撞绝对坐标速度计算公式
热门文章
- List实现类中调用下标删除VS调用元素删除
- 集合中重写equals方法删除new的对象
- js 方法传递对象参数
- 学生用计算机说明方法,15.文中多处运用了作比较的说明方法.请任选一例.说说运用这种方法的作用. 例子: 作用:...
- c遗传算法的终止条件一般_KDD比赛之遗传算法(举例理解)
- mysql8.0.11 zip安装教程
- 匿名内部类与Lambda表达式习题
- graphql 有必要吗_您准备好观看GraphQL了吗?
- io流,装饰者模式_流与装饰器
- java 9 module_Java 9:欢迎来到Module World