我正在尝试为延迟敏感的Java应用程序编写一个预热例程,以便优化前几个可能因动态类加载和JIT(主要是)而减慢的事务.
我面临的问题是,即使我的预热代码加载所有类并通过多次调用它们(至少100次-XX:CompileThreshold)来练习它们,之后当实际用户登录这些相同的函数时仍然标记为"非参赛者"并再次重新编译,这会造成延迟.
JVM标志如下(我只添加了-XX:+ PrintCompilation -verbose:class tp troubleshoot,其他是遗留的):
-Xms5g -Xmx5g -server -XX:+ AggressiveHeap -XX:+ UseFastAccessorMethods -XX:+ PrintGCDetails -XX:CompileThreshold = 100 -XX:-CITime -XX:-PrintGC -XX:-PrintGCTimeStamps -XX:+ PrintCompilation -verbose:类
#Warmup happens here
12893 2351 my.test.application.hotSpot (355 bytes)
#Real user logs on here
149755 2351 made not entrant my.test.application.hotSpot (355 bytes)
151913 2837 my.test.application.hotSpot (355 bytes)
152079 2351 made zombie my.test.application.hotSpot (355 bytes)
Run Code Online (Sandbox Code Playgroud)
在预热之后没有发生类加载(我之前可以看到类加载,因此标志正在工作).
看起来该函数获得了一个新的ID(2351 vs 2837),这意味着它被JVM视为"不同".
我如何确定JVM决定重新编译此函数的原因?
我想这归结为我如何确定ID改变的原因?标准是什么?
我尝试尽可能多地标记尽可能多的方法和类,但无济于事.
这是JRE 1.6.0_45-b06.
有关如何排除故障或获取更多信息的任何提示!:)
我基本上尝试编写一个类似pstree的命令,除了它应该遵循跨机器的进程.
我的意思是如果我运行这个:
$ ssh $node sleep 1000
Run Code Online (Sandbox Code Playgroud)
那么命令应该显示如下:
ssh $node -- ($node) sleep 1000
Run Code Online (Sandbox Code Playgroud)
如果我跑步:
$ ssh $node ssh $node sleep 1000
ssh $node---($node) ssh $node---($node) sleep 1000
Run Code Online (Sandbox Code Playgroud)
等等 ...
我的问题是:如何将一台机器上的一个ssh会话映射到另一台机器上的生成进程?
本地父子进程不是问题,但是如何确定在另一个节点上触发另一个进程的一个节点上的哪个ssh命令.
linux 2.6.18
只有openSSH的"远程"东西.目前正在运行OpenSSH_4.3p2.
当然,SSH访问所有节点(基于密钥的身份验证),因此可以从所有节点获得ps和netstat.
仅Linux的"黑客"很好,不需要便携,但当然这将是一个额外的好处.
用户将始终保持不变,并且我的命令/脚本正在以该用户身份运行.该用户不是root用户.
不必快,只准确.
自发的解决方案是编写一个pstree克隆,在命令字符串" ssh" 上触发,找出源端口然后转到相关的远程机器并找出sshd由这个特定命令生成的孩子中的哪一个.
但也许有一种更聪明的方式呢?:P