启动时出现jvm问题
我可以将最大内存设置为1000,但不会超过此值,如果我将内存设置为超过此值,则会引发以下错误。
VM初始化期间发生错误无法为对象堆预留足够的空间无法创建Java虚拟机。
我的问题是,为什么jvm在启动时查找最大内存?
提前致谢。
Sun JVM需要一个连续的内存区域来存放堆。 使用Sysinternals套件中的工具vmmap
,您可以准确检查Java进程的内存布局。 要做到这一点,请编写一个简单的Java程序,如下所示:
public class MemoryLayout {
public static void main(String[] args) throws java.io.IOException {
System.in.read();
}
}
编译该程序并使用大堆设置运行它
javac MemoryLayout.java
java -Xmx1000m -Xms1000m MemoryLayout
然后,启动vmmap
,选择java进程并查找大小超过1000000k的黄色内存区域。 这是JVM堆。 仔细查看下面,你会最终找到一个紫色的行,表明有一个DLL文件映射。 此DLL文件可防止您的JVM堆增大。
如果你知道你在做什么,你可以重新绑定这个DLL,所以它会被加载到不同的地址。 Microsoft提供了一个称为rebase.exe
的工具,作为Microsoft Platform SDK的一部分(我的版本是5.2.3790.1830)。
有两个直接控制(正常)堆大小的命令行参数:
-Xmx<nnn>
设置最大堆大小 -Xms<nnn>
设置初始堆大小 在这两种情况下, <nnn>
都是多个字节,末尾的k
或m
分别表示千字节和兆字节。 初始大小给出了JVM启动时分配的堆大小,最大大小限制了它可以增长的大小。 (但是JVM也为缓冲区分配内存,“permgen”堆,堆栈和其他东西......除了普通的堆。)
目前还不清楚你实际上给了什么选择。 (值为1000
没有任何意义, -Xmx
大小必须大于2兆字节, -Xms
大小必须大于1兆字节;请参阅此页面。)
使初始堆大小小于最大堆大小有优点和缺点; 例如-Xms100m -Xmx1000m
。 但没有意义使最大堆大小超过您的机器可以分配给JVM的虚拟内存量。
为什么jvm在启动时查找最大内存。
它想要确保它最终可以分配您所说的最高金额。
为什么你需要设置一个更高的最大值,然后你的机器实际支持?
答案:如果您可以将其设置为基本无限制,那么这将使JVM配置更容易,尤其是在部署到不同计算机的情况下。 这在早期版本中是可行的,但对于当前的Sun JVM,您必须为每台机器找出“适当”的值。 希望未来会有更多的智能/自动记忆设置。
链接地址: http://www.djcxy.com/p/82975.html上一篇: jvm issue at startup