启动时出现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>都是多个字节,末尾的km分别表示千字节和兆字节。 初始大小给出了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

    下一篇: android studio .. how do i fix this?