Java堆空间和RAM
在阅读有关分析线程转储的文章后,我有一个困扰我的问题.有一段提到32位JVM中的逻辑最大堆大小是4GB.
This链接指出32位Windows计算机上的最大堆大小约为1.4 – 1.6 GB. 我的问题是,如果你有大约8GB的RAM,这是否意味着我只能使用1.4-1.6 GB,如果我是你的32位JVM?那么64位JVM允许的最大大小是多少? 感谢你对此的帮助,因为我对此感到困惑. 解决方法
特别是在Windows上,原因是热点(sun / oracle JVM)和windows dll的实现的组合.
32位代码可以访问4GB的虚拟地址空间(有扩展允许更多,但我不会进入那些). 在32位窗口上,此虚拟地址空间的高2GB保留用于操作系统使用(某些版本的OS接受/3GB标志作为启动参数以允许3GB的用户可访问空间). 此外,您使用的任何库(* .dll)都映射到此地址空间的一部分.默认情况下,windows base * .dll文件加载到~1.6 GB标记(OS版本和补丁级别稍有不同) 除此之外,热点JVM仅支持分配单个连续的内存块以用作堆空间. 所以,如果你试着想象一下这个,你会看到你有一个约2GB的自由区域,有一个“墙”的窗口* .dll加载到~1.6GB.这是这个数字背后的逻辑.它还意味着即使你提供/ 3GB标志,sun / oracle JVM也无法使用它.其他一些虚拟机更擅长处理碎片堆 – 比如jrockit VM 您也可以尝试rebasing windows dlls,以便它们加载到更高的内存地址并挤出更多可用的堆空间,但这个过程很脆弱. 另请注意,特定计算机上加载的驱动程序/应用程序(如防病毒软件)很可能会将自己的* .dll注入到java进程中,这些dll可以在更低的内存地址加载,从而进一步缩小可用堆空间. 在64位版本的Windows the addressable limit is 8-128TB上,物理限制现在为64TB (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |