2012-03-12 1008 views
1

我正在为Ehcache-RMI复制做一个概念验证。获取Classnotfoundexception:无法识别或无法识别附加API:com.sun.tools.attach.VirtualMachine

我正在使用2台笔记本电脑,都运行兵马俑服务器。 (并且两者都在同一网络中)。 ehcache.xml配置为使用多点传送IP进行自动对等点发现。

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

我首先在一台笔记本电脑上运行了主程序,由于第一次缓存未命中,它会写入缓存。当我从另一台笔记本电脑运行的程序,我得到这个例外..

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

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

2012年3月13日上午12时07分31秒net.sf.ehcache.pool.sizeof.AgentLoader $ 1运行 信息:位于'C:\ Program Files \ Java \ jdk1.6.0_24 \ jre的.. \ LIB \ tools.jar中”

我很坚持..

谁能帮助!

回答

1

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

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

0

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

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

编号:Here

+0

即使切换到JDK 1.7就职于我! – 2015-01-08 06:03:36