2012-03-12 219 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