外观
如何理解Native 内存与 JNI 生命周期?
标准回答
先确认Native或相关映射持续增长,再用heapprofd等分配采样定位保留分配的调用栈,或在可控构建中采用分配跟踪工具。采样数据有粒度和开销限制,不能把未采样到的小对象当成不存在。
JNI常见问题包括malloc资源未释放、全局引用未删除、重复创建Native对象、异常路径漏清理,以及线程或缓冲生命周期错误。Java包装对象被回收,不保证所有Native资源立即正确释放。
修复应明确谁创建、谁关闭、何时转移所有权,用成对释放与异常清理减少分支遗漏,再重复场景看保留量。Native堆正常时继续排查映射、DMA或图形资源,不能停在一个工具。
追问与回答
JNIEnv能在多线程间随便传吗
不能。JNIEnv与当前线程相关,Native线程需按契约attach/detach;跨线程共享Java对象还需正确引用类型和同步。
参考资料
内容来源
- Android 与 AI 工程 Wiki · 原条目
q059