我遇到这样的情况,我的Android应用程序无法及时执行软实时任务,因为调用了Garbage
Collector需要花费几毫秒的时间。分配给GC的时间只有几毫秒,不足以错过一些重要的期限,这些期限是从IO设备读取数据的小任务。
我当时正在考虑引入另一个线程,并赋予它轮询重要数据的任务。但是我不确定GC是否挂起所有线程还是仅挂起内存占用线程?
在Patrick
Dubroy撰写的
Android应用程序 的
内存管理中,
我发现了以下内容(幻灯片16,重点是我的):
姜饼前GC:
停止世界
全堆收集
暂停时间通常 > 100ms
姜饼及其他:
并发(大部分)
部分收藏
暂停时间通常 < 5ms
通常,垃圾收集必须停止整个VM,尽管如今这一次已大大减少了。但是,VM和Android平台整体上都不是实时操作系统,因此不要期望如此严格的保证。
为什么需要毫秒级精度?
问题内容: 该问题已发布在某个网站上。我在这里找不到正确的答案,因此我将其再次发布在这里。 我的查询与停止线程无关。让我改一下我的问题。A行(请参见上面的代码)启动一个新线程;和B行使线程引用为空。因此,JVM现在具有一个线程对象(处于运行状态),该对象不存在引用(如B行中的t = null)。所以我的问题是,为什么这个线程(在主线程中不再有引用)一直保持运行状态,直到主线程运行。根据我的理解,线
Java 15 使 ZGC、Z 垃圾收集器成为标准功能。它是 Java 15 之前的一个实验性功能。它是低延迟、高度可扩展的垃圾收集器。 ZGC 是在 Java 11 中作为一项实验性功能引入的,因为开发人员社区认为它太大而无法提前发布。 即使在机器学习应用程序等海量数据应用程序的情况下,ZGC 也具有高性能和高效工作。它确保在处理数据时不会因垃圾收集而长时间停顿。它支持 Linux、Window
Java 15 使 ZGC、Z 垃圾收集器成为标准功能。它是 Java 15 之前的一个实验性功能。它是低延迟、高度可扩展的垃圾收集器。 ZGC 是在 Java 11 中作为一项实验性功能引入的,因为开发人员社区认为它太大而无法提前发布。从那时起,对这个垃圾收集做了很多改进,例如 - 并发类卸载 取消提交未使用的内存 支持班级数据共享 NUMA 多线程堆Pre-touch 最大堆大小限制从 4 T
问题内容: 我问这个问题是因为我正在创建很多执行程序服务,尽管我可能已经在某个地方进行内存泄漏了,需要进行调查,但是我认为对以下代码的最近更改实际上使它更糟,因此,我尝试确认到底是怎么回事: 然后,这会在(通常)N = 2个线程的另一个线程池上被调用,我不确定这是否相关。 问题是:一旦完成,是否超出范围 并 获取垃圾? 问题答案: ExecutorService服务是否超出范围并在完成后获得垃圾回
问题内容: 我知道当分配DirectbyteBuffer时,它不受垃圾回收的限制,但是我想知道的是 包装 对象是否被垃圾回收了。 例如,如果我分配了一个新的DirectByteBuffer dbb,然后使用dbb.duplicate()将其复制(浅复制),则我将在同一块内存中使用两个包装器。 这些包装器是否要进行垃圾收集?如果我做了 我最终会自己OOM吗? 问题答案: 在Sun JDK中,由创建的
问题内容: 简短形式:CMS垃圾收集器似乎无法收集数量不断增加的垃圾;最终,我们的JVM填满,应用程序变得无响应。通过外部工具(JConsole或)强制GC 清理一次。 更新:该问题似乎与JConsole的JTop插件有关。如果我们不运行JConsole,或者在没有JTop插件的情况下运行它,则该行为消失。 (技术说明:我们正在Linux 2.6.9机器上运行32位Sun JDK 1.6.0_07