Lugovets Asked:2020-05-16 15:54:27 +0000 UTC2020-05-16 15:54:27 +0000 UTC 2020-05-16 15:54:27 +0000 UTC -Xmx64m 为什么我们需要对虚拟机进行这样的限制? 772 -Xmx64m, -Xms64m, -Xss64m 请告诉我,为什么我们在启动应用程序时需要这样的限制? jvm 2 个回答 Voted Best Answer Sanvirtus 2020-05-16T16:14:54Z2020-05-16T16:14:54Z OutOfMemoryError有哪些类型或者java进程内存由哪些部分组成。 如果您捕获到 OutOfMemoryError,这并不意味着您的应用程序创建了许多无法被垃圾收集器清除的对象并填满了您使用 -Xmx 参数分配的所有内存。至少我能想到您可能会看到此错误的其他两种情况。事实上,java 进程的内存并不局限于 -Xmx 区域,您的应用程序在该区域以编程方式创建对象。 一个java进程占用的内存区域由几部分组成。OutOfMemoryError 的类型取决于哪个空间用完了。 java.lang.OutOfMemoryError: Java 堆空间 堆上没有足够的空间,即在您的应用程序中放置以编程方式创建的对象的内存区域。使用 -Xms 和 -Xmx 选项设置大小。如果您尝试创建一个对象并且没有剩余的堆空间,您将收到此错误。通常问题出在内存泄漏上,这种情况有很多,互联网上充斥着关于这个主题的文章。 java.lang.OutOfMemoryError: PermGen 空间 当永久区域中没有足够的空间时会发生此错误,其大小由 -XX:PermSize 和 -XX:MaxPermSize 参数指定。那里有什么以及如何处理那里发生的OutOfMemoryError,我已经在这里详细描述了 java.lang.OutOfMemoryError:超出 GC 开销限制 当第一个和第二个区域溢出时都会发生此错误。它与没有足够的剩余内存和 GC 不断工作以试图释放一些空间的事实有关。这个错误可以使用-XX:-UseGCOverheadLimit参数来禁用,但是当然不能禁用,而是解决内存泄漏问题,或者分配更多空间,或者更改GC设置。 java.lang.OutOfMemoryError: 无法创建新的本机线程 几年前我第一次遇到这个错误,当时我正在做负载测试并试图找出可以使用我们的 Web 应用程序的最大用户数。我使用了一种特殊工具,允许用户登录并模拟他们的标准操作。在一定数量的客户端上,我开始收到 OutOfMemoryError。没有真正阅读消息的文本,并认为我没有足够的内存来创建用户会话和其他必要的对象,我增加了应用程序堆 (-Xmx) 的大小。想象一下,在那之后同时使用该系统的用户数量只减少了,我感到很惊讶。让我们仔细看看这是怎么发生的。 这实际上很容易在 32 位机器上的 Windows 上重现,因为那里分配的进程不超过 2GB。 假设您有一个包含大量并发用户的应用程序,该应用程序以参数 -Xmx1024M -XX:MaxPermSize=256M -Xss512K 开头。如果整个过程有2G可用,那么还有768M左右空闲。正是在这个内存残渣中创建了线程栈。因此,您大约可以创建不超过 768*(1024/512)=1536 个(我使用这些参数成功创建了 1316 个)线程(请参见文章开头的图),之后您将收到 OutOfMemoryError。如果增加 -Xmx,则可以创建的线程数会相应减少。减少 -Xss 以创建更多线程并不总是可行的方法,因为您的系统中可能有线程需要相当大的堆栈。例如,初始化线程或一些后台任务。但还是有出路的。事实证明,当您以编程方式创建线程时,您可以指定堆栈大小:Thread(ThreadGroup group, Runnable target, String name,long stackSize)。通过这种方式,您可以将 -Xss 设置得非常小,并在使用上述构造函数创建的单独线程中执行需要大堆栈的操作。 您可以在此处阅读有关线程堆栈中的内容以及此内存去向的更多信息。 当然,这个问题对你来说可能有点牵强,因为现在大多数服务器都运行在 64 位架构上,但我仍然认为这个例子非常有用,因为它有助于弄清楚 java 的内存由哪些部分组成过程组成。 摘自一篇关于哈布雷的文章 Lugovets 2020-05-16T16:12:30Z2020-05-16T16:12:30Z 在这里我找到了答案 -Xms size in bytes 设置 Java 堆的初始大小。默认大小为 2097152 (2MB)。值必须是 1024 字节 (1KB) 的倍数,并且大于 1024 字节。(-server 标志将默认大小增加到 32M。) -Xmn size in bytes 设置 Eden 生成的初始 Java 堆大小。默认值为 640K。(-server 标志将默认大小增加到 2M。) -Xmx size in bytes 设置 Java 堆可以增长到的最大大小。默认大小为 64M。(-server 标志将默认大小增加到 128M。)最大堆限制为 ab 出 2GB (2048MB)。
OutOfMemoryError有哪些类型或者java进程内存由哪些部分组成。
如果您捕获到 OutOfMemoryError,这并不意味着您的应用程序创建了许多无法被垃圾收集器清除的对象并填满了您使用 -Xmx 参数分配的所有内存。至少我能想到您可能会看到此错误的其他两种情况。事实上,java 进程的内存并不局限于 -Xmx 区域,您的应用程序在该区域以编程方式创建对象。
一个java进程占用的内存区域由几部分组成。OutOfMemoryError 的类型取决于哪个空间用完了。
堆上没有足够的空间,即在您的应用程序中放置以编程方式创建的对象的内存区域。使用 -Xms 和 -Xmx 选项设置大小。如果您尝试创建一个对象并且没有剩余的堆空间,您将收到此错误。通常问题出在内存泄漏上,这种情况有很多,互联网上充斥着关于这个主题的文章。
当永久区域中没有足够的空间时会发生此错误,其大小由 -XX:PermSize 和 -XX:MaxPermSize 参数指定。那里有什么以及如何处理那里发生的OutOfMemoryError,我已经在这里详细描述了
当第一个和第二个区域溢出时都会发生此错误。它与没有足够的剩余内存和 GC 不断工作以试图释放一些空间的事实有关。这个错误可以使用-XX:-UseGCOverheadLimit参数来禁用,但是当然不能禁用,而是解决内存泄漏问题,或者分配更多空间,或者更改GC设置。
几年前我第一次遇到这个错误,当时我正在做负载测试并试图找出可以使用我们的 Web 应用程序的最大用户数。我使用了一种特殊工具,允许用户登录并模拟他们的标准操作。在一定数量的客户端上,我开始收到 OutOfMemoryError。没有真正阅读消息的文本,并认为我没有足够的内存来创建用户会话和其他必要的对象,我增加了应用程序堆 (-Xmx) 的大小。想象一下,在那之后同时使用该系统的用户数量只减少了,我感到很惊讶。让我们仔细看看这是怎么发生的。
这实际上很容易在 32 位机器上的 Windows 上重现,因为那里分配的进程不超过 2GB。
假设您有一个包含大量并发用户的应用程序,该应用程序以参数 -Xmx1024M -XX:MaxPermSize=256M -Xss512K 开头。如果整个过程有2G可用,那么还有768M左右空闲。正是在这个内存残渣中创建了线程栈。因此,您大约可以创建不超过 768*(1024/512)=1536 个(我使用这些参数成功创建了 1316 个)线程(请参见文章开头的图),之后您将收到 OutOfMemoryError。如果增加 -Xmx,则可以创建的线程数会相应减少。减少 -Xss 以创建更多线程并不总是可行的方法,因为您的系统中可能有线程需要相当大的堆栈。例如,初始化线程或一些后台任务。但还是有出路的。事实证明,当您以编程方式创建线程时,您可以指定堆栈大小:Thread(ThreadGroup group, Runnable target, String name,long stackSize)。通过这种方式,您可以将 -Xss 设置得非常小,并在使用上述构造函数创建的单独线程中执行需要大堆栈的操作。
您可以在此处阅读有关线程堆栈中的内容以及此内存去向的更多信息。
当然,这个问题对你来说可能有点牵强,因为现在大多数服务器都运行在 64 位架构上,但我仍然认为这个例子非常有用,因为它有助于弄清楚 java 的内存由哪些部分组成过程组成。
摘自一篇关于哈布雷的文章
在这里我找到了答案