2012-11-30 62 views
1

所解釋的問題似乎很常見,並且已經提出了不同的解決方案,其中許多解決方案都有效。 One example of this discussion can be found hereEclipse JRE 7與JRE 7在啓動時會導致問題

我的問題是更多關於爲什麼而不是如何

我們一直在摔跤這個問題,我們自己也發現,如果我們使用javaw.exe啓動eclipse,則會發生問題,但如果我們使用jvm.dll調用Eclipse,則問題不會出現。即使在這兩種情況下,eclipse.ini保持不變。

爲了解釋我的情況,我將使用從命令行啓動eclipse.exe以及一個-vm參數的示例。對於低於基準爲eclipse.ini,我們使用:

-startup 
plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar 
--launcher.library 
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.200.v20120522-1813 
--launcher.XXMaxPermSize 
256m 
-vmargs 
-Xms128m 
-Xmx1280m 
-XX:MaxPermSize=512m 
-Dderby.stream.error.field=java.lang.System.err 

你可以看到,請求分配內存是相當多的兩個堆(1280米)和PermGen的(512米)。如果您無法重現該問題,則可以嘗試增加內存,直到發生錯誤。

還有,你可以使用三種不同的命令行:

eclipse.exe -vm ..\jre\bin\javaw.exe 
eclipse.exe -vm ..\jre\bin 
eclipse.exe -vm ..\jre\bin\client\jvm.dll 

只有第一一個導致錯誤(javaw.exe的)。剩下的兩個選項成功啓動eclipse。在eclipse.ini中減少內存需求也明顯地解決了這個問題。

所以我的問題是,爲什麼javaw.exe失敗時,其他兩個命令行工作?選擇這些不同的路徑有什麼區別?一個人是否比其他人強制執行參數?

環境:Eclipse的:3.8-win32的,JRE:7u7-Win32中,Windows 7的64位

+0

你有更多然後1個Java版本嗎? – SomeJavaGuy

+0

你真的需要給它那麼多的RAM嗎?我在一些相當不錯的項目上工作,我從來沒有碰到Eclipse的JVM RAM(我也在JRE7上運行Juno)...... –

+0

@KevinEsche是的,但我認爲它不應該是一個因爲我自己提供了虛擬路徑。 –

回答

1

我無法解釋爲什麼指向的Eclipse可執行失敗,但DLL沒有,但我可以提供this解釋問題。其要點在於,在Windows上,JVM需要爲您的堆分配連續的內存塊,如果不能,則無法啓動。

也許this page將幫助找出爲什麼指向DLL似乎工作。否則,我會詢問Eclipse Equinox forum

+0

感謝您的鏈接,他們提供的信息。這至少解釋了爲什麼上面問題中的第二條和第三條命令是等價的。該DLL始終是首選。 「在大多數平臺上,我們使用JNI啓動,除非給出直接指向java可執行文件的-vm參數。」# –

+0

調用javaw。exe會爲JVM啓動一個新的進程,因此它可能會更好地執行諸如連續內存塊之類的需求。另一方面,調用DLL會導致JVM在當前進程中被實例化,也許此時JVM不能真正招待-Xmx和-Xms屬性,因爲該進程已經創建。因此,加載DLL只會導致內存屬性被忽略,從而導致檢查。這可能是一個有效的解釋嗎? –