2012-07-19 50 views
2

我正試圖監視Quartz調度程序中的線程。我需要想出一個估計需要多少內存來執行我的工作。在ecplise中使用getThreadAllocatedBytes()獲取編譯錯誤

我試圖使用方法:

import java.lang.management.ManagementFactory; 

    ManagementFactory.getThreadMXBean().getThreadAllocationBytes(); 

然而,在Eclipse中我得到了一個錯誤:

The method getThreadAllocationBytes() is undefined for the type ThreadMXBean 

我搜索,發現該方法是在JDK6u25,自推出Eclipse正在使用它自己的編譯器,我無法修復這個問題。

編譯沒有Eclipse的類似乎是一個弱解決方案,因爲我需要能夠使用Eclipse編譯項目。

你能給我一些關於如何解決這個問題的建議嗎?

+1

您可以隨時在Eclipse中爲您的項目更改您的編譯器設置,如果這是您正在尋找的。 '項目>屬性> Java編譯器>啓用項目特定設置' – Sujay 2012-07-19 13:52:42

+0

這是行不通的。它允許在主要版本的JDK之間進行選擇。我需要在JDK6u25 eclipse中引入的方法只允許我選擇1.6 – Alper 2012-07-19 14:39:13

+0

Google找不到名爲getThreadAllocationBytes的方法(除此SO問題外)。在任何版本中,它也不作爲ThreadMXBean類的一部分列在GrepCode.com上。你在哪裏看到有關該方法的文檔? – 2012-07-19 14:40:47

回答

4

ManagementFactory給你一個java.lang.management.ThreadMXBean,但你要調用的方法是com.sun.management.ThreadMXBean界面中(它擴展了java.lang.management.ThreadMXBean接口)。

如果您是在Sun/Oracle的VM上運行,你可以把結果和調用方法:

((com.sun.management.ThreadMXBean)ManagementFactory.getThreadMXBean()) 
    .getThreadAllocatedBytes(); 

當然,這也適用於其他虛擬機失敗,但。 com.sun包也不建議使用,因爲那裏的類可能會隨時更改(即使對VM稍作更新)。所以最好在使用這個代碼時小心謹慎,並且不要依賴代碼。

編輯 如果仍然不能編譯這一點,但它的工作原理使用反射,還有比反射一個更好的方式。 Java Management API特別支持按名稱訪問bean和屬性,因爲在編譯時你想要顯示它們的時候通常都是不知道它們的(想想像JConsole或VisualVM這樣的通用JMX客戶端)。

使用下面的代碼:

ObjectName threadMxBean = new ObjectName(ManagementFactory.THREAD_MXBEAN_NAME); 
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); 
long[] memUsedPerThread = (long[]) mbeanServer.getAttribute(threadMxBean, "ThreadAllocatedBytes"); 

這應該工作,但我不能測試它,因爲我的JVM,屬性是不存在的。如果它不起作用,請使用JConsole或VisualVM,連接到您的Java進程並驗證該屬性是否確實具有正確的名稱。

你也可以看看JMX documentation

編輯2 在你的代碼示例,您使用getThreadAllocationBytes,但鏈接到API顯示getThreadAllocatedBytes。仔細檢查你是否正確。我的回答錯了,現在我修好了。

+0

我錯過了這個:/謝謝這是我正在尋找的東西。 – Alper 2012-07-19 15:40:28

0
  • 您可以隨時在Eclipse中更改您項目的編譯器設置,如果這就是您要找的。 Project > Properties > Java Compiler > Enable Project specific settings

  • 您還可以如下更改JRE系統庫:Project > Build Path > Configure Build Path > JRE System Library > Edit。從這裏您可以選擇不同的執行環境,或選擇添加備用JRE。

+0

您是否嘗試過構建路徑選項(第二部分)並指向您的系統中安裝的JDK6u25? – Sujay 2012-07-19 15:16:08

+0

這不起作用。它允許在主要版本的JDK之間進行選擇。我需要在JDK6u25 eclipse中引入的方法只允許我選擇1.6 – Alper 2012-07-19 15:19:02

+0

它被禁用,我無法從家用PC中更改它,我明天將在工作中嘗試它。但它似乎對於選擇編譯器合規性級別而非特定的JDK版本會很有用。 – Alper 2012-07-19 15:25:19