Tag: garbage collection

JVM垃圾收集

一般情况下(因为我知道有一个来自Oracle / sun和其他第三方的标准JVM实现以及MS),JVM是否只创建一个作为守护进程运行的垃圾收集线程来收集垃圾对象或者JVM是否产生了多个一个线程来完成垃圾收集?

为什么我的物体不会死?

我正在尝试实现一种机制,当持有它们的对象死亡时删除缓存文件,并决定使用PhantomReference来获取有关对象的垃圾收集的通知。 问题是我一直在体验ReferenceQueue怪异行为。 当我在代码中更改某些内容时,它突然不再获取对象。 所以我试着让这个例子进行测试,并遇到了同样的问题: public class DeathNotificationObject { private static ReferenceQueue refQueue = new ReferenceQueue(); static { Thread deathThread = new Thread(“Death notification”) { @Override public void run() { try { while (true) { refQueue.remove(); System.out.println(“I’m dying!”); } } catch (Throwable t) { t.printStackTrace(); } } }; deathThread.setDaemon(true); deathThread.start(); } public DeathNotificationObject() { System.out.println(“I’m born.”); […]

执行GC后,为什么分配的永久代的大小会增加?

以下是我从jvisualvm 执行GC后拍摄的快照。 和 第一张图片是Heap stats,第二张图片是perm gen stats。 我无法理解我何时使用 GC 使用堆大小减少(如预期的那样)但是永久代的分配大小增加(尽管使用的permgen大小保持不变)。 What could be the possible explanation of such behavior? 使用JVM参数 -Xbootclasspath/p:../xyz.jar -Xbootclasspath/a:../abc.jar -Djava.endorsed.dirs=../resolver -Djava.library.path=../framework -Djavax.management.builder.initial=JBeanServerBuilder -Djavax.net.ssl.trustStore=../certs -Dorg.mortbay.log.class=JettyLogger -Xms128m -Xmx256m -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=2000 注意:出于正当原因,我更改了名称(ex xyz.jar)。 JVm信息: JVM: Java HotSpot(TM) 64-Bit Server VM (23.6-b04, mixed mode) Java: version 1.7.0_11, vendor Oracle Corporation Java Home: /home/aniket/jdk1.7.0_11/jre JVM Flags:

强制显式删除Java对象

我正在研究处理大量非常密集流量的Java服务器。 服务器接受来自客户端的数据包(通常为几兆字节)并将其转发给其他客户端。 服务器从不显式存储任何传入/传出数据包。 然而,服务器不断遇到OutOfMemoryExceptionexception。 我将System.gc()添加到服务器的消息传递组件中,希望释放内存。 另外,我将JVM的堆大小设置为千兆字节。 我仍然得到了许多例外。 所以我的问题是:如何确保兆字节消息无限期排队(尽管不需要)? 有没有办法让我在这些对象上调用“delete”来保证它们不使用我的堆空间? try { while (true) { int r = generator.nextInt(100);//generate a random number between 0 and 100 Object o =readFromServer.readObject(); sum++; // if the random number is larger than the drop rate, send the object to client, else //it will be dropped if (r > dropRate) { […]

JVM锯齿空闲进程

我正在进行一项研究,调查一下JVM以及它的内存使用情况。 我不明白的是,JVM在空闲时填充它的内存是什么,只是在几乎达到堆时释放它? 为什么不只有一个扁平的旧内存? 顺便说一句,这个java应用程序托管在glassfish上,但是当我有一个简单的’hello world’swing应用程序时,我有相同的图表。 所以GlassFish不必对它做任何事情。 提前致谢!

JVM垃圾收集应用程序停止时间差异

我正在使用以下版本的java运行tomcat的大型实例: java版“1.6.0_20” OpenJDK运行时环境(IcedTea6 1.9.7)(6b20-1.9.7-0ubuntu1~10.04.1 OpenJDK 64位服务器VM(内置19.0-b09,混合模式) 并使用以下参数设置: -Xms13152m -Xmx13152m -Xmn768m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=60 -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 -XX:CMSIncrementalDutyCycle=10 -XX:+DisableExplicitGC 启用GC调试语句。 每隔几个小时我就会看到发生次要GC并且应用程序停止很长时间的行为,但GC本身似乎没有花费那么多时间: {Heap before GC invocations=392 (full 74): par new generation total 707840K, used 698252K [0x00000004bfa00000, 0x00000004efa00000, 0x00000004efa00000) eden space 629248K, 99% used [0x00000004bfa00000, 0x00000004e607de48, 0x00000004e6080000) from space 78592K, 87% used [0x00000004ead40000, 0x00000004ef0a5370, 0x00000004efa00000) to space 78592K, 0% […]

使用VM命令行在执行期间查找最大分配堆大小?

我想知道我是否可以使用VM命令行获取已allocated heap的最大大小。 从现在起我可以使用Netbeans Profiler获得它,但我更喜欢获得结果,而无需启动额外的应用程序。 我也在使用这种方法: public void printMemUsage(){ double currentMemory = ( (double)((double)(Runtime.getRuntime().totalMemory()/1024.0)))- ((double)((double)(Runtime.getRuntime().freeMemory()/1024.0))); System.out.println(“Current memory usage in kilobytes :”+currentMemory); } 我想我也可以使用它来获得最大堆大小,但我不确定它是否非常可靠。 我目前使用这些命令行: -verbose:gc -XX:+ PrintGCDetails -XX:+ PrintGCApplicationConcurrentTime -XX:+ PrintGCApplicationStoppedTime 为了获得有关gc活动,年轻一代,老年人和永久性人的良好信息。 但是我可以在收集发生时告诉当前的总堆空间。 那么有没有办法获得使用其他命令行分配的最大堆空间?

垃圾收集 – 为什么c3在此示例中不符合收集条件(SCJP 6)

摘自SCJP 6准备书 – 鉴于: class CardBoard { Short story = 200; CardBoard go(CardBoard cb) { cb = null; return cb; } public static void main(String[] args) { CardBoard c1 = new CardBoard(); CardBoard c2 = new CardBoard(); CardBoard c3 = c1.go(c2); c1 = null; // do Stuff } } 当达到// doStuff时,有多少对象符合GC条件? A. 0 B. 1 […]

Java 8元空间垃圾收集

我正在运行的java进程在运行的第一个小时左右执行得很好。 但是,性能会迅速降低。 在进行性能分析时,我发现元空间垃圾收集经常发生,直到小时标记然后失控: 我很确定我能够使用-XX:MaxMetaspaceSize选项来解决这个问题。 但是,我想更多地了解为什么会出现这种情况。 我无法想象为什么垃圾收集算法的行为会像这样。 有没有人对更好的解决方案有解释或建议? 谢谢

是否可以创建堆转储以分析内存泄漏而无需垃圾回收?

我们在生产中运行Java应用程序的虚拟机上存在一些内存泄漏问题,旧的Gen堆使用量每天都在快速增长,所以我想创建堆转储来分析它。 但是,我注意到VisualVM将在堆转储之前执行完整的GC,这将清除旧的Gen,在这种情况下,堆转储将是无用的。 我还尝试使用以下命令: jmap -dump:live,format = b,file = heap.bin 它还将触发完整的GC。 请问是否有一种方法可以在没有完整GC(或没有GC)的情况下创建堆转储? 或者有没有更好的方法来分析内存泄漏? JDK版本:1.7.0_45 谢谢。