【问题标题】:Profiling JVM: Committed vs Used vs free Memory分析 JVM:已提交内存、已用内存和可用内存
【发布时间】:2018-11-30 15:14:00
【问题描述】:

我正在使用 JProfiler 分析部署到 Jetty 服务器的 Java 应用程序。

过了一会儿,我得到了这个内存遥测:

右边是这个Java进程在Windows任务管理器上的总内存。

  1. 我看到 JProfiler 中的已提交内存周期性增加,尽管大多数时候,大部分内存是空闲的(绿色)。为什么提交的内存会这样增加?
  2. 在拍摄上图的时间点,JProfiler 中的 Committed Memory 显示为 3.17GB,但 Windows 任务管理器显示更高 - 4.2457 GB。这不是他们都表现出的相同记忆吗?造成这种差异的原因可能是什么?

【问题讨论】:

  • 任务管理器对“堆内存”一无所知。它始终显示总内存、堆、堆栈、代码、非堆数据、缓冲区等。
  • JVM 需要内存用于许多其他目的,而不是纯粹的堆。

标签: java memory-leaks jvm profiling jprofiler


【解决方案1】:

如果峰值内存使用量接近总提交内存大小,只要 -Xmx 值允许,JVM 就会增加提交内存(操作系统实际为进程保留的内存)。

这有点像填充 ArrayList。当 backing array 用尽时,它会以越来越大的步长放大,因此不必为每个 insert 调整大小。

关于任务管理器和JVM的堆大小的区别,任务管理器中的内存总是大于堆大小,一般很难解释。有关不同措施的说明,请参见此处:

https://technet.microsoft.com/en-us/library/ff382715.aspx

【讨论】:

    猜你喜欢
    • 2016-09-05
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 2021-11-17
    • 2011-12-18
    • 2017-02-17
    相关资源
    最近更新 更多