Java JVM 默认垃圾收集器 : is it configured the same across different applications?

标签 java garbage-collection jvm benchmarking

正如标题中所指定的那样。

我运行了一个测试,并使用 JMX 记录了一段时间内的内存堆使用模式。然后我稍后重新运行我的 jar 文件并再次研究它的内存行为。结果是内存模式略有不同。在这两种情况下,我都没有预先配置我的垃圾收集器。所以我现在想知道同一台机器上的两个默认垃圾收集器是否具有相同的配置。

如果不是,如何在不指定很多参数的情况下确保我的垃圾收集器是相同的?如果不是 GC 配置,还有哪些因素会对我的结果产生影响?

最佳答案

如果在同一台机器上使用相同的 JVM 运行相同的应用程序,堆和 GC 参数将相同。

人体工程学是早在 JDK 5.0 中就引入的一项功能,旨在尝试消除 GC 调优中的一些猜测。服务器级计算机(2 个或更多内核以及 2 Gb 或更多 Gb 内存)将使用 1/4 物理内存(最多 1 Gb)作为初始堆大小和最大堆大小(请参阅 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/ergonomics.html )。所以不同的机器默认配置可能不同。

要准确了解您设置的标志,请使用: java -XX:+PrintFlagsFinal -version

内存使用模式的差异只是应用程序的非确定性行为。即使使用完全相同的输入集,我怀疑您是否会看到完全相同的内存行为,只是由于许多其他操作系统和硬件影响(缓存、核心关联性等)。

关于Java JVM 默认垃圾收集器 : is it configured the same across different applications?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54884503/

相关文章:

c# - 使用 "yield"时,为什么编译器生成的类型同时实现 IEnumerable 和 IEnumerator

java - Minor GC 暂停时间太长。可能的原因?

java - Java 中的异常重铸错误消息

if-statement - 是否可以使用 if 和 while 将所有控制流图翻译回来?

java - 如何将十六进制字符串转换为普通字符串?

java - 如何在Java中对 double 值进行四舍五入

java - JCheckbox:从 ​​jar 添加图标而不是目录到标签?

java - 如何让 system.out.println() 在 hadoop 中工作

database - 如果 HTTP 是无状态的,为什么我需要关闭数据库连接?

scala - 如何指示 gradle 的 scala 插件在已安装的 JVM 中选择特定的 JVM?