草庐IT

java - 为什么 WeakHashMap 在 GC 后对值有强引用?

WeakHashMap中的关键对象变得弱可达。并且map应该在GC之后删除条目。但是对值对象的强引用仍然存在。为什么?使用Guava弱键映射观察到相同的行为。预期输出:...refKey.get=nullrefValue.get=null但是我得到了输出:map.keys=[]map.values=[]map.size=0refKey.get=nullrefValue.get=(123)代码:importjava.lang.ref.WeakReference;importjava.util.Map;importjava.util.WeakHashMap;importcom.google

java - 为 Java 音频应用程序调优 GC

我注意到在java中播放音频时,gc中的MarkSweepCompact阶段太长并导致短暂的静音,这是NotAcceptable。所以我需要使用低暂停gc。我尝试过Parallel和CMS,它们似乎工作得更好,因为我认为暂停时间更短,而且它们不像默认的那样频繁地进行完整收集。到目前为止,我已经使用以下ParallelGC选项测试了我的程序:-XX:+UseParallelGC-XX:MaxGCPauseMillis=70对于ConcurrentMarkSweep:-XX:+UseConcMarkSweepGC-XX:+CMSIncrementalMode-XX:+CMSIncremen

java - 有没有办法告诉 JVM 当前正在使用哪种 GC 算法

我正在使用Java5,我们的自定义服务器应用程序需要GC调整,因为有时我们会在高峰时段遇到15-20秒的暂停。我们在服务器类机器上运行Java5,其JVM参数如-server-d64有没有办法知道JVM当前使用的是哪种GC算法?http://docs.oracle.com/javase/1.5.0/docs/guide/vm/gc-ergonomics.html在运行服务器VM的服务器级机器上,垃圾收集器(GC)已从以前的串行收集器(-XX:+UseSerialGC)更改为并行收集器(-XX:+UseParallelGC).您可以通过对java命令使用-XX:+UseSerialGC命

java - G1 垃圾收集器日志分析器

我正在为垃圾优先收集器寻找GC日志分析器。很多人都提到过“IBM模式建模和分析工具,用于Java垃圾收集器(PMAT)”,但它似乎与OracleJDK7的G1不兼容。任何人都可以分享您使用哪些工具以图形方式分析gc日志。 最佳答案 尝试GCViewer.GitHub上的分支包括对更新的垃圾收集器(包括G1)的支持。 关于java-G1垃圾收集器日志分析器,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com

Java CMS GC 行为

我有一个导致产生大量垃圾的应用程序。第一个(也是几乎一个)标准是低GC暂停时间。我使用visualgc工具(和gc日志)尝试不同的GC参数。最佳参数如下。-XX:+UseConcMarkSweepGC-Xmx1172M-Xms600M-XX:+UseParNewGC-XX:NewSize=150M我的应用程序在Java1.6.0_21的SunOS10上运行。硬件是2xCPU四核(uname-X结果是numCPU=8)。问题是观察GC行为,在伊甸园空间创建新对象,直到伊甸园已满。当edenspacefullGC运行时,清除垃圾,如果对象不是死副本到Old-gen(我丢弃'from'&'t

java - 关于垃圾回收。为什么我们需要调用 System.gc();?

当引用的对象不再可用于任何变量时,将自动调用垃圾收集。但我想知道为什么我们在自动调用垃圾收集时使用System.gc()显式调用。我们什么时候调用System.gc(); 最佳答案 你不知道。正如您所说,垃圾收集是自动的。System.gc()甚至不强制垃圾回收;这只是对JVM的一个提示,“现在可能是清理一下的好时机”一般来说,试图用System.gc()强制垃圾收集器做你想做的事情是一种被自认为比实际更了解的人应用的hack,或者作为(尝试的)损坏代码的解决方法。多年来我一直在编写Java,但我还没有看到调用System.gc确实

Java HotSpot(TM) 64 位服务器 VM 警告无法打开文件 logs/gc.log,因为没有这样的文件或目录

当我尝试运行时出现此错误RACK_ENV=testberailstesttest/system/service_provider_map_test.rb—seed48088JavaHotSpot(TM)64-BitServerVMwarning:Cannotopenfilelogs/gc.logduetoNosuchfileordirectory然后测试因这个错误而超时Timeoutwhilewaitingforclusterstatus[green]and[1]nodes/Users/patrickward/.rbenv/versions/2.4.1/lib/ruby/gems/2.

java - 非常慢的 Java full GC 挂钟

有时,在测试机器(Windows)上,Java完整GC需要超过20秒。GC日志显示real时间非常高,user也很高,但没有那么高(大约3秒)。在一种情况下,它是:21.2209796secs[Times:user=3.76sys=0.45,real=21.22secs]可能是什么原因?我有一个怀疑,但现在不想说。找出根本原因的最简单方法是什么?如果您不了解Windows但了解Linux,那也是一种选择:可以在Linux上重新运行测试。流程是这样开始的:"%JAVA_HOME%\bin\java.exe"-verbose:gc-XX:+PrintGCDetails-XX:+PrintG

java - 使用 G1 时,大量 Activity 实例的分配性能会降低吗?

在将我们的一些应用程序从CMS迁移到G1时,我注意到其中一个应用程序的启动时间延长了4倍。由于GC循环导致的应用程序停止时间不是原因。在比较应用程序行为时,我发现这个应用程序在启动后携带了高达2.5亿个Activity对象(在12G的堆中)。进一步调查表明,应用程序在前500万次分配中速度正常,但随着Activity对象池的增大,性能越来越下降。进一步的实验表明,一旦达到一定的Activity对象阈值,使用G1时新对象的分配确实会变慢。我发现将Activity对象的数量加倍似乎会使该分配所需的时间增加2.5倍左右。对于其他GC引擎,该系数仅为2。这确实可以解释减速。不过,有两个问题让我

java - 如何解释导致 OutOfMemoryError 的 G1 GC 日志?

我想知道是否有人能够向我解释如何解释导致OutOfMemoryError的一些G1GC日志?我知道堆转储是找出实际使用堆的最佳选择,但我无法获取它,因为它包含无法离开客户端站点的protected信息。我只有应用程序日志(包括来自OOME的堆栈)和G1GC日志。完整的G1GC日志包含很多细节,因此除非有人特别需要查看它们,否则我不会将它们放在这里。这些来自的特定Java版本是:>java-versionjavaversion"1.7.0_21"Java(TM)SERuntimeEnvironment(build1.7.0_21-b11)JavaHotSpot(TM)64-BitServ