Memory management 发布Java堆Sapce

Memory management 发布Java堆Sapce,memory-management,java-8,garbage-collection,heap,jvm-hotspot,Memory Management,Java 8,Garbage Collection,Heap,Jvm Hotspot,我对java性能有一个问题。我试着使用GC1,但它并没有使事情变得很好。我唯一的问题是,为什么JVM即使不使用java堆空间,也会保留它? 正如您在第一张图片中看到的,批处理工作在10:30左右完成,但垃圾收集器没有被触发进行清理。因此,我在10:52手动执行了此操作,然后释放了使用的空间,但堆(8GB)仍然由JVM分配。为什么? 我在做与您完全相同的事情时也看到了这一趋势(请参见此处)。解释很简单:JVM不会把内存还给操作系统,即使它有很多空闲内存。我不知道为什么会这样的确切细节,但这与从操作

我对java性能有一个问题。我试着使用GC1,但它并没有使事情变得很好。我唯一的问题是,为什么JVM即使不使用java堆空间,也会保留它? 正如您在第一张图片中看到的,批处理工作在10:30左右完成,但垃圾收集器没有被触发进行清理。因此,我在10:52手动执行了此操作,然后释放了使用的空间,但堆(8GB)仍然由JVM分配。为什么?

我在做与您完全相同的事情时也看到了这一趋势(请参见此处)。解释很简单:JVM不会把内存还给操作系统,即使它有很多空闲内存。我不知道
为什么会这样的确切细节,但这与从
操作系统
请求内存非常昂贵(这是非常简单的)这一事实有关

所以我想这里的简单答案是——这是正常的


给你!我找到了我真正读到的地方

仅当应用程序需要额外内存时才会触发GC。gc是一项昂贵的任务,vm将决定何时运行它。如果您怀疑您的程序需要内存,而GC没有释放内存,这是一个问题。如果您可以共享演示此问题的测试用例,我们将解决此问题。

G1GC将与应用程序线程同时执行整个堆操作,例如全局标记这可以防止与堆成比例的中断。

通过G1GC是一种新的垃圾收集算法,只有在以下情况下才能从CMS或旧垃圾收集进行切换:

  • 超过50%的Java堆被实时数据占用
  • 对象分配率或提升率差异很大
  • 垃圾收集或压缩暂停过长(超过0.5到1秒)

有关G1内部工作的更多详细信息,请访问:

谢谢您的回复。这很奇怪也很烦人。处理Java堆空间错误已经有两周的时间了:(我已经尝试过G1GC,但不是很好。问题是针对Java 6的代码,最近对Java 8的迁移导致了许多问题。但是我尝试了-XX:GCTimeRatio=19-XX:MinHeapFreeRatio=20-XX:MaxHeapFreeRatio=30,这很有帮助。