加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java堆空间和RAM

发布时间:2020-12-15 04:17:45 所属栏目:Java 来源:网络整理
导读:在阅读有关分析线程转储的文章后,我有一个困扰我的问题.有一段提到32位JVM中的逻辑最大堆大小是4GB. This链接指出32位Windows计算机上的最大堆大小约为1.4 – 1.6 GB. 我的问题是,如果你有大约8GB的RAM,这是否意味着我只能使用1.4-1.6 GB,如果我是你的32位JV
在阅读有关分析线程转储的文章后,我有一个困扰我的问题.有一段提到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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读