问题标签 [g1gc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java G1垃圾收集器产生Java不一致?
我最近尝试激活垃圾优先垃圾收集器并对其进行评估。作为开始,我编写了这段代码,试图生成一个java.lang.OutOfMemoryError
:
...我使用两种情况运行代码:
案例 1. 使用这些标志:-Xmx4096M -XX:+UseG1GC
,我得到以下输出:
...这意味着臭名昭著的东西OutOfMemoryError
被扔到了某个地方,但在 main 方法中被捕获了。
案例 2. 使用这个标志:-Xmx4096M
,我得到这个输出:
...这意味着异常在我期望它被捕获的地方被捕获。
笔记:
- 该代码是纯实验性的,不遵循任何特定目的 - 只是为了观察行为。
- 该代码使用 Oracle JDK 1.7.0 更新 60、64 位在 Dell Precision M4700 上运行的 Windows 7 Enterprise 上运行。
问题是是否有人可以解释这种行为 - 找不到任何类似的帖子或任何错误报告(我的问题是缺乏一致性)。
java - UseG1GC 选项在仅安装 JRE 的系统中是否有效?
我添加了-XX:+UseG1GC
选项 JAVA_OPTS 但它似乎不起作用。
我在这台服务器上只安装了 JRE 7,所以我只是想知道是否需要安装 JDK 7。
安装在服务器中的 JRE 如下。
java 版本“1.7.0_25”
Java(TM) SE 运行时环境(构建 1.7.0_25-b15)
Java HotSpot(TM) 64 位服务器 VM(构建 23.25-b01,混合模式)
我必须安装JDK吗?
java - 在 G1 收集器的并发标记步骤期间,无法解释的长时间停止世界暂停
在 G1 收集器的并发标记步骤中,我们遇到了无法解释/未知的长时间停顿(8 秒)。
从显示问题的 GC 日志中提取。
2014-08-07T13:42:30.555-0400: 92183.305
是并发标记开始时,大约在此步骤的 2 秒后,应用程序开始暂停,直到下一次 GC 暂停。
但是 GC 日志声称应用程序在此窗口期间未暂停。
感谢您在理解此问题的根本原因方面提供的任何帮助。
我们的目标 JVM:我们尝试过 Java7 和 Java8
我们的 JVM 选项:
garbage-collection - G1 垃圾收集器长时间停顿不知道
我正在尝试调整我的应用程序的响应能力,最大允许的 GC 暂停是 40 毫秒。无法理解为什么这个暂停需要大约 900 毫秒的时间。应用程序是低延迟应用程序,旨在提供高 QPS。
GC 参数:-Xmx5G -XX:+UseG1GC -XX:MaxGCPauseMillis=40
日志:
java -version:
java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)
请帮我理解是什么导致了这么长时间的停顿?以及如何预防?
java - Java - 哪些对象正在被垃圾收集?
我的应用程序有很多垃圾收集,我想分析一下。我想看看哪些对象正在被垃圾收集。我认为这会让我知道在哪里寻找优化(添加缓存或其他)。
是否有打印详细 GC 信息的选项,包括每个类中有多少对象被垃圾回收?
如果这很重要,我正在使用 G1GC。
谢谢!
java - 为什么我使用 G1GC 时 Scan RS 会花很长时间
我正在使用 java1.7.0_67 并使用以下命令运行我的应用程序:
以下是我的 gc 日志:
扫描 RS 花费的时间太长...
我该如何修改它?
java - Java中的零垃圾大字符串反序列化,Humongous对象问题
我正在寻找一种方法来反序列化Java 中String
的 abyte[]
并尽可能少地产生垃圾。因为我正在创建自己的序列化器和反序列化器,所以我可以完全自由地在服务器端(即序列化数据时)和客户端(即反序列化数据时)实现任何解决方案。
通过遍历字符(_ String
_ _ 这里有一个很好的辩论。另一种方法是使用反射直接访问底层,但这超出了问题的范围。String's
String.charAt(i)
char
String's
char[]
但是,我似乎不可能在byte[]
不创建char[]
两次的情况下反序列化,这似乎很奇怪。
步骤:
- 创造
char[]
- 遍历
byte[]
并填写char[]
String(char[])
使用构造函数创建字符串
由于 Java 的String
不变性规则,构造函数会复制 char[],从而产生 2 倍的 GC 开销。我总是可以使用机制来规避这一点(不安全String
的分配 + 反射来设置char[]
实例),但我只是想问一下,除了打破关于String's
不变性的所有约定之外,这是否有任何后果。
当然,对此最明智的回应是“来吧,停止这样做并信任 GC,原始char[]
将非常短暂,G1 将暂时摆脱它”,这实际上是有道理的,如果char[]
较小超过 G1 区域大小的 1/2。如果它更大,char[] 将被直接分配为一个巨大的对象(即自动传播到 G1 的区域之外)。在 G1 中,此类对象极难有效地进行垃圾回收。这就是为什么每个分配都很重要。
关于如何解决这个问题的任何想法?
非常感谢。
java - G1 垃圾收集器是否对每个区域使用相同的区域大小?
Oracle 的G1 垃圾收集器入门教程对 G1 垃圾收集器的区域大小进行了如下说明:
堆是一个内存区域,分为许多固定大小的区域。
[...]
区域大小由 JVM 在启动时选择。JVM 通常针对大约 2000 个区域,大小从 1 到 32Mb 不等。
不清楚 JVM 中是否所有区域都具有相同的大小,或者可能存在不同大小的区域(例如,1500 个区域的大小为 1MB,500 个区域的大小为 2MB)。
java - 如何从 G1 gc 日志中提取密钥信息
我发现 G1 GC 日志有点神秘,我想问一下日志文件本身是否可以用于了解用于 GC 的特定时间窗口的总“停止世界”时间?
另外,如何为 G1 收集器指定完整的 gc 循环?我看到很多 GC 暂停(年轻),但没有与完整 GC 相当的东西。当然这可能是因为还没有发生,但我不能肯定地说。
任何反馈将不胜感激。
问候,鲍勃
java - 几天后 GC 暂停变得非常长
我正在运行一个构建系统。我们曾经使用 CMS 收集器,但我们开始遭受非常长的完整 GC 周期,吞吐量(不执行 GC 的时间)约为 90%。所以我现在决定切换到 G1,假设即使我有更长的整体 GC 时间,暂停也会更短,从而确保更高的可用性。所以这个想法似乎比我预期的更有效,我几乎 3 天没有看到完整的 GC,吞吐量为 97%,整体 GC 性能要好得多。(所有截图和数据来自GCViewer)
直到现在(第 6 天)。今天,系统简直发疯了。使用的旧空间仅略低于 100%。我看到 Full GC 几乎每 2-3 分钟触发一次:
旧空间利用:
堆大小为 20G(总共 128G RAM)。我目前使用的标志是:
加上日志标志。我似乎缺少的是-XX:+ParallelGCThreads=20
(我有 32 个处理器),默认应该是 8。我还从 oracle 中读到建议使用-XX:+G1NewSizePercent=4
20G 堆,默认应该是 5。
我正在使用 Java HotSpot(TM) 64-Bit Server VM 1.7.0_76,Oracle Corporation
你有什么建议?我有明显的错误吗?要改变什么?我只给 Java 20G 是不是很贪心?这里的假设是,给它太多堆意味着更长的 GC,因为要清理的只是更多(农民逻辑)。
PS:申请不是我的。对我来说,它是一个盒子产品。