Flo*_*kel 80 java garbage-collection heap-memory g1gc java-7
Java 7已经出现了一段时间了,但我找不到任何关于垃圾收集器配置的好资源,特别是新的G1收集器.
我的问题:
Car*_*rey 47
G1垃圾收集器不是我安装的Java版本1.7.0_01中的默认值.您可以通过使用一些额外的命令行选项来自己查看:
> java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -version
-XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:ParallelGCThreads=4 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
Heap
 PSYoungGen      total 37696K, used 1293K [0x00000007d5eb0000, 0x00000007d88c0000, 0x0000000800000000)
  eden space 32320K, 4% used [0x00000007d5eb0000,0x00000007d5ff3408,0x00000007d7e40000)
  from space 5376K, 0% used [0x00000007d8380000,0x00000007d8380000,0x00000007d88c0000)
  to   space 5376K, 0% used [0x00000007d7e40000,0x00000007d7e40000,0x00000007d8380000)
 PSOldGen        total 86144K, used 0K [0x0000000781c00000, 0x0000000787020000, 0x00000007d5eb0000)
  object space 86144K, 0% used [0x0000000781c00000,0x0000000781c00000,0x0000000787020000)
 PSPermGen       total 21248K, used 2032K [0x000000077ca00000, 0x000000077dec0000, 0x0000000781c00000)
  object space 21248K, 9% used [0x000000077ca00000,0x000000077cbfc288,0x000000077dec0000)
您不需要启用实验选项来打开G1收集器,但是:
> java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseG1GC -version
-XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:+UseG1GC -XX:-UseLargePagesIndividualAllocation
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
Heap
 garbage-first heap   total 130048K, used 0K [0x000000077ca00000, 0x0000000784900000, 0x00000007fae00000)
  region size 1024K, 1 young (1024K), 0 survivors (0K)
 compacting perm gen  total 20480K, used 2032K [0x00000007fae00000, 0x00000007fc200000, 0x0000000800000000)
   the space 20480K,   9% used [0x00000007fae00000, 0x00000007faffc288, 0x00000007faffc400, 0x00000007fc200000)
No shared spaces configured.
我不知道在哪里可以找到任何好的文档.
Flo*_*kel 31
甲骨文最终在Java 7 U4中取得了正式成绩:http: //www.oracle.com/technetwork/java/javase/7u4-relnotes-1575007.html
说明:http: //docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html
命令行选项:http: //www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#G1Options
尽管如此,我认为它不是Java 7中的默认收集器.对于服务器,默认情况下是Java 6中的并行收集器.
Woj*_*zyk 22
是的,G1是Java 1.7 JVM中的新标准垃圾收集器.
在这里,您可以找到有关如何使用和配置新垃圾收集器的大量信息:
使用G1 G1仍然被认为是实验性的,可以使用以下两个参数启用:
-XX:+ UnlockExperimentalVMOptions -XX:+ UseG1GC
要设置GC暂停时间目标,请使用以下参数:
-XX:MaxGCPauseMillis = 50(暂停时间目标为50ms)
对于G1,可以指定一个时间间隔,在此期间GC暂停应该持续不超过上面给出的时间:
-XX:GCPauseIntervalMillis = 200(暂停间隔目标为200ms)
请注意,上述两个选项代表目标,而不是承诺或保证.它们可能在某些情况下运行良好,但在其他情况下则不然,GC可能无法始终遵守它们.
或者,可以明确指定年轻一代的规模以影响疏散暂停时间:
-XX:+ G1YoungGenSize = 512m(年轻一代512兆)
G1还使用幸存者空间的等价物,当然,幸存者空间是一组(可能是非连续的)区域.它们的大小可以用通常的参数指定(例如,-XX:SurvivorRatio = 6).
最后,要充分发挥G1的作用,请尝试设置默认情况下当前禁用的这两个参数,因为它们可能会发现罕见的竞争条件:
-XX:+ G1ParallelRSetUpdatingEnabled -XX:+ G1ParallelRSetScanningEnabled
还有一点需要注意的是,当设置-XX:+ PrintGCDetails时,G1与其他HotSpot GC相比非常冗长.这是因为它打印每个GC线程时序和其他信息非常有助于分析和故障排除.如果您想要更简洁的GC日志,请切换到使用-verbosegc(尽管建议获取更详细的GC日志).
我也发现这篇文章对于理解G1的内部非常有帮助.
这里有更多信息.
Luk*_*ood 13
1. G1是Java 7中的默认收集器(...)
此Java 5页面上的规则仍适用于Java 7(和AFAIK,Java 8):
在运行服务器VM的服务器级计算机上,垃圾收集器(GC)已从先前的串行收集器(-XX:+ UseSerialGC)更改为并行收集器(-XX:+ UseParallelGC).
但也要考虑:
-clientVM,因此始终是"服务器类"例如,如果在Windows x64上运行...
1.(...)如何激活G1?
从Java 7开始,简单地说-XX:+UseG1GC.也许还令人感兴趣的是,当你想:
如果应用程序具有以下一个或多个特征,那么今天使用CMS或ParallelOld垃圾收集器运行的应用程序将有利于切换到G1.
- 超过50%的Java堆占用了实时数据.
- 对象分配率或促销率差异很大.
- 不期望的长垃圾收集或压实暂停(超过0.5到1秒)
2. g7在Java7中有哪些可选设置?
我自己没有使用G1,但我认为它坚持使用与调整其他并行收集器相同的基本"吞吐量/人体工程学"标志.根据我使用Parallel GC的经验,-XX:GCTimeRatio它一直是提供预期的速度 - 内存权衡的关键因素.因人而异.
3. Java 7中的(...)cms或并行收集器是否有变化?
不知道,但......
G1计划作为Concurrent Mark-Sweep Collector(CMS)的长期替代品
4.在哪里可以找到有关Java 7中垃圾收集的好文档?
找到它可能是一种痛苦,不是吗?可能我发现的最好的"中心"页面是这个:
http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140228.html
需要一些深度阅读,但如果你需要做一些调整,值得花时间.特别有见地的是:垃圾收集器人体工程学
Rav*_*abu 11
- G1是Java 7中的默认收集器,如果不是,我如何激活G1?
G1不是Java 7中的默认收集器.-XX:+UseG1GC将启用G1GC
- g7在Java7中有哪些可选设置?
有许多.有关完整信息,请查看此oracle文章.
G1 GC是一个自适应垃圾收集器,默认设置使其无需修改即可高效工作.
由于这个原因,请自定义关键参数
-XX:MaxGCPauseMillis
-XX:G1HeapRegionSize
-XX:ParallelGCThreads
-XX:ConcGCThreads
并将所有其他参数保留为默认值.
以下是重要选项及其默认值的列表.此列表适用于最新的Java HotSpot VM,版本24.您可以在JVM命令行上调整和调整G1 GC设置.
重要默认值:
-XX:G1HeapRegionSize=n
设置G1区域的大小.该值为2的幂,范围从1MB到32MB.目标是根据最小Java堆大小拥有大约2048个区域.
-XX:MaxGCPauseMillis=200
设置所需最大暂停时间的目标值.默认值为200毫秒.指定的值不适合您的堆大小.
-XX:G1NewSizePercent=5
设置要用作年轻代大小的最小值的堆的百分比.默认值是Java堆的5%.
-XX:G1MaxNewSizePercent=60
设置要用作年轻代大小的最大值的堆大小的百分比.默认值为Java堆的60%.
-XX:ParallelGCThreads=n
设置STW工作线程的值.将n的值设置为逻辑处理器的数量.n的值与逻辑处理器的数量相同,最大值为8.
如果有超过八个逻辑处理器,则将n的值设置为逻辑处理器的大约5/8.这在大多数情况下都有效,除了较大的SPARC系统,其中n的值可以是逻辑处理器的大约5/16.
-XX:ConcGCThreads=n
设置并行标记线程的数量.将n设置为并行垃圾回收线程数(ParallelGCThreads)的大约1/4.
-XX:InitiatingHeapOccupancyPercent=45
设置触发标记周期的Java堆占用阈值.默认占用率是整个Java堆的45%.
-XX:G1MixedGCLiveThresholdPercent=65
设置要包含在混合垃圾收集周期中的旧区域的占用阈值.默认入住率为65%
-XX:G1HeapWastePercent=10
设置您愿意浪费的堆的百分比.当可回收百分比小于堆废弃百分比时,Java HotSpot VM不会启动混合垃圾回收周期
-XX:G1MixedGCCountTarget=8
设置标记周期后的混合垃圾收集的目标数量,以收集最多具有G1MixedGCLIveThresholdPercent实时数据的旧区域.默认值为8个混合垃圾收集
-XX:G1OldCSetRegionThresholdPercent=10
设置混合垃圾回收周期中要收集的旧区域数量的上限.默认值是Java堆的10%
-XX:G1ReservePercent=10
设置保留空闲的百分比以保持空闲,从而降低空间溢出的风险.默认值为10%.增加或减少百分比时,请确保将总Java堆调整相同的量.
您已重新配置了许多G1GC参数,如果您按照上述文档页面进行操作,则不需要这些参数.请交叉检查以上建议,特别是ParallelGCThreads和ConcGCThreads,它们将基于您的CPU核心.删除不必要参数的重新配置.
来自oracle的建议:
在评估和微调G1 GC时,请记住以下建议:
年轻代大小:避免使用-Xmn选项或任何或其他相关选项明确设置年轻代大小-XX:NewRatio.  修复年轻一代的大小会覆盖目标暂停时间目标.
暂停时间目标:评估或调整任何垃圾收集时,始终存在延迟与吞吐量的权衡.G1 GC是一个增量垃圾收集器,具有统一的暂停,但在应用程序线程上也有更多的开销.G1 GC的吞吐量目标是90%的应用程序时间和10%的垃圾回收时间.
- 是否对Java 7中的其他收集器(如cms或并行收集器)进行了更改?
Java 7有一些变化.看看这篇文章
- 在哪里可以找到有关Java 7中垃圾收集的好文档?
有关gc和相关SE问题,请参阅oracle文档页面:
| 归档时间: | 
 | 
| 查看次数: | 96698 次 | 
| 最近记录: |