我正在寻找有关如何在低延迟至关重要的环境中最大程度地调整年轻一代(相对于老一代)的争论。
我自己的测试倾向于表明,当年轻一代相当大时(例如-XX:NewRatio
<3),延迟是最低的,但是我不能直觉地认为年轻一代越大,进行垃圾处理的时间就越多收集。
该应用程序在Linux 64位jdk 6上运行。
内存使用量大约是启动时加载的50万兆个长寿命对象(=数据缓存),并且从那里仅创建(很多)寿命很短的对象(平均寿命<1毫秒)。
某些垃圾收集周期要花费10毫秒以上的时间才能运行……与应用程序延迟相比,这看起来确实不成比例,而应用程序延迟又是几毫秒。
对于产生大量短寿命垃圾且没有长寿命垃圾的应用程序而言,一种可行的方法是堆满一大堆东西,几乎所有年轻一代,几乎所有伊甸园和任职期都超过一个的YG集合。
例如(假设您有一个32位的jvm)
用于此设置的确切参数取决于您的工作集的稳态大小(即,每次收集时还剩下多少)。这里的想法显然违背了正常的堆大小调整规则,但是您没有一个具有这种行为的应用程序。这种想法是,该应用主要是短期垃圾和少量静态数据,因此请设置jvm,以使静态数据能够快速进入使用期,然后具有足够大的YG,以至于它不会经常被收集,从而将其最小化暂停的频率。您需要反复旋转旋钮才能确定适合您的尺寸,以及如何与每个系列的暂停尺寸相平衡。例如,您可能会发现更短但更频繁的YG暂停是可以实现的。
您没有说您的应用程序可以运行多长时间,但是这里的目标是在应用程序的生命周期内完全没有永久性集合。当然这可能是不可能的,但值得针对。
但是,在您的情况下,不仅重要的是收集算法,还分配了内存。NUMA收集器(仅与吞吐量收集器兼容并由UseNUMA开关激活)利用了这样的观察:对象通常仅由创建该对象的线程使用,从而相应地分配内存。我不确定它在Linux中基于什么,但是它在Solaris上使用MPO(内存放置优化),有关GC博客之一的一些详细信息
由于您使用的是64位jvm,因此请确保同时使用CompressedOops。
给定对象分配的速率(可能是某种科学的自由吗?)和生存期,那么您应该考虑对象重用。lib的一个示例就是javalution StackContext
最后值得一提的是,GC暂停不是唯一的STW暂停,您可以使用6u21抢先体验版本运行,该版本对PrintGCApplicationStoppedTime和PrintGCApplicationConcurrentTime开关(在全局安全点和这些安全点之间的时间有效打印时间)进行了一些修复。您可以使用tracesafepointstatistics标志来了解导致它需要安全点的原因(也就是任何线程都没有执行字节码)。
我正在运行一个neo4j实例中的数据大容量导入(我在2.2.0社区版和企业版以及2.1.7社区版上运行过),该实例在服务器模式下运行。我的应用程序在内存中创建了一组节点,并会在中间停止编写一个series.csv文件,并向neo4j实例发送cypher以上传这些文件。(这是由于使用普通的旧REST API运行应用程序时的性能问题造成的)。 语句,并且我对所有进行合并的对象都有索引。这感觉不像是in
Kubernetes 垃圾收集器的角色是删除指定的对象,这些对象曾经有但以后不再拥有 Owner 了。 注意:垃圾收集是 beta 特性,在 Kubernetes 1.4 及以上版本默认启用。 Owner 和 Dependent 一些 Kubernetes 对象是其它一些的 Owner。例如,一个 ReplicaSet 是一组 Pod 的 Owner。具有 Owner 的对象被称为是 Owner
我遇到了一个JNI程序随机内存不足的问题。 这是一个32位java程序,它读取文件,进行一些图像处理,通常使用250MB到1GB。然后丢弃所有这些对象,然后程序对通常需要100-250MB的JNI程序进行一系列调用。 当交互运行时,我从未见过问题。但是,当对许多文件连续运行批处理操作时,JNI程序将随机运行内存溢出。它可能对一个或两个文件有内存问题,然后对下一个10个文件运行正常,然后再次出现故障
本文向大家介绍Java垃圾收集,包括了Java垃圾收集的使用技巧和注意事项,需要的朋友参考一下 示例 C ++方法-新增和删除 在像C ++这样的语言中,应用程序负责管理动态分配的内存所使用的内存。当使用new运算符在C ++堆中创建对象时,需要相应地使用delete运算符来处置该对象: 如果程序忘记了delete一个对象而只是“忘记”了该对象,则关联的内存将丢失给应用程序。这种情况的术语是内存泄
JavaScript 具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。 而在C 和C++之类的语言中,开发人员的一项基本任务就是手工跟踪内存的使用情况,这是造成许多问题的一个根源。在编写JavaScript 程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管理。这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变量,然后释放其
问题内容: 我想向JVM注册一个回调,所以我知道何时进行垃圾回收。有什么办法吗? 编辑:我想这样做,以便可以在应用程序日志中发生垃圾收集时注销,这样我就可以查看它是否与我所看到的问题相关。启用- Xloggc很有帮助,但是将GC日志中的时间(自应用程序启动以来使用秒数)整合到我的主应用程序日志中有点棘手。 编辑2012年4月:从Java7u4开始,您可以从GarbageCollectorMXBea