G1GC:如何使用所有空闲内存?
G1GC: How to use all free memory?
我尝试在我的程序中使用 G1GC。程序在具有不同内存大小的各种机器上使用:VPS 内存为 1Gb(最小),台式机内存为 8Gb,DS 内存为 32Gb(最大)。我注意到即使有很多空闲内存,G1GC 也不会预留更多内存(例如,G1GC 在我的机器上预留的内存不超过 3Gb,总共 8Gb / 4Gb 空闲)
P.S。我想要通用解决方案。我无法为每种类型的机器创建单独的版本或单独的 运行 脚本。
我认为您选择了错误的垃圾收集算法。 Java 8 文档提供了以下指导:
Selecting a Collector
Unless your application has rather strict pause time requirements,
first run your application and allow the VM to select a collector. If
necessary, adjust the heap size to improve performance. If the
performance still does not meet your goals, then use the following
guidelines as a starting point for selecting a collector.
If the application has a small data set (up to approximately 100 MB), then select the serial collector with the option -XX:+UseSerialGC
.
If the application will be run on a single processor and there are no pause time requirements, then let the VM select the collector, or
select the serial collector with the option -XX:+UseSerialGC
.
If (a) peak application performance is the first priority and (b) there are no pause time requirements or pauses of 1 second or longer
are acceptable, then let the VM select the collector, or select the
parallel collector with -XX:+UseParallelGC
.
If response time is more important than overall throughput and garbage collection pauses must be kept shorter than approximately 1
second, then select the concurrent collector with
-XX:+UseConcMarkSweepGC
or -XX:+UseG1GC
.
根据您的评论,您的目标似乎是获得最佳性能;即最小化花费在 GC 和相关开销上的总时间。
这意味着您最好的选择是:
- 设置一些性能目标,让 JVM 决定哪个收集器最好。有关性能目标机制的详细信息,请参阅 Behavior-based Tuning material。
- Select Serial GC 如果你只有一个核心。
- Select Parallel GC 如果你有一个以上的核心。
如果您想要一个适用于所有硬件的通用脚本,无论您的硬件如何,性能目标方法是最好的,尽管这意味着您将无法使用特定于平台的设置来(可能)改进关于 JVM 的决定。
我尝试在我的程序中使用 G1GC。程序在具有不同内存大小的各种机器上使用:VPS 内存为 1Gb(最小),台式机内存为 8Gb,DS 内存为 32Gb(最大)。我注意到即使有很多空闲内存,G1GC 也不会预留更多内存(例如,G1GC 在我的机器上预留的内存不超过 3Gb,总共 8Gb / 4Gb 空闲)
P.S。我想要通用解决方案。我无法为每种类型的机器创建单独的版本或单独的 运行 脚本。
我认为您选择了错误的垃圾收集算法。 Java 8 文档提供了以下指导:
Selecting a Collector
Unless your application has rather strict pause time requirements, first run your application and allow the VM to select a collector. If necessary, adjust the heap size to improve performance. If the performance still does not meet your goals, then use the following guidelines as a starting point for selecting a collector.
If the application has a small data set (up to approximately 100 MB), then select the serial collector with the option
-XX:+UseSerialGC
.If the application will be run on a single processor and there are no pause time requirements, then let the VM select the collector, or select the serial collector with the option
-XX:+UseSerialGC
.If (a) peak application performance is the first priority and (b) there are no pause time requirements or pauses of 1 second or longer are acceptable, then let the VM select the collector, or select the parallel collector with
-XX:+UseParallelGC
.If response time is more important than overall throughput and garbage collection pauses must be kept shorter than approximately 1 second, then select the concurrent collector with
-XX:+UseConcMarkSweepGC
or-XX:+UseG1GC
.
根据您的评论,您的目标似乎是获得最佳性能;即最小化花费在 GC 和相关开销上的总时间。
这意味着您最好的选择是:
- 设置一些性能目标,让 JVM 决定哪个收集器最好。有关性能目标机制的详细信息,请参阅 Behavior-based Tuning material。
- Select Serial GC 如果你只有一个核心。
- Select Parallel GC 如果你有一个以上的核心。
如果您想要一个适用于所有硬件的通用脚本,无论您的硬件如何,性能目标方法是最好的,尽管这意味着您将无法使用特定于平台的设置来(可能)改进关于 JVM 的决定。