Tag: 垃圾收集

年轻的GC导致Metaspace增加,而不是Old Gen

从JDK7迁移到JDK 8时,我开始看到频繁的Full GC(具有更高的GC延迟)。 在分析了gc之后,发现在年轻的GC之后,元空间的使用增加了,而旧的使用率仍然相同。 我已将最大元空间大小(等于JDK7中的Perm Gen)设置为256MB。 当使用率达到210 MB左右时,将触发完整的GC。 我已经尝试将元空间最大大小设置为512MB,然后我也看到Metaspace Threshold导致Full GC。 为什么Young GC会导致元空间大小增长? JDK8引发了GC延迟。 使用JDK7,GC延迟通常低于100毫秒,而使用JDK8的全GC启动时间为800-1000毫秒。 这会影响我的应用程序性能。 我正在使用并行GC算法。 我怀疑在metaspace上的GC比Old gen GC要耗费更多时间。 有关为JDK8调优JVM的任何建议都将非常有用。 年轻的GC: S0 S1 EOM CCS YGC GCT FGC FGCT GCT LGCC GCC 0.00 40.28 99.78 21.95 56.28 – 149 6.647 2 3.276 9.924 Allocation Failure No GC 54.17 0.00 0.66 21.95 57.63 – 150 […]

为什么强制垃圾收集会增加分配给java进程的内存?

所以我有这个代码: public static void main(String[] args) throws Exception { Thread.sleep(5000); System.out.println(“Creating array…”); Integer[] integers = new Integer[Integer.MAX_VALUE/32]; Thread.sleep(5000); System.out.println(“Destroying array”); integers = null; //System.gc (); //System.runFinalization (); Thread.sleep(60000); } 当我运行这段代码后,我会在大约5秒钟后看到268 MB的ram被分配给Activity Monitor中的java进程。 当我在控制台中看到“销毁arrays”后取消注释注释行(System.gc和以下行)时,分配的内存增加到278 MB。 我可以理解内存没有被释放,因为System.gc()只是对JVM的一个暗示,但为什么10MB会增加呢? 此时加载到内存中的是什么?

静态变量引用的对象的垃圾收集

class StaticTest{ public static SomeClass statVar = new SomeClass(); } 在此之后,如果我们访问StaticTest.statVar并随机分配一些新对象,那么当所有这些对象都将被垃圾收集? 答:在正常的垃圾收集时间。 但是如果这个statVar引用了一些实例变量(对象)呢? 不清楚? 好的,静态变量的生命周期是在类卸载之前。 在Web应用程序中,我们在静态上下文中初始化很多东西。 如果我们提供对这个静态上下文的一些对象引用但是我们不发布它们,那么它是如何被垃圾收集的呢? 我很乐意就此进行讨论。

使用ConcMarkSweepGC的连续CMS集合

在Linux上使用以下JVM选项启动Tomcat(2cpu,4g RAM,800M ehcache元素): -Xmn512m -Xmx2g -Xms2g -XX:+UseConcMarkSweepGC -Xss128k -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+DisableExplicitGC -XX:+PrintGCTimeStamps -XX:+PrintGCDetails 运行流量低,没有数据库问题,没有批处理过程在凌晨(06:00)20分钟之前, 堆内存达到-Xmx值并且CMS反复运行 ,最终返回到正常的GC行为,此时消息Unloading class sun.reflect.GeneratedMethodAccessorXXXXX已打印到日志中。 请你能: 建议一些GC调整点? 要么 建议可能的原因? GC日志: 2011-06-30T06:15:03.494+0900: 145634.229: [GC 145634.230: [ParNew: 463698K->37791K(471872K), 0.0342030 secs] 1848117K->1434326K(2044736K), 0.0343190 secs] [Times: user=0.13 sys=0.01, real=0.03 secs] 2011-06-30T06:15:12.423+0900: 145643.159: [GC 145643.159: [ParNew: 457247K->36210K(471872K), 0.0302130 secs] 1853782K->1443540K(2044736K), 0.0303470 secs] [Times: user=0.12 sys=0.00, real=0.03 secs] […]

java字符串文字可以被垃圾收集吗? 如果是,如何certificate?

像”abc”这样的java 字符串文字可以被垃圾收集吗? 如果是,我们如何以编程方式certificate他们是GCed?

垃圾收集器与集合

我已经阅读了几篇关于Java中垃圾收集的post,但我还是无法决定是否明确地清除一个集合被认为是一种好的做法……而且由于我找不到明确的答案,我决定在这里问一下。 考虑这个例子: List list = new LinkedList(); // here we use the list, perhaps adding hundreds of items in it… // …and now the work is done, the list is not needed anymore list.clear(); list = null; 从我在例如LinkedList或HashSet实现中看到的, clear()方法基本上只循环给定集合中的所有项,将其所有元素(在LinkedList情况下也引用next和previous元素)设置为null 如果我做对了,将list设置为null只是从list删除一个引用 – 考虑到它是唯一的引用,垃圾收集器最终会处理它。 我只是不知道在这种情况下,在垃圾收集器处理列表的元素之前还需要多长时间。 所以我的问题是 – 上面列出的示例代码的最后两行实际上是否有助于垃圾收集器更有效地工作(即更早地收集列表的元素)或者我只是让我的应用程序忙于“无关的任务”?

Java堆的标准分配比率

我试图寻找这个问题的答案,但从来没有找到任何答案。 在定义最大堆大小时,为Java GC空间分配大小的标准比率是多少? 那就是:如果我用堆栈的4Gb启动我的JVM,那么分配给Eden的数量是多少? 幸存者多少钱? 天赋多少钱? 此外,不同VM供应商的比率是否会发生变化? 提前致谢

java垃圾收集安全地擦除垃圾数据?

这是一个内存数据安全问题。 java垃圾收集是否安全地清除了垃圾数据? 显然在一大块数据被垃圾收集后,我再也无法检索它了,但是黑客还可以通过内存转储来检索数据吗?

调整java类以获得CPU缓存友好性

在设计java类时,有哪些建议可以实现CPU缓存友好性? 到目前为止我学到的是应该尽可能多地使用POD(即int而不是整数)。 因此,在分配包含对象时将连续分配数据。 例如 class Local { private int data0; private int data1; // … }; 比缓存更友好 class NoSoLocal { private Integer data0; private Integer data1; //… }; 后者将需要对Integer对象进行两次单独的分配,这些对象可以位于内存中的任意位置,尤其是。 GC运行后。 OTOH第一种方法可能会导致数据重复,以防数据可以重复使用。 有没有办法让它们在内存中彼此靠近,以便父对象及其’包含元素一次在CPU缓存中,而不是在整个内存中任意分布加GC将它们保持在一起?

是否可以让GC管理本机对象的生命周期?

凭借C ++和C#经验以及一些小知识,我现在正在开始一个Java + JNI(C ++)项目(Android,如果这很重要)。 我有一个本机方法,它创建一些C ++类并返回一个指向它的指针作为Java long值(比如句柄)。 然后使用Java代码调用其他本机方法,使用句柄作为参数在此类上执行一些本机操作。 C ++方面不拥有该对象,它是Java方面的人。 但是在当前的架构设计中,很难定义谁拥有对象以及何时删除它。 因此,使Java VM垃圾收集器以某种方式管理对象的生命周期可能会很好。 C ++类不消耗任何资源,除了一些内存,不是很大。 所以没关系,如果几个这样的对象不会被破坏。 在C#中,我可能会在一些托管包装类中包装本机IntPtr句柄。 并且当托管包装器被垃圾收集时,覆盖它的终结器来调用本机对象的析构函数。 SafeHandle,AddMemoryPressure等也可能对此有所帮助。 这是与Java最终确定的不同的故事。 你在Java中的’Hello world’之后知道的第二件事是使用finalize是不好的。 有没有其他方法可以在Java中实现这一目标? 也许使用PhantomReference?