Tag: 垃圾收集

如何在循环中创建对象而不浪费内存?

我已经完成了一个测试Java程序,看看在循环中使用“new”时Java的行为如何,我的结果非常糟糕。 这是该计划: package test; public class Test { static int objectCount = 0; public static int getObjectCount() { return objectCount; } public Test() { objectCount++; } public void finalize() { objectCount–; } public static void main(String[] args) { int maxObjects = 0; long maxMemory = 0; long maxUsedMemory = 0; long maxFreeMemory = 0; long […]

Java垃圾收集器澄清

现在我正在读这篇关于Java垃圾收集的文章: http : //www.javaworld.com/javaworld/jw-08-1996/jw-08-gc.html ? 这是JMS客户端中的一个函数片段 public void foo(){ …//Create Connection factory, connection, and session, topic TopicSubscriber tp = session.createDurableSubcriber(topic,”001″); tp.setMessageListener(this) } 这个问题不是关于JMS,而是关于foo()函数调用结束后对象“tp”会发生什么。 函数结束后,再也无法引用tp了。 我假设在createDurableSubscriber()中它使用关键字“new”,这意味着该对象被放置在JVM堆上。 但是,由于tp不再被引用,它是否受JVM垃圾回收的影响?

了解如何使用TheUnsafe进行memcpy

我阅读了有关TheUnsafe的内容,但我感到困惑的是,与C / C ++不同,我们必须计算出东西的偏移量,还有32位VM与64位VM,它们可能有也可能没有不同的指针大小取决于在特定的VM设置打开或关闭(同样,我假设数据的所有偏移实际上基于指针算法,这将影响他们)。 不幸的是,似乎有关如何使用TheUnsafe的所有内容仅仅来自一篇文章(恰好是第一篇),而其他所有文章都是从某种程度上粘贴的。 其中不存在很多,有些不清楚,因为作者显然不会说英语。 我的问题是: 如何使用TheUnsafe找到字段的偏移量+指向拥有该字段(或字段的字段,字段,字段的字段,字段的字段…)的实例的指针的偏移量 如何使用它来执行memcpy到另一个指针+偏移内存地址 考虑到数据的大小可能有几GB,并且考虑到堆不提供对数据对齐的直接控制,并且它可能肯定是碎片化的,因为: 1)我认为没有什么能阻止VM在offset + 10处分配field1而在offset sizeof(field1)+ 32处分配field2,是吗? 2)我还假设GC会移动大块数据,导致1GB大小的字段有时会碎片化。 那么我所描述的memcpy操作是否可行? 如果数据由于GC而碎片化,那么堆当然有一个指向下一个数据块的位置的指针,但是使用上述简单的过程似乎并没有涵盖这一点。 所以数据必须在堆外(这可能)工作吗? 如果是这样,如何使用TheUnsafe分配堆外数据,使这些数据作为一个实例的字段工作,当然一旦完成就释放分配的内存? 我鼓励任何不太了解这个问题的人询问他们需要知道的具体细节。 我还敦促人们不要回答,如果他们的想法是“将你需要的所有对象复制到数组中并使用System.arraycopy 。我知道在这个精彩的论坛中通常的做法,而不是回答所提出的问题,提供一个完整的替代解决方案,原则上与原始问题无关,除了它完成相同的工作。 最好的祝福。

为什么小堆上的完整gc需要5秒?

我在3年前的Solaris系统上运行J2EE应用程序,使用的堆大约为300 MB。 从gc日志我看到,每天触发几次的完整gc大约需要5秒,每次恢复大约200 MB。 一个完整的gc在如此小的堆上花了这么长时间的原因是什么? 我运行java 1.6.0_37。

Java GCs开销:如果你有10mb或10g *引用的*对象,这有关系吗?

GC必须检查并找出可以收集的对象。 我的问题是,是否有太多要检查的对象会导致GC开销,或者某种程度上GC是否足够智能以避免必须遍历所有对象以找出哪个对象不再被引用?

Android应用程序永远下载Web内容为字符串(WaitForGcToComplete阻止xx.xxxms导致HeapTrim?)

我是Android开发的新手,我正在尝试创建一个应用程序,只需将给定网页的源代码作为字符串下载并将其显示在日志中。 我有它工作,对于google.com,它的工作相当快。 然而,对于我想要的网页,即使我的计算机的网络浏览器只需几秒钟就可以加载它,它需要十分钟。 在这八分钟内,日志中反复显示四条消息,其值不同。 他们是: W / art:暂停所有线程:x.xxxm I / art:后台stcky并发标记扫描GC释放xx(xxxxB)AllocSpace对象…… I / art:后台部分并发标记扫描GC释放xx(xxxxB)AllocSpace对象…… I / art:WaitForGcToComplete因xx.xxxms而被阻止,原因是HeapTrip 有人可以解释一下发生了什么,以及我如何能够更快地下载这些内容? 这是某种内存问题吗? 我需要使用某种类型的BufferedReader吗? 记录消息: 码:

分代垃圾收集如何运作?

Generational GC如何运作? 什么是Generational GC? 谢谢

如何轻松监控伊甸园和幸存者空间的使用情况

如何监控Eden和Survivor堆空间的使用情况的最佳方法是什么? 我有所有的GC日志选项 ,但我只能看到YoungGen的职业: -XX:+ PrintTenuringDistribution -XX:+ UnlockDiagnosticVMOptions -XX:+ LogVMOutput -XX:LogFile = jvm.log -server -XX:+ HeapDumpOnOutOfMemoryError -XX:+ DisableExplicitGC -Xloggc:gc.log -XX:+ PrintGCTimeStamps -XX:+ PrintGCDetails -showversion -XX:+ PrintClassHistogramBeforeFullGC -XX:+ PrintClassHistogramAfterFullGC -XX:+ UseParallelOldGC -XX:ParallelGCThreads = 4 -XX:MaxTenuringThreshold = 15 我会使用VisualGC但无法在任何地方找到它的发行版。 VisualKC没有附带JDK附带的VisualVM的默认分发版。 VisualGC插件的VisualGC插件链接已损坏。 更新: jstat是我正在寻找的,具体来说: jstat -gcutil -t

与Garbage Collector和finalize()方法相关的问题

我正在阅读关于Java的垃圾收集和finalize()方法,并且有一些疑点引起了我的注意。 对不起,如果你认为这些疑惑真的很傻。 我正在阅读文章http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html 。 在这里,第5点说: ‘在从内存中删除对象之前,垃圾收集线程调用该对象的finalize()方法,并提供执行任何所需清理的机会’。 那么这件事肯定会发生吗? 我的意思是在执行Garbage Collector方法之前总是会调用finalize()方法吗? 垃圾收集器如何知道它需要执行? 例如,我在服务器上部署了一个应用程序,那么GC什么时候执行? 它是周期性地执行,还是当收集了一些(比如说1MB)垃圾量并且执行了触发器或某些东西或者它只是随机的并且没有办法确定它何时执行? 由于垃圾收集没有发生,它如何降低我的应用程序的性能? 假设我的堆中有很多垃圾,但垃圾收集器没有被执行。 如果发生这种情况,那么这不是一个坏行为或JVM的缺陷吗? 我们可以说在C / C ++中手动完成的垃圾收集比在Java中更好地考虑到我们作为程序员足够聪明并且知道什么时候需要处理“不那么引用”的指针吗?

如何更改垃圾收集线程的优先级?

这个问题是重复的是否可以更改垃圾收集器线程的优先级? 这是一个古老的问题,从那以后事情可能会发生很大的变化。 它也没有澄清一切。 是否可以更改GC线程优先级? 我见过具有不同GC线程优先级的线程转储。 如果我们无法改变它,会发生什么? 此外,我知道高频交易平台希望保持GC线程优先级非常低,以便主线程在大多数时间运行,并且“停止世界”事件不会经常发生。