`
ayufox
  • 浏览: 278025 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

[Java性能剖析]Sun JVM Attach API

    博客分类:
  • JVM
阅读更多

     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;
        }
}

 

 

4
4
分享到:
评论
1 楼 sswh 2013-12-02  
非常不错,感谢分享!!

相关推荐

    JavaAgent例子-agentmain方式

    `VirtualMachine`类来自`sun.jvm.attach`包(在Java 9及以上版本,这个包被移到了`jdk.attach`下),它提供了与正在运行的JVM实例交互的能力。在JavaAgent的agentmain方式中,我们需要先找到目标JVM,然后使用`...

    sonar-runner-dist-2.4

    VisualVM 是一款免费且强大的 Java 性能分析工具,能够通过多种方式(如 jvmstat、JMX、SA 以及 Attach API)收集程序运行时的数据,并进行动态性能分析。它可以减少性能分析对应用程序的影响,提高分析的精度。 - ...

    Java Source

    为了调试和优化Java源码,开发者会使用各种工具,如IDE(Eclipse、IntelliJ IDEA等)、版本控制系统(Git)、构建工具(Maven、Gradle)、性能分析器(VisualVM)等。此外,遵循良好的编程规范,如SOLID原则和DRY...

    jprofiler工具

    JProfiler是一款强大的Java性能分析工具,它在Java开发和优化领域有着广泛的使用。JProfiler提供了详尽的内存分析、CPU profiling、线程分析、JVM配置优化等多种功能,帮助开发者深入理解应用程序的运行状况,定位并...

    jdk1.8.0_201 源码包

    通过分析这些源码,开发者可以学习到Java语言的设计原则,理解JVM如何工作,以及如何利用Java API来构建高效、稳定的软件系统。深入研究源码有助于提升编程技能,解决复杂问题,并为优化代码和设计提供灵感。例如,...

    jdk tools.jar包

    、com.sun.tools.attach等其他类库,它们分别用于生成API文档和控制已运行的Java虚拟机(JVM)。这些类库的存在使得开发者可以方便地扩展和定制Java开发环境。 在实际开发中,我们经常需要利用tools.jar提供的工具...

    Instrument

    Instrumentation接口及其相关API是Java代理(Java Agent)的基础,允许开发者在程序运行期间动态地插入代码,实现诸如性能监控、内存分析、代码覆盖率测试等高级功能。 1. **Java代理(Java Agent)**: Java ...

Global site tag (gtag.js) - Google Analytics