jvm 如何确定理想的内存消耗Sping Boot 应用程序

nqwrtyyt  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(119)

我正在prod中运行我的一个Sping Boot 应用程序(CRUD操作),它占用了大约400M的内存。我还没有定义任何Xmx和Xms值。
我怎样才能知道这个内存消耗是正常还是高。是否建议使用Xmx和Xms值?若为是,如何计算这些值?

aoyhnmkz

aoyhnmkz1#

如何确定此内存消耗是“正常”还是“高”?
不可能“弄清楚”。内存消耗取决于您的应用程序是什么、它执行什么以及它使用的策略。
例如,应用程序可能会使用大量内存:

  • 因为它采用了需要大的内存数据结构的算法,或者
  • 因为它通过在内存中缓存内容而获得了显著的性能优势,或者
  • 因为它的设计/实施很差;例如,它存在内存泄漏、使用了过多的线程、* 不必要地 * 创建了大量的内存中数据结构等等。

因此,“正常”与“高”之间的关系高度依赖于上下文。也是个人看法的问题。
是否建议使用XmxXms值?
这取决于应用程序。例如,如果不指定Xmx值,则使用特定于平台的公式来计算默认值;参见How is the default max Java heap size determined?。该默认值可能是合适的。
如果是,如何计算这些值?
凭经验。您尝试不同的值,并观察会发生什么。
值得注意的是,JVM需要一定比例的“额外”空间,以便GC能够高效地工作1。因此,即使可以计算应用程序的所有对象的大小的总和,JVM也需要比这更多的内存来提高效率。
1 -垃圾收集器的工作方式是“标记”堆以确定哪些是可访问的,然后回收不可访问的对象。标记的工作量与可访问对象和引用的数量成正比。当堆中几乎充满了可访问的对象时,GC将花费大量时间进行标记,并且找不到许多可以删除的对象。很明显,如果每次运行时都能找到大量的实际垃圾来回收,GC将变得更加高效。这意味着堆需要足够大,以容纳除所有可访问对象之外的大量垃圾。

zy1mlcev

zy1mlcev2#

特别推荐在生产环境中使用该标志,以避免OutOfMemory错误。但有时会发生内存泄漏。这会占用堆内存。你可以使用java profiler工具来监视你的jvm堆,找出内存泄漏,并了解哪些配置是好的。如果你使用Intellij,你可以集成Java profiler:Intellij<->JProfiler
Xms标志没有默认值,Xmx的默认值通常为256 MB。堆的总大小不能超过可用的物理RAM数量。您必须为其他应用程序在计算机上运行保留一些物理RAM。您应该将Xms和Xmx设置为相同的值以获得最佳性能。这些选项决定了堆的总大小。

相关问题