isLoaded()仅提供瞬时、非权威的内存驻留快照,不触发加载也不保证状态,依赖OS且不可控,不能用于同步或重试,日常开发中基本可忽略。

isLoaded() 返回 true 并不表示数据“一定在物理内存里”,返回 false 也不代表数据“肯定不在”——它只是一个瞬时、非权威的提示。
它只是快照,不是状态监控
isLoaded() 调用时会向操作系统查询当前映射页是否全部驻留在 RAM 中。但这个判断发生在毫秒级的时间点上:
- 刚查完返回 true,下一纳秒内内核可能就因内存压力把部分页换出(swap out);
- 刚查完返回 false,其实大部分页已在内存中,只是某一页尚未完成预取或状态未同步;
- 该方法不触发任何加载动作,也不等待加载完成,纯属只读检查。
底层依赖 OS 行为,Java 无法强控
是否驻留物理内存,最终由操作系统内核决定,Java 层面没有干预权限:
- Linux 下是否锁定页(mlock)、是否启用 transparent huge pages、当前 swappiness 设置等都会影响结果;
- Android(尤其是低内存设备)可能主动回收 mmap 区域的物理页,即使刚调用过 load();
- isLoaded() 的实现本质是调用类似 mincore() 的系统调用,而该调用本身就有采样延迟和精度限制。
不能用于同步或重试逻辑
开发者容易误把它当作加载完成的信号来循环等待,这是危险且无效的:
- 循环调用 isLoaded() 不会加速加载,反而浪费 CPU;
- 它不提供回调、事件或阻塞能力,无法构成可靠的状态流转依据;
- 真正需要保障驻留时,应结合 load() + 业务访问触发(如顺序扫描一遍缓冲区),而非依赖 isLoaded() 的返回值做决策。
适用场景很窄,多数时候可忽略
除非你在做底层性能调优或诊断缺页率,否则日常开发中很少需要调用 isLoaded():
- 读写性能瓶颈通常来自磁盘 I/O 或随机访问模式,而非单次 isLoaded() 判断;
- 如果担心缺页开销,优先考虑 load() 预热 + 合理分块访问,而不是轮询 isLoaded();
- 日志或监控中记录 isLoaded() 结果,仅能辅助分析“某一时刻内存压力情况”,不可作为功能逻辑分支条件。










