Mat*_*nry 32 java heap garbage-collection jvm
这是 不是 可以增加Java的堆的最大尺寸的虚拟机启动后.这有什么技术原因?垃圾收集算法是否依赖于具有固定数量的内存来处理?或者出于安全原因,是否通过消耗所有可用内存来阻止Java应用程序在DOS上运行系统上的其他应用程序?
Jos*_*non 23
在Sun的JVM中,我知道,整个堆必须分配在一个连续的地址空间中.我想,对于大堆值,在启动后添加到地址空间非常困难,同时确保它保持连续.您可能需要在启动时获取它,或者根本不需要.因此,它是固定的.
即使不是立即全部使用,也会在启动时保留整个堆的地址空间.如果它无法为传递的-Xmx值保留足够大的连续地址空间块,则无法启动.这就是为什么在32位Windows上分配> 1.4GB堆很难的原因 - 因为很难找到大小或更大的连续地址空间,因为有些DLL喜欢在某些地方加载,破坏地址空间.当你去64位时,这不是一个真正的问题,因为有更多的地址空间.
出于性能原因,这几乎可以肯定.我找不到一个很好的链接,详细说明了这一点,但这是一个非常好的引用来自Peter Kessler(完整链接 - 请务必阅读评论),我在搜索时发现.我相信他在Sun的JVM上工作.
我们需要堆的连续内存区域的原因是我们有一堆辅助数据结构,这些数据结构由堆起始处的(缩放)偏移量索引.例如,我们使用"卡标记数组"跟踪对象引用更新,每个512字节的堆有一个字节.当我们在堆中存储引用时,我们必须在卡片标记数组中标记相应的字节.我们右移商店的目的地地址并使用它来索引卡片标记数组.有趣的解决算术游戏,你不能用Java做(必须:-)在C++中玩.
这是在2004年 - 我不确定自那以后发生了什么变化,但我很确定它仍然存在.如果您使用Process Explorer之类的工具,您可以看到Java应用程序的虚拟大小(添加虚拟大小和专用大小内存列)包括从启动点开始的总堆大小(加上其他所需空间) ,即使进程中使用的内存在堆开始填满之前也不会接近...
从历史上看,存在这种限制的原因,这不允许浏览器中的Applet占用所有用户内存.从未有过这种限制的Microsoft VM实际上允许这样做,这可能导致对用户计算机的某种拒绝服务攻击.就在一年前,Sun在1.6.0 Update 10 VM中引入了一种方法,让applet指定他们想要多少内存(仅限于物理内存的某个固定份额),而不是总是将它们限制为64MB甚至在计算机上有8GB或更多可用.
现在,自从JVM发展以来,当VM没有在浏览器中运行时应该可以摆脱这种限制,但是Sun显然从来没有认为它是如此高优先级的问题,尽管最近已经提交了大量的bug报告允许堆增长.
| 归档时间: |
|
| 查看次数: |
6374 次 |
| 最近记录: |