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