我有一个Java应用程序,它存在一些性能问题,有人建议我以verbose:gc模式运行它。这已经完成,但我不知道如何解释日志记录。是否可以向我解释这一切的含义或建议我如何提高绩效?可以在以下位置找到输出日志:http://pastebin.com/uDNPEGcd提前致谢,亲切的问候,马丁 最佳答案 verbose:gc在每次gc收集后立即打印并打印有关每一代内存详细信息的详细信息。这是关于如何阅读verbosegc的博客如果您正在尝试查找内存泄漏,verbose:gc可能还不够。使用一些可视化工具,如jhat(或)visualvm
我希望在应对大量正在进行的垃圾收集的同时,对某些东西的性能进行基准测试。我之前已经对它在稳定的单线程运行中的行为进行了基准测试,现在我想在压力更大的JVM中进行相同的测试;本质上,我想让后台线程以合理一致的速度创建和销毁对象。我正在寻找有关如何实现稳定但GC密集型操作的建议。它需要完成几个目标:在GC上花费相当多的时间(比如20-50%)随着时间的推移做大致一致的工作量,并为GC创建类似一致的工作量避免溢出堆并触发Java堆空间错误避免GC过载并触发GCoverheadlimitexceeded错误 最佳答案 我在可能导致垃圾收集量
我有一个MonoA。对象A包含两个列表。我想直接创建两个Flux。没有block()这可能吗?Monoa=...;Fluxa1=Flux.fromIterable(a.block().getList1()); 最佳答案 使用Mono.flatMapMany()方法:Fluxflux1=mono.map(A::getList1).flatMapMany(Flux::fromIterable);Fluxflux2=mono.map(A::getList2).flatMapMany(Flux::fromIterable);
我在Linux64位上运行一个应用服务器,它有8个核心CPU和6GB内存。服务器必须高度响应。经过一些检查,我发现服务器上运行的应用程序创建了相当大量的短生命对象,只有大约200~400MB的长生命对象(只要没有内存泄漏)看完http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html我使用这些JVM选项-server-Xms2g-Xmx2g-XX:MaxPermSize=256m-XX:NewRatio=1-XX:+UseConcMarkSweepGC结果:minorGC耗时0.01~0.02秒,majorGC
我是gc日志的新手。下面的gclog是什么意思。它是否暗示了一些有用的信息?16960.890:[GC[PSYoungGen:111960K->36400K(523584K)]845053K->770190K(1286720K),0.0270419secs][Times:user=0.13sys=0.00,real=0.03secs]16960.917:[FullGC(System)[PSYoungGen:36400K->0K(523584K)][PSOldGen:733789K->714479K(763136K)]770190K->714479K(1286720K)[PSPermGe
我正在升级生产硬件,我们发现与旧套件相比,新套件上的新生代GC数量要多得多。相同的程序(相同的二进制文件)在两台机器上运行。一个明显的区别(我希望这不会对JVM产生影响)是我们升级了RHEL5->RHEL6。我们的JVM(Java64位Hotspot1.6,两者上的java-version相同)使用相同的命令行GC选项运行:-XX:+PrintGC-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+UseParallelGC-XX:+UseCompressedOops还有:-Xmx1024M-Xms1024M-XX:NewSize=512M-XX
我从事性能关键的服务器端Java应用程序。系统启动后,我预计不会创建长生命周期对象-只有短生命周期对象(最多10秒)。因此,我想调整JVM,以便在系统启动后老年代保持不变。我想我已经成功了,但我不明白为什么(见下文)。这是我们的设置:-Xmx3000m-Xms3000m-详细:gc-XX:+PrintGCTimeStamps-XX:+PrintGCDetails-XX:+UseConcMarkSweepGC-XX:SurvivorRatio=5-XX:TargetSurvivorRatio=90-XX:MaxTenuringThreshold=31-XX:+PrintTenuringD
.NET有一个名为GC.KeepAlive(Object)的函数.它的唯一目的是确保引用对象的生命周期持续到代码流到达调用为止。这通常是不必要的,除非与native代码进行互操作。我有一个情况,我有一个通过JNI访问的C++对象图,其中某些根对象需要保持Activity状态以保持子对象Activity。根对象和子对象在JVM领域都有镜像。但是,如果在C++端收集并释放根对象(通过SWIG生成的终结器),则子对象将变得无效,因为它们的C++支持对象将被释放。这可以通过确保作为对象图根的局部变量的生命周期超过子对象的最后一次使用来解决。所以我需要一个不对对象做任何事情的惯用函数,但不会被优
我正在运行一个使用CMS作为终身收集器的Java服务器。在负载测试下运行,我大约每1秒看到一次年轻Collection,大约每5米看到一次永久(并发)。这很好。当我以大约1/2容量的实际流量运行时,我大约每4秒收集一次年轻集合,大约每7米收集一次终身收集(!并行,停止世界!)。为什么JVM决定进行完全停止世界收集而不是使用CMS收集器?从gc.log中,您可以看到“FullGC”正在运行,并且需要3秒才能完成。这里没有并发模式故障。没有明确请求集合。1350.596:[GC1350.596:[ParNewDesiredsurvivorsize119275520bytes,newthre
是否可以从gc角度将java对象标记为不可回收以节省gc-sweep时间?类似于http://wwwasd.web.cern.ch/wwwasd/lhc++/Objectivity/V5.2/Java/guide/jgdStorage.fm.html的内容特别是non-garbage-collectible容器那里(non-garbage-collectable?)。问题是我有很多普通的临时对象,但我有更大(几千兆)的对象存储用于缓存目的。JavaGC无缘无故应该遍历所有这些缓存千兆字节以试图找到任何要收集的东西,因为它们包含有自己的超时的缓存数据。这样我就可以以自定义方式将我的数据划