我正在prod中运行我的一个Sping Boot 应用程序(CRUD操作),它占用了大约400M的内存。我还没有定义任何Xmx和Xms值。我怎样才能知道这个内存消耗是正常还是高。是否建议使用Xmx和Xms值?若为是,如何计算这些值?
aoyhnmkz1#
如何确定此内存消耗是“正常”还是“高”?不可能“弄清楚”。内存消耗取决于您的应用程序是什么、它执行什么以及它使用的策略。例如,应用程序可能会使用大量内存:
因此,“正常”与“高”之间的关系高度依赖于上下文。也是个人看法的问题。是否建议使用Xmx和Xms值?这取决于应用程序。例如,如果不指定Xmx值,则使用特定于平台的公式来计算默认值;参见How is the default max Java heap size determined?。该默认值可能是合适的。如果是,如何计算这些值?凭经验。您尝试不同的值,并观察会发生什么。值得注意的是,JVM需要一定比例的“额外”空间,以便GC能够高效地工作1。因此,即使可以计算应用程序的所有对象的大小的总和,JVM也需要比这更多的内存来提高效率。1 -垃圾收集器的工作方式是“标记”堆以确定哪些是可访问的,然后回收不可访问的对象。标记的工作量与可访问对象和引用的数量成正比。当堆中几乎充满了可访问的对象时,GC将花费大量时间进行标记,并且找不到许多可以删除的对象。很明显,如果每次运行时都能找到大量的实际垃圾来回收,GC将变得更加高效。这意味着堆需要足够大,以容纳除所有可访问对象之外的大量垃圾。
Xmx
Xms
zy1mlcev2#
特别推荐在生产环境中使用该标志,以避免OutOfMemory错误。但有时会发生内存泄漏。这会占用堆内存。你可以使用java profiler工具来监视你的jvm堆,找出内存泄漏,并了解哪些配置是好的。如果你使用Intellij,你可以集成Java profiler:Intellij<->JProfilerXms标志没有默认值,Xmx的默认值通常为256 MB。堆的总大小不能超过可用的物理RAM数量。您必须为其他应用程序在计算机上运行保留一些物理RAM。您应该将Xms和Xmx设置为相同的值以获得最佳性能。这些选项决定了堆的总大小。
2条答案
按热度按时间aoyhnmkz1#
如何确定此内存消耗是“正常”还是“高”?
不可能“弄清楚”。内存消耗取决于您的应用程序是什么、它执行什么以及它使用的策略。
例如,应用程序可能会使用大量内存:
因此,“正常”与“高”之间的关系高度依赖于上下文。也是个人看法的问题。
是否建议使用
Xmx
和Xms
值?这取决于应用程序。例如,如果不指定
Xmx
值,则使用特定于平台的公式来计算默认值;参见How is the default max Java heap size determined?。该默认值可能是合适的。如果是,如何计算这些值?
凭经验。您尝试不同的值,并观察会发生什么。
值得注意的是,JVM需要一定比例的“额外”空间,以便GC能够高效地工作1。因此,即使可以计算应用程序的所有对象的大小的总和,JVM也需要比这更多的内存来提高效率。
1 -垃圾收集器的工作方式是“标记”堆以确定哪些是可访问的,然后回收不可访问的对象。标记的工作量与可访问对象和引用的数量成正比。当堆中几乎充满了可访问的对象时,GC将花费大量时间进行标记,并且找不到许多可以删除的对象。很明显,如果每次运行时都能找到大量的实际垃圾来回收,GC将变得更加高效。这意味着堆需要足够大,以容纳除所有可访问对象之外的大量垃圾。
zy1mlcev2#
特别推荐在生产环境中使用该标志,以避免OutOfMemory错误。但有时会发生内存泄漏。这会占用堆内存。你可以使用java profiler工具来监视你的jvm堆,找出内存泄漏,并了解哪些配置是好的。如果你使用Intellij,你可以集成Java profiler:Intellij<->JProfiler
Xms标志没有默认值,Xmx的默认值通常为256 MB。堆的总大小不能超过可用的物理RAM数量。您必须为其他应用程序在计算机上运行保留一些物理RAM。您应该将Xms和Xmx设置为相同的值以获得最佳性能。这些选项决定了堆的总大小。