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;
}
}
分享到:
相关推荐
以下是对"Java JVM及性能优化"和"Java性能分析"的详细阐述: 一、JVM结构与工作原理 1. 类装载器:负责加载类文件,确保在运行时能找到对应的类。 2. 运行数据区:包括方法区、堆、栈、本地方法栈和程序计数器。...
Java语言规范和JVM规范是理解Java编程基础和高级特性的关键参考资料,它们定义了Java程序的语法、语义以及虚拟机的行为。本压缩包包含了Java6至Java9的版本,涵盖了一系列重要的语言和虚拟机改进,对于Java开发者来...
《JAVA8虚拟机(jvm)规范_Chinese version》提供了关于JVM的详细中文指南,对于理解Java程序的运行机制、优化性能以及深入学习Java技术体系至关重要。下面我们将探讨一些重要的JVM知识点: 1. **内存模型**:JVM内存...
《实战Java虚拟机——JVM故障诊断与性能优化》内容简介:随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为一个充满活力的生态圈。本书将通过200余示例详细介绍Java虚拟机中的...
《深入理解Java虚拟机》是一本深度探讨Java虚拟机(JVM)的著作,涵盖了JVM性能调优、内存模型以及虚拟机原理等多个关键领域。本文将基于这些主题,详细阐述其中的重要知识点。 首先,我们要了解Java虚拟机(JVM)...
性能优化手册是一套java性能学习研究小技巧,包含内容:Java性能优化、JVM性能优化、服务器性能优化、数据库性能优化、前端性能优化等。 内容包括但不限于: String 性能优化的 3 个小技巧 HashMap 7 种遍历方式...
这份白皮书主要关注JVM的内部工作原理,包括垃圾收集、内存管理、类加载机制、性能优化等方面,是Java开发者深入理解Java运行环境的重要参考资料。 一、JVM概述 Java虚拟机(JVM)是Java平台的核心组成部分,它负责...
《实战Java虚拟机——JVM故障诊断与性能优化》是一本深入探讨Java开发人员和运维人员必备技能的书籍。本书作者葛一鸣以其丰富的实战经验,详细阐述了JVM(Java Virtual Machine)的工作原理,以及如何有效地进行故障...
10. **性能优化**:通过分析JVM的各种监控工具(如JConsole、VisualVM等),学习如何定位性能瓶颈并进行调优,包括堆大小调整、垃圾收集器选择、JVM参数设置等。 通过阅读这本书,开发者不仅能理解JVM的基本运作...
sunJVM的源代码9
《实战JAVA虚拟机—JVM故障诊断与性能优化》是一本深入探讨Java虚拟机(JVM)技术的书籍,旨在帮助开发者和系统管理员诊断并优化JVM相关的性能问题。本书内容丰富,涵盖了大量的实践案例,使得即便是初学者也能理解...
sunJVM的源代码
在Java性能调优中,JVM(Java Virtual Machine)创建对象和内存分配是至关重要的环节。这直接影响到程序的运行速度、内存占用以及整体系统的稳定性。本篇文章将深入探讨Java中对象创建的过程、内存分配机制,以及...
实战JAVA虚拟机 JVM故障诊断与性能优化.pdf (无书签.低分放送) 实战JAVA虚拟机 JVM故障诊断与性能优化.pdf (无书签.低分放送) 实战JAVA虚拟机 JVM故障诊断与性能优化.pdf (无书签.低分放送)
Java虚拟机(JVM)的性能调优是确保Java应用程序高效运行的关键。通过合理配置JVM参数和采用一些调优技巧,开发者可以显著提高应用程序的性能。本文将探讨一些常用的JVM性能调优技巧,并提供代码示例来展示这些技巧...
理解JVM的工作机制对于优化Java应用程序性能至关重要。 二、开源项目的意义 开源项目“jvmjava”为开发者提供了一种学习JVM内部运作方式的途径。通过阅读和分析源代码,我们可以了解JVM的各个组件,如类加载器、...
《实战Java虚拟机——JVM故障诊断与性能优化》将通过200余示例详细介绍Java虚拟机中的各种参数配置、故障排查、性能监控以及性能优化。 《实战Java虚拟机——JVM故障诊断与性能优化》共11章。第1~3章介绍了Java...
标题《JVM系列之性能调优参考手册(实践篇)》涉及的知识点主要集中在Java虚拟机(JVM)性能调优的实践操作。JVM作为Java程序运行的基础环境,对程序性能有着决定性影响。本手册的目的是指导开发者如何对JVM进行性能...
《实战Java虚拟机——JVM故障诊断与性能优化》是一本深入探讨Java开发中的关键环节——Java虚拟机(JVM)的专著。本书聚焦于实际应用中的问题解决和性能调优,对于Java开发者和系统管理员来说,是提升技术水平的重要...
java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...