草庐IT

收集箱

全部标签

java - 具有独立循环引用的垃圾收集行为?

如果我在堆上有两个相互引用的对象,但它们没有链接到任何引用变量,那么这些对象是否符合垃圾回收条件? 最佳答案 是的,他们是。基本上,GC从“已知根”(静态变量,所有线程中所有堆栈帧中的局部变量)开始寻找不能被垃圾收集的对象。如果无法从根获取对象,则它符合收集条件。编辑:汤姆指出了这一点,我认为值得将其纳入答案本身:Technically,staticvariablesarenotroots-theyarereferencedbyclasseswhicharereferencedbyclassloaderswhicharerefere

java - 垃圾收集器是否处理 java 中的静态变量或方法?

我正在创建一个示例演示程序,让我了解如何使用垃圾收集器在Java中释放静态变量和方法的引用?我使用弱引用是为了不阻止垃圾收集器。类样本publicclassSample{privatestaticStringuserName;privatestaticStringpassword;static{userName="GAURAV";password="password";}publicstaticStringgetUserName(){returnuserName;}publicstaticStringgetPassword(){returnpassword;}}类用户importjav

java - 如何使用 Java Stream API(groupingBy 收集器)对列表中的值进行分组?

我有Entry的列表对象。Entry是一个:classEntry{privatefinalDatedate;privatefinalStringvalue;//constructor//getters}我需要按天对这些条目进行分组。例如,2011-03-2109:00VALUE12011-03-2109:00VALUE22011-03-2214:00VALUE32011-03-2216:00VALUE42011-03-2116:00VALUE5应该分组:2011-03-21VALUE1VALUE2VALUE52011-03-22VALUE3VALUE4我想要一个Map>.如何使用Str

java - 与垃圾收集语言一起使用时,哪种代码的 CPU/内存效率更高?

我有这两段虚拟代码(假设它们是用Java或C#编写的,所有变量都是本地的):代码1:inta;intb=0;for(inti=1;i代码2:intb=0;for(inti=1;i乍一看,我会说这两个代码消耗相同数量的内存,但代码1的CPU效率更高,因为它只创建和分配变量a一次。然后我读到垃圾收集器非常高效,以至于代码2的内存(和CPU?)效率更高:将变量a保留在循环中使其属于Gen0,所以它会是在变量b之前收集的垃圾。因此,当与垃圾收集语言一起使用时,代码2的效率更高。我说得对吗? 最佳答案 几点:int(和其他原语)从不在堆上分配

java - Hibernate - 处理收集后加载

我们正在尝试根据它包含的对象来过滤\操作持久性集合(过滤掉特定的条目)。由于此操作将对包含不同集合的大量不同对象执行,因此它必须尽可能通用。在HQL\SQL级别上过滤不是一种选择,因为它无法维护。这意味着它必须在集合加载和初始化之后执行。我们目前正在使用许多Hibernate事件来处理单个对象,所以我们尝试监听InitializeCollectionEvent。但事实证明,我们的大部分集合都是使用HQLFetch初始化的,因此不会为它们引发此事件。还有其他我们可以使用的HibernateEvent吗?Collections在加载后进行处理的任何其他地方?我们正在使用Hibernate4

java - 为什么 Java 垃圾收集器似乎在执行较不积极的运行后不久就进行了积极的运行?

在使用VisualVM监视Java程序时,我注意到垃圾收集器行为中的一个有趣模式。似乎很多时候,在执行“正常”垃圾收集运行之后,GC会执行第二次更密集的cpu运行,这似乎没有额外的效果(更积极的运行后使用的堆与它是在打火机运行之后)。我已经在VisualVM的输出中指出,您可以在其中看到垃圾收集器的运行和相应的堆使用变化。我的问题基本上是垃圾收集器在这里做什么以及为什么?是什么导致它在有大量可用内存时尝试这些真正的cpu密集型运行,并且与较轻的运行相比没有明显的好处?还是我误解了图表?程序的性能并没有真正受到影响,我只是好奇。 最佳答案

java - 识别未被垃圾收集的对象的更好方法?

一言以蔽之我有一个程序随着时间的推移逐渐使用越来越多的内存。我正在使用jmap和jhat来尝试诊断它,但还不够准确。背景该程序是一个长期运行的服务器,由hbase数据存储支持,为其他一些东西提供节俭服务。然而,在运行几天后,它最终会达到分配的堆限制,并且几乎所有时间都花在垃圾收集上来回Swing。似乎在某处保存了大量数据的引用到目前为止我做了什么在摆弄jstat和jconsole之后,我最终使用运行进程的jmap进行堆转储,并通过jhat运行它,简单的数字加起来没有接近内存利用率jmap-F-dump:live,format=b,file=heap.dump12765jmap-F-du

java - Java groupingBy 收集器是否保留列表顺序?

考虑一个列表List其中元素按People.getAge()的升序排序.如果我们使用Collectors.groupingBy(People::getCity)对这个列表进行分组,每个组/城市的结果列表是否仍按年龄排序?实际上,它似乎确实保留了顺序。我正在寻找保证。该方法的Javadoc说:IfpreservationoftheorderinwhichelementsappearintheresultingMapcollectorisnotrequired,usinggroupingByConcurrent(Function)mayofferbetterparallelperforma

Java 垃圾收集器 G1GC 花费很长时间等待 'Object Copy'(疏散暂停)

我不是Java新手,但我对垃圾回收知之甚少。现在我想通过一些实际经验来改变这种状况。我的目标是延迟时间低于0.3秒,或者在极端情况下0.5秒也可以。我有一个带有-Xmx50gb(-Xms50gb)的应用程序并设置了以下其他GC选项:-XX:+UseG1GC-Xloggc:somewhere.gc.log-XX:+PrintGCDateStamps但现在我偶尔会因为垃圾收集而暂停超过5秒,尽管似乎有足够的可用内存。我发现的一个原因:[GCpause(G1EvacuationPause)(young)42G->40G(48G),5.9409662secs]为什么GCG1还在为此做一个“停止

java - 自定义日志记录以在运行时收集消息

有没有办法在运行时创建一个log4j记录器,将日志消息收集到缓冲区中?我目前有一个记录大量事件的类。对于需要监视记录事件的远程应用程序,我只想交换记录到缓冲区的记录器,然后检索缓冲区,而不是重构类。例如。给出类似的东西:ClassFoo{Loggerlog=....;publicvoiddoSomething(){log.debug(.....actualcodelog.debug(...}}//我想从一些外部代码做什么:StringshowFooLog(){Foof=newFoo();f.log=newLogger(...f.doSomething();returnf.log.con