2012-11-30 58 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只会导致内存属性被忽略,从而导致检查。这可能是一个有效的解释吗? –