JVM能否将碎片化内存以连续形式呈现给应用程序?
JVM能否将碎片化内存以连续形式呈现给应用程序?
咱们先从底层操作系统的逻辑聊起哈——现在的主流操作系统都配有相当先进的虚拟内存模型,尤其是64位架构下,虚拟地址空间大得夸张,所以它们能轻松把物理内存里那些东一块西一块的零散页面,在虚拟地址层面拼接成连续的空间给上层应用用,完全不用操心物理内存是不是碎片化。
但JVM就不一样了,说穿了它本身就像个“迷你版操作系统”(毕竟是虚拟机嘛),很多咱们默认是操作系统该搞定的内存相关功能,它都得自己动手实现。就拿你关心的基于数组的连续内存需求来说,这里得划几个关键点:
- JVM给应用程序提供的“连续内存”,指的是JVM自身虚拟地址空间里的连续,而不是物理内存的连续。物理内存的碎片化问题其实已经被底层操作系统的虚拟内存机制解决了,但JVM自己管理的堆内存如果碎片化了,它可没法像操作系统那样玩“物理页映射成连续虚拟地址”的花招。
- 这是因为JVM的内存管理(比如各种垃圾收集器)是在操作系统分配给它的一块整体虚拟地址空间里运作的,它没办法直接绕过操作系统去重新映射物理内存页。当堆内存碎片化严重,没法分配出连续的大块空间给数组这类需要连续内存的对象时,就得靠GC的压缩功能——把零散的对象移动到一起,腾出连续的大块堆内存,才能满足分配需求。
简单总结下:物理内存的碎片化有操作系统兜着,但JVM自己堆里的碎片化,它只能靠自身的GC机制来整理,没法直接把零散的堆内存块“伪装”成连续空间给应用程序使用。
内容来源于stack exchange
相关产品推荐
相关产品推荐

