Sun JVM Attach API是Sun JVM中的一套非标准的可以连接到JVM上的API,从JDK6开始引入,除了Solaris平台的Sun JVM支持远程的Attach,在其他平台都只允许Attach到本地的JVM上。
一、Sun JVM Attach API功能上非常简单,仅提供了如下几个功能:
- 列出当前所有的JVM实例描述(知道JDK工具jps吗,列出所有的java进程的pid)
- Attach到其中一个JVM上,建立通信管道
- 让目标JVM加载Agent(还记得JVM TI吧,运行后加载的Agent)
二、通过几个实例简单地了解一下如上的几个功能
1.列出当前所有的JVM实例描述
List<VirtualMachineDescriptor> list = VirtualMachine.list();
for (VirtualMachineDescriptor vmd : list)
{
System.out.println("pid:" + vmd.id() + ":" + vmd.displayName());
}
JConsole的连接界面中的本地部分就是通过这个API来做的
2.Attach到特定进程的JVM上,并加载Agent,我们看看jconsole是怎么做的(见sun.tools.jconsole. LocalVirtualMachine)
1)首先是Attach到JVM上
VirtualMachine virtualmachine = VirtualMachine.attach(pid);
2)然后是加载Agent
String javaHome = virtualmachine.getSystemProperties().getProperty("java.home");
String agentPath = javaHome + File.separator + "jre" + File.separator + "lib" + File.separator + "management-agent.jar");
File file = new File(agentPath);
if(!file.exists())
{
agentPath = javaHome + File.separator + "lib" + File.separator + "management-agent.jar";
file = new File(agentPath);
if(!file.exists())
throw new IOException("Management agent not found");
}
}
agentPath = file.getCanonicalPath();
try
{
virtualmachine.loadAgent(agentPath, "com.sun.management.jmxremote");
}
catch(AgentLoadException e)
{
throw new IOException(e);
}
catch(AgentInitializationException agentinitializationexception)
{
throw new IOException(e);
}
Properties properties = virtualmachine.getAgentProperties();
address = (String)properties.get("com.sun.management.jmxremote.localConnectorAddress");
virtualmachine.detach();
三、我们来看一下底层是如何处理Attach的,不同的平台处理方式当然是不一样的,我们看看Windows平台是如何处理的
首先Attach API定义了AttachProvider,我们当然可以通过实现不同的 AttachProvider来提供不同的Attach方式,当然这不是一件简单的事情,因为实际上是需要JVM支持的。以Windows平台为例,实现了WindowsAttachProvider,我们看看其中最主要的attach方法
public VirtualMachine attachVirtualMachine(String vmid)
throws AttachNotSupportedException, IOException
{
checkAttachPermission();
testAttachable(vmid);
return new WindowsVirtualMachine(this, vmid);
}
WindowsVirtualMachine在构造函数中先连接上目标JVM
WindowsVirtualMachine(AttachProvider attachprovider, String s)
throws AttachNotSupportedException, IOException
{
super(attachprovider, s);
…
hProcess = openProcess(i);
…
}
WindowsVirtualMachine继承HotSpotVirtualMachine,先看看HotSpotVirtualMachine的loadAgent方法
private void loadAgentLibrary(String s, boolean flag, String s1)
throws AgentLoadException, AgentInitializationException, IOException
{
InputStream inputstream = execute("load", new Object[] {
s, flag ? "true" : "false", s1
});
...
}
再看看WindowsVirtualMachine的execute,基本上调用的各种方法都是native方法,只能大概地猜测与JVM进程之间使用管道进行了一个通信
transient InputStream execute(String s, Object aobj[])
throws AgentLoadException, IOException
{
int i = (new Random()).nextInt();
String pipe ="\\\\.\\pipe\\javatool" + i;
long l = createPipe(pipe);
…
try
{
enqueue(hProcess, stub, s, pipe, aobj);
connectPipe(l);
PipedInputStream pipedinputstream = new PipedInputStream(l);
…
}
catch(IOException ioexception)
{
closePipe(l);
throw ioexception;
}
}
分享到:
相关推荐
Sun JVM原理与内存管理
Java助力需要jvm学习及优化与性能瓶颈分析参考
java性能调优-jvm创建对象和-performance-createobj-allocationmemory
Java JVMJava JVMJava JVM
性能优化手册是一套java性能学习研究小技巧,包含内容:Java性能优化、JVM性能优化、服务器性能优化、数据库性能优化、前端性能优化等。 内容包括但不限于: String 性能优化的 3 个小技巧 HashMap 7 种遍历方式...
sunJVM的源代码9
sunJVM的源代码
实战JAVA虚拟机 JVM故障诊断与性能优化.pdf (无书签.低分放送) 实战JAVA虚拟机 JVM故障诊断与性能优化.pdf (无书签.低分放送) 实战JAVA虚拟机 JVM故障诊断与性能优化.pdf (无书签.低分放送)
对 Java 工程师而言,性能优化能力决定了你能否进入大厂或成为一名高级工程师。但性能优化的能力却极难提升,如果你缺乏正确的方法论和实战演练,则很容易事倍功半。 视频大小:1.2G
《实战Java虚拟机——JVM故障诊断与性能优化》将通过200余示例详细介绍Java虚拟机中的各种参数配置、故障排查、性能监控以及性能优化。 《实战Java虚拟机——JVM故障诊断与性能优化》共11章。第1~3章介绍了Java...
Java语言规范和JVM虚拟机规范.zip,Oracle官方文档,包括Java语法的定义等内容。Java语言规范包含JDK678三个版本,JVM虚拟机规范包含78两个版本。
包含有Java6,Java7,Java8,Java9的语言规范和JVM的规范pdf文档,供大家参考,谢谢!深入学习Java编程必须要多看规范,搞清楚深层次的原理。
long果 深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)。讲解相当详细,值得一看。下载仅供参考学习,侵权联删。
《实战Java虚拟机——JVM故障诊断与性能优化》内容简介:随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为一个充满活力的生态圈。本书将通过200余示例详细介绍Java虚拟机中的...
实战Java虚拟机_JVM故障诊断与性能优化 JVM故障诊断与性能优化 JVM调优
java虚拟机(JVM)调优案例分析与MyEclipse性能调优实战
sunJVM的源代码8
随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java...《实战Java虚拟机——JVM故障诊断与性能优化》将通过200余示例详细介绍Java虚拟机中的各种参数配置、故障排查、性能监控以及性能优化。
java虚拟机简单原理jvm. java虚拟机简单原理jvm
Java API文档通常包含在Java开发工具包(JDK)中,并可以通过Java编译器和Java虚拟机(JVM)使用。 Java API文档通常是通过Java开发工具包(JDK)中的文档生成器自动生成的。在JDK中,有一个命令行工具javadoc,可以通过...