Mar*_*rte 11 java garbage-collection
举个例子,我说我将JVM的最大堆设置为4GB.但是,一旦我的应用程序达到大约3GB,操作系统就开始将一些内存交换到磁盘.此时有几个对象已经超出范围,而JVM可能首先垃圾收集旧对象,而不是请求更多内存.在性能方面,进行垃圾收集运行比进行内存交换更好.JVM垃圾收集是否是关于这样的情况的智能,还是完全没有意识到它?我们可以以某种方式调整JVM来解决这种情况吗?
我知道垃圾收集有可能在我们达到3GB之前运行,因此我们实际上不需要交换内存,但这并没有真正回答我的问题.
编辑: 假设我的机器有超过4GB的内存,但有时还有其他应用程序占用一些内存,使我的内存少于4GB.我宁愿不必减少最大堆,因为大多数时候我会有4GB,但我想知道GC在其他情况下是否足够聪明.
JVM幸福地没有意识到OS内存管理不足.我记得不久前参加了关于GC优化的JavaOne会议,发言者强调你应该始终确保有足够的空闲内存(RAM,而不是交换)来运行JVM,以避免不惜一切代价进行分页,所以永远不要为JVM分配的内存比系统中给定时间可用的内存多.更重要的是,由于某些GC采集算法的工作方式,如果他们收集的内存块被分页,则可能会产生巨大的性能损失.
因此,永远不要给JVM提供比系统中物理可用内存更多的内存,或者如果由于某些外部进程而预计内存消耗会随着时间的推移而增加,那么就会分配一个堆空间来确保它永远不会被分页.如果你不能满足这些条件,那么你需要更多的RAM :)
更新:在SO中进行了一些搜索,我找到了这个.在这里,kdgregory认为分页不应该是一个问题,因为GC的工作方式,但他正在考虑由于正常情况下的分页,即内存没有被触摸一段时间,这不是你的情况,因为你将用完内存,你一定会开始分页.另外,如果你正在运行一些Linux风格,请查看John Ferminella的回答和他的博客文章,解释如何理解和调整Linux中的交换.
| 归档时间: |
|
| 查看次数: |
2371 次 |
| 最近记录: |