Tag: 垃圾收集

强制在Java中重新分配大型缓存对象

我使用大(数百万)条目hashmap来缓存算法所需的值,关键是两个对象的组合作为long。 由于它不断增长(因为地图中的键发生了变化,所以不再需要旧的),能够强行擦除其中包含的所有数据并在执行过程中重新开始会很好,有没有办法有效地执行在Java? 我的意思是释放相关的内存(大约1-1.5gb的hashmap)并从空的hashmap重新启动。

偶尔经历长时间的垃圾收集延迟,为什么?

我很难处理Java垃圾收集问题,并解释日志。 我的应用程序要求GC不需要超过2秒,理想情况下小于100毫秒。 根据以前的一些建议,我正在尝试以下命令行选项: java -XX:MaxGCPauseMillis=100 -XX:NewRatio=9 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -server -Xmx9g -Xms9g 该应用程序具有大量长期存储的对象,这些对象保存在ConcurrentLinkedHashMap中。 我偶尔会看到长时间停顿,最糟糕的情况是长达10秒(这是下面的GC日志中的第二个)! 以下是我得到的一些输出: 16938.968: [GC 16938.968: [ParNew: 153343K->17022K(153344K), 7.8608580 secs] 6184328K->6122510K(9420160K) icms_dc=7 , 7.8614100 secs] [Times: user=0.63 sys=0.01, real=7.86 secs] 16947.087: [GC 16947.087: [ParNew: 153342K->17022K(153344K), 7.2604030 secs] 6258830K->6198642K(9420160K) icms_dc=7 , 7.2609780 secs] [Times: user=0.44 sys=0.00, real=7.27 secs] 16954.614: [GC 16954.614: [ParNew: 153342K->17024K(153344K), […]

等待特定对象的垃圾收集

我只是在commons-io库中挖掘并发现了这个: 跟踪等待删除的文件,并在删除时将其删除 垃圾收集器回收关联的标记对象。 这可以在FileCleaningTracker对象的文档中找到。 现在我很好奇我怎么能自己做到这一点? 我的代码如何检测垃圾收集器何时回收对象?

在生产Java服务器中打开GC日志记录是否常见?

我在几个地方看到[1]人们开始生产服务器中的GC登录(关键任务),例如 java -server -Xms1024m -Xmx1024m -XX:NewSize=256m \ -XX:MaxNewSize=256m \ -XX:+UseConcMarkSweepGC \ -XX:CMSInitiatingOccupancyFraction=70 -XX:+PrintGCDetails \ -XX:+PrintGCDateStamps \ -XX:+PrintTenuringDistribution \ -Xloggc:logs/gc.log \ -Djava.awt.headless=true -Dcom.sun.management.jmxremote -classpath … 这些天是否建议在生产环境中实践? 更新 :我已经在Oracle中添加了一个链接[2],建议在生产服务器上监控GC。 资料来源: [1] https://serverfault.com/questions/121490/java-opts-xxprintgcdetails-affect-on-performance [2] http://docs.oracle.com/cd/E24290_01/coh.371/e22838/deploy_checklist.htm#CHHFADDF

在Java中突发内存使用

我试图在Java中处理正确的内存使用和垃圾收集。 无论如何我都不是新手程序员,但在我看来,一旦Java接触到某些内存,它就永远不会被其他应用程序使用。 在这种情况下,您必须确保峰值内存永远不会太高,或者您的应用程序将持续使用峰值内存使用量。 我写了一个小样本程序试图certificate这一点。 它基本上有4个按钮…… 填充类范围变量BigList = new ArrayList()包含大约25,000,000个长字符串项。 调用BigList.clear() 重新BigList = new ArrayList()列表 – BigList = new ArrayList()再次(缩小列表大小) 对System.gc()调用 – 是的,我知道这并不意味着GC会真正运行,但这就是我们所拥有的。 接下来,我在Windows,Linux和Mac OS上进行了一些测试,同时使用默认任务监视器来检查进程报告的内存使用情况。 这是我发现的…… Windows – 抽取列表,调用clear,然后多次调用GC不会减少内存使用量。 但是,使用new重新分配列表然后多次调用GC会将内存使用量减少回初始级别。 IMO,这是可以接受的。 Linux (我使用Mint 11发行版与Sun JVM) – 与Windows相同的结果。 Mac OS – 我遵循了与上面相同的步骤,但即使重新初始化列表调用GC似乎也没有效果。 该程序将使用数百MB的RAM,即使我没有内存。 任何人都可以向我解释这个吗? 有些人告诉我一些关于“堆”记忆的东西,但我仍然不完全理解它,我不确定它是否适用于此。 据我所知,我不应该看到我在Windows和Linux上的行为。 这只是Mac OS的活动监视器测量内存使用情况的方式还是有其他不同之处? 我宁愿没有我的程序闲置大量的RAM使用。 感谢您的见解。

ParNew gc会阻止世界吗?

我看到GC输出如下: 2010-12-10T16:00:44.942+0800: 1443.562: [GC 1443.562: [ParNew: 201856K->17318K(201856K), 0.0352970 secs] 2113334K->1949037K(4416748K) icms_dc=0 , 0.0354310 secs] [Times: user=0.12 sys=0.00, real=0.04 secs] 2010-12-10T16:00:46.207+0800: 1444.827: [GC 1444.827: [ParNew: 196774K->22400K(201856K), 0.0119290 secs] 2128493K->1954446K(4416748K) icms_dc=0 , 0.0120560 secs] [Times: user=0.13 sys=0.00, real=0.02 secs] 2010-12-10T16:00:47.562+0800: 1446.182: [GC 1446.182: [ParNew: 201856K->22400K(201856K), 0.0714350 secs] 2133902K->1982695K(4416748K) icms_dc=0 , 0.0715720 secs] [Times: user=0.23 sys=0.01, real=0.07 secs] […]

JVM垃圾收集和分页内存架构

在讨论java和/或垃圾收集的最近10年中,我无法防范的唯一性能损失是垃圾收集算法在分页内存架构中运行时或多或少会中断,并且堆的部分内容正在变得越来越多分页。 Unix系统(尤其是Linux)积极地分析了一段时间没有被触及的内存,虽然这对于你的普通泄漏应用程序来说是好的,但它会在内存紧张的情况下杀死javas性能。 我知道最好的做法是保持最大堆小于物理内存。 (或者你会看到你的应用程序交换死亡)但是这个想法 – 至少在unix世界中,是内存可以更好地用于文件系统缓存等。 我的问题是:是否有任何分页(识别)垃圾收集算法?

JVM内存管理和垃圾收集书?

任何人都可以建议一本书 (或任何其他来源),它将彻底揭示JVM内存管理和垃圾收集的内部结构 (优化,工作,循环引用,pecularities,讨论各种JVM impls ……)? [到目前为止我发现的是单独的文章,专门讨论各个方面,但没有重要的内容:)。 Hotspot实现的一些好材料就在这里 。 ] 非常感谢您给予的任何建议。

Java垃圾收集背后的理论和算法

我在很多地方看过,但找不到我能学到的地方: 什么是Java垃圾收集? 它是如何实现的? 何时以及如何调用? 下面是什么算法来回收内存? 总之一切都是关于:) 固定!!! 一篇非常好的文章: http : //www.artima.com/insidejvm/ed2/gcP.html

Java有自动垃圾收集吗?

它会自动发生吗? 怎么办呢?