Tag: garbage collection

UseConcMarkSweepGC vs UseParallelGC

我目前遇到很长时间的垃圾收集问题。 请参阅以下内容。 我目前的设置是我使用-Xms1g和-Xmx3g。 我的应用程序使用的是java 1.4.2。 我没有设置任何垃圾收集标志。 从它的外观来看,3gb是不够的,我真的有很多垃圾收集的对象。 题: 我应该改变我的垃圾收集算法吗? 我该怎么用? 是否更好地使用-XX:+UseParallelGC or -XX:+UseConcMarkSweepGC 或者我应该使用这种组合 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC 占用内存的主要是报告数据而不是缓存数据。 此外,该机器有16GB的内存,我打算将堆增加到8GB。 这两个选项之间有什么区别,因为我仍然觉得很难理解。 该机器有多个处理器。 我可以拍摄最多5秒,但30至70秒真的很难。 谢谢您的帮助。 Line 151493: [14/Jan/2012:11:47:48] WARNING ( 8710): CORE3283: stderr: [GC 1632936K->1020739K(2050552K), 1.2462436 secs] Line 157710: [14/Jan/2012:11:53:38] WARNING ( 8710): CORE3283: stderr: [GC 1670531K->1058755K(2050552K), 1.1555375 secs] Line 163840: [14/Jan/2012:12:00:42] WARNING ( 8710): CORE3283: stderr: [GC […]

GC调整 – 阻止完整GC

我正在尝试避免在生产中运行Tomcat中的Grails应用程序的Full GC(来自下面的gc.log示例)。 有关如何更好地配置GC的任何建议? 14359.317:[Full GC 14359.317:[CMS:3453285K-> 3099828K(4194304K),13.1778420 secs] 4506618K-> 3099828K(6081792K),[CMS Perm:261951K-> 181304K(264372K)] icms_dc = 0,13.1786310 secs] [次:user = 13.15 sys = 0.04,real = 13.18 secs] 我的VM参数如下: -Xms = 6G -Xmx = 6G -XX:MaxPermSize参数= 1G -XX:新尺寸= 2G -XX:MaxTenuringThreshold = 8 -XX:SurvivorRatio = 7 -XX:+ UseConcMarkSweepGC -XX:+ CMSClassUnloadingEnabled -XX:+ CMSPermGenSweepingEnabled -XX:+ CMSIncrementalMode -XX:CMSInitiatingOccupancyFraction = 60 -XX:+ UseCMSInitiatingOccupancyOnly […]

什么触发了Java垃圾收集器

我对Java中的垃圾收集工作方式有点困惑。 当没有更多的实时引用时,我得到一个对象有资格进行垃圾收集,但是如果它引用了活动对象呢? 假设我有一组节点再次引用更多节点 List 1 -> Node a -> Node b 2 -> Node c -> Node d 3 -> Node d -> Node c 4 -> Node e 5 现在,如果我删除列表,节点cd和e应该是垃圾收集。 节点e没有更多的引用,节点c和d具有循环引用。 但是Node a怎么样? 它会被垃圾收集吗? 无论节点b是否有外部实时引用,它会有所不同吗? 假设节点b是否有来自不同位置的引用,是否会使节点停留在内存中?

当JVM在GC中花费时间时,线程转储是什么样的

在分析Java应用程序时,我注意到有趣的事实。 当JVM处于死亡线程转储的GC螺旋时,它看起来像: “1304802943@qtp-393978767-9985” prio=10 tid=0x00007f3ed02dd000 nid=0x74e7 in Object.wait() [0x000000004febb000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:626) – locked (a org.mortbay.thread.QueuedThreadPool$PoolThread) “26774405@qtp-393978767-9984” prio=10 tid=0x00007f3ee4b37000 nid=0x74e6 in Object.wait() [0x0000000045d1a000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:626) – locked (a org.mortbay.thread.QueuedThreadPool$PoolThread) “764808089@qtp-393978767-9983” prio=10 tid=0x00007f3ee4c50000 nid=0x74e5 in Object.wait() [0x000000004ad6a000] java.lang.Thread.State: TIMED_WAITING (on object […]

G1GC评论阶段耗时太长

我的服务器应用程序负载有时没有响应,我发现该问题与很长的“GC备注”有关。 没有实现垃圾收集调整。 我的测试服务器是4核/ 8 GB / 8 GB交换。 这是gc logs的日志输出。 2014-04-06T04:39:58.426+0530: 67263.405: [GC remark, 46.7308340 secs] 2014-04-06T04:40:45.167+0530: 67310.146: [GC cleanup 1951M->1750M(2954M), 0.0037930 secs] 2014-04-06T04:40:45.174+0530: 67310.153: [GC concurrent-cleanup-start] 2014-04-06T04:40:45.175+0530: 67310.154: [GC concurrent-cleanup-end, 0.0002800 secs] 2014-04-06T04:40:45.633+0530: 67310.612: [GC pause (young) 2451M->1546M(2954M), 0.0764360 secs] 2014-04-06T04:40:45.815+0530: 67310.794: [GC pause (young) (initial-mark) 1672M->1554M(2954M), 0.0687640 secs] 2014-04-06T04:40:45.884+0530: 67310.863: [GC concurrent-root-region-scan-start] 2014-04-06T04:40:45.912+0530: […]

垃圾收集前是否清除了内存?

与同事进行了这次讨论。 当c#或java垃圾等语言收集诸如字符串之类的对象,将它们返回堆中时,它们是否也清除了这个内存块,例如用0或1覆盖? 我的假设是块按原样返回,除非使用诸如securestring和finalize重载之类的类来阻止块。

什么是JVM GC的大对象

Charlie Hunt说,大型对象在他的演示中对JVM GC不利。 因为: 分配和初始化大对象的成本很高。 不同大小的大对象可能导致Java堆fregmentation。 如何定义大对象? 如何知道对象是否是大对象? 谢谢

Java垃圾收集器是否会回收包含对其他对象的引用的非引用对象

当我学习LinkedList数据结构时,会出现这个问题。 假设每个链接 (或节点)由一个对象表示,该对象包含两个字段, 数据和下一个链接的下一个点。 如果我想删除一个特定的节点,显然我将更新前一个Link的下一个字段。 但是我应该将删除的链接的下一个字段设置为null,以确保它将被垃圾收集器回收吗? 如果我的描述不清楚,我会尝试概括(或简化)我的问题。 假设类A的对象a1具有一个字段,该字段引用同一类的另一个对象a2 。 如果没有对象a1的引用,它是否有资格获得垃圾收集器? 或者我们必须将a1中的引用字段显式设置为null ? (不关心对象a2 ,除了a1中的引用字段之外还有其他引用)。

年轻一代的垃圾收集问题

当伊甸园空间年轻一代充满时,将触发次要GC。 在次要GC过程中,Eden中的非自由对象和一个源Survivor空间将被复制到另一个目标Survivor空间。 我的问题是,如果目的地幸存者空间已满,那么小型GC怎么处理?

Java:PhantomReference,ReferenceQueue和finalize

我有PR,PR指向的对象O,以及为PR设置的RQ。 我有一个线程继续轮询RQ,并在它在RQ中找到的第一个引用,线程打印它找到它的时间,并退出。 事情很好,但是当O有一个finalize(无论多么微不足道)的时候,线程不再在RQ中找到引用并且无限期地继续运行。 问题:为什么会这样? 我正在使用Sun JDK 1.6。 这是代码: good case public class MyGCPhantom { public static void main(String[] args) throws InterruptedException { GCPhantomObject p = new GCPhantomObject(); ReferenceQueue phantomQueue = new ReferenceQueue(); PhantomReference pr = new PhantomReference(p, phantomQueue); new GCPhantomThread(phantomQueue, “Phantom”).start(); p = null; System.gc(); } } class GCPhantomObject { @Override protected void finalize() { […]