面试题答案
一键面试JVM与操作系统内存交互原理
- JVM向操作系统申请内存
- 启动时申请:当JVM启动时,会根据用户指定的初始堆大小(通过
-Xms
参数)向操作系统申请内存。例如,若设置-Xms256m
,JVM启动时会向操作系统请求256MB的连续内存空间。操作系统会在其内存管理系统中,从空闲内存区域分配一块相应大小的内存给JVM。 - 运行时动态申请:在JVM运行过程中,如果堆内存不足,会触发垃圾回收(GC)。若垃圾回收后仍无法满足需求,JVM会尝试向操作系统动态申请更多内存。例如,Java堆的空间分配担保机制,当新生代对象晋升到老年代时,如果老年代剩余空间不足,JVM可能会向操作系统申请扩展堆内存。JVM通过操作系统提供的系统调用(如在Linux系统上可能通过
brk
或mmap
系统调用)来请求更多的内存。
- 启动时申请:当JVM启动时,会根据用户指定的初始堆大小(通过
- JVM将不再使用的内存归还给操作系统
- 垃圾回收机制:JVM主要依靠垃圾回收来回收不再使用的对象所占用的内存空间。垃圾回收器(如CMS、G1等)会标记并清理不再被引用的对象,释放它们占用的内存。但这些被释放的内存通常先回到JVM的堆内存空闲区域,并不会立即归还给操作系统。
- 内存收缩:在某些情况下,如JVM的堆内存使用率持续较低,且满足一定条件时,JVM会尝试将部分堆内存归还给操作系统。例如,G1垃圾回收器在满足一定的空闲堆内存比例等条件下,会进行堆内存的收缩,通过系统调用(类似申请内存时的系统调用反向操作)将部分内存归还给操作系统,以降低JVM进程占用的物理内存大小,提高系统整体的内存利用率。