释放 Java 堆空间
Release Java Heap Sapce
我遇到 java 性能问题。我尝试使用 GC1,但效果并不理想。我唯一的问题是为什么 JVM 保留 java 堆 space 即使它没有被使用?
正如您首先在图片中看到的那样,批处理工作在 10:30 左右完成,但未触发垃圾收集器进行清理。所以我在 10:52 处手动完成,然后释放了使用过的 space 但堆 (8GB) 仍由 JVM 分配。为什么 ?
我在做与您完全相同的事情时也看到了这种趋势(见此处)。解释很简单:JVM 不会将内存还给 OS,即使它有很多空闲内存。我不知道 why
的确切细节是这样的,但这与从 OS
请求内存很昂贵(这是非常简单的)这一事实有关。
所以我想这里的简单答案是 - 这是正常的。
在这里!我找到了我实际阅读过 this 的地方。
仅当应用程序需要额外内存时才会触发 GC。 gc 是一项昂贵的任务,vm 将决定何时 运行 它。如果您怀疑您的程序需要内存而 GC 没有释放它,那就是一个问题。如果您可以分享演示此问题的测试用例,我们将努力解决此问题。
G1GC 与应用程序线程并发执行全堆操作,例如全局标记。 这可以防止与堆成比例的中断。
由于 G1GC 是一种新时代垃圾收集算法,只有在以下情况下才应从 CMS 或旧时代垃圾收集切换:
- 超过 50% 的 Java 堆被实时数据占用。
- 对象分配率或提升率差异很大。
- 不需要的长时间垃圾收集或压缩暂停(超过 0.5 到 1 秒)
有关 G1 内部工作的更多详细信息,请访问:http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html
我遇到 java 性能问题。我尝试使用 GC1,但效果并不理想。我唯一的问题是为什么 JVM 保留 java 堆 space 即使它没有被使用?
正如您首先在图片中看到的那样,批处理工作在 10:30 左右完成,但未触发垃圾收集器进行清理。所以我在 10:52 处手动完成,然后释放了使用过的 space 但堆 (8GB) 仍由 JVM 分配。为什么 ?
我在做与您完全相同的事情时也看到了这种趋势(见此处)。解释很简单:JVM 不会将内存还给 OS,即使它有很多空闲内存。我不知道 why
的确切细节是这样的,但这与从 OS
请求内存很昂贵(这是非常简单的)这一事实有关。
所以我想这里的简单答案是 - 这是正常的。
在这里!我找到了我实际阅读过 this 的地方。
仅当应用程序需要额外内存时才会触发 GC。 gc 是一项昂贵的任务,vm 将决定何时 运行 它。如果您怀疑您的程序需要内存而 GC 没有释放它,那就是一个问题。如果您可以分享演示此问题的测试用例,我们将努力解决此问题。
G1GC 与应用程序线程并发执行全堆操作,例如全局标记。 这可以防止与堆成比例的中断。
由于 G1GC 是一种新时代垃圾收集算法,只有在以下情况下才应从 CMS 或旧时代垃圾收集切换:
- 超过 50% 的 Java 堆被实时数据占用。
- 对象分配率或提升率差异很大。
- 不需要的长时间垃圾收集或压缩暂停(超过 0.5 到 1 秒)
有关 G1 内部工作的更多详细信息,请访问:http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html