获取Classnotfoundexception:不可用或无法识别Attach API:com.sun.tools.attach.VirtualMachine

时间:2012-03-12 18:51:51

标签: ehcache

我正在为Ehcache-RMI复制做一个概念验证。

我正在使用2台笔记本电脑,都运行赤土陶器服务器。 (两者都在同一个网络中)。 ehcache.xml配置为使用多播IP进行自动对等发现。

两者都有一个独立的java程序。

我首先在一台笔记本电脑上运行主程序,因为它第一次出现了高速缓存,它会写入高速缓存。当我从另一台笔记本电脑运行程序时,我得到了这个例外..

2012年3月13日上午12:12:15 net.sf.ehcache.pool.sizeof.AgentLoader 信息:不可用或无法识别的附加API:java.lang.ClassNotFoundException:com.sun.tools.attach.VirtualMachine 2012年3月13日12:12:15 net.sf.ehcache.pool.sizeof.JvmInformation 信息:检测到的JVM数据模型设置:32位HotSpot JVM

但是,在另一台笔记本电脑上,它看起来很完美。它的说法,

2012年3月13日12:07:31 net.sf.ehcache.pool.sizeof.AgentLoader $ 1 run 信息:位于'C:\ Program Files \ Java \ jdk1.6.0_24 \ jre .. \ lib \ tools.jar'的有效'tools.jar'

我真的被卡住了..

有人可以帮忙!

2 个答案:

答案 0 :(得分:1)

正如您所看到的,这只是信息性的。基本上,Ehcache将尝试加载它在自己的jar中打包的Agent来进行对象sizeOf测量。 Ehcache附带了3个捆绑的SizeOfEngine实现:基于反射的实现,基于不安全的实现和代理实现。它将尝试从最后一个加载它们(列出颠倒顺序)。显然,你在这两台机器上使用不同的JDK / VM。如果您正在运行JDK 1.6,并且它可以找到Attach API(不在所有平台上的类路径上,但它仍尝试找到jar),则只能加载Agent 1。出于某种原因,这似乎在前者上失败了。您没有理由对此做任何事情......如果您真的想要使用代理(因此它必须连接到VM),您需要确保运行JDK 1.6,或者从ehcache jar中提取代理jar并在启动VM时声明代理。

现在,如果您在该计算机上使用JDK 1.6,我很想知道详细信息(操作系统,版本,JDK安装中tools.jar的位置),看看我们是否错过了一个角落案例......

答案 1 :(得分:0)

解决方案是使用java -classpath方法并加载两个库然后执行HotThread程序:

java -classpath "/opt/jdk1.6/lib/tools.jar:/home/samba/HotThread.jar" hotthread.Main 3223

参考:Here