android - pthread_create 失败:无法分配 1069056 字节的映射空间:内存不足
问题描述
我最近遇到了一个 OutOfMemoryError 让我很困惑的问题。当发生 OutOfMemoryError 时,进程 Java 堆仍有大量空闲内存,系统也仍有大量空闲内存。我做了很多工作试图弄清楚,但现在,我仍然不知道出了什么问题。
导致OutOfMemoryError 问题的原因有4 个:
1. 进程FD 号超出限制。
2.进程线程数超出限制。
3.进程Java堆满。
4. 32位系统进程虚拟内存最大为3G。
我认为最可能的原因是4,所以我在运行应用程序时检测进程的虚拟内存,发现OutOfMemoryError发生时虚拟内存接近3 * 1024 * 1024字节。但我不知道为什么,谁能给我一些指导?非常感谢!
这是logcat信息:
04-12 16:15:52.043 9329 9370 W libc : pthread_create failed: couldn't allocate 1069056-bytes mapped space: Out of memory
04-12 16:15:52.065 9329 9370 W zygote : Throwing OutOfMemoryError "pthread_create (1040KB stack) failed: Try again"
04-12 16:15:52.106 9329 9370 E AndroidRuntime: FATAL EXCEPTION: EsrEngine
04-12 16:15:52.106 9329 9370 E AndroidRuntime: Process: com.translation.service:offline, PID: 9329
04-12 16:15:52.106 9329 9370 E AndroidRuntime: java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
04-12 16:15:52.106 9329 9370 E AndroidRuntime: at java.lang.Thread.nativeCreate(Native Method)
04-12 16:15:52.106 9329 9370 E AndroidRuntime: at java.lang.Thread.start(Thread.java:733)
04-12 16:15:52.106 9329 9370 E AndroidRuntime: at com.offline.EsrEngine.notifyWriteTask(EsrEngine.java:278)
04-12 16:15:52.106 9329 9370 E AndroidRuntime: at com.offline.EsrEngine.access$600(EsrEngine.java:35)
04-12 16:15:52.106 9329 9370 E AndroidRuntime: at com.offline.EsrEngine$3.run(EsrEngine.java:210)
04-12 16:15:52.106 9329 9370 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:790)
04-12 16:15:52.106 9329 9370 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
04-12 16:15:52.106 9329 9370 E AndroidRuntime: at android.os.Looper.loop(Looper.java:164)
04-12 16:15:52.106 9329 9370 E AndroidRuntime: at android.os.HandlerThread.run(HandlerThread.java:65)
这是 notifyWriteTask() 方法的代码。
private void notifyWriteTask() {
isAllowWrite = true;
final BlockingQueue<byte[]> buffer = databuffer;
writeThread = new Thread(new Runnable() {
@Override
public void run() {
EsrLogger.d(TAG, "WriteTask lang=" + currentLang
+ " Run>>>>>>>" + Thread.currentThread().getId()
+ " dataBuffer=" + buffer.size()
+ " isAllow=" + isAllowWrite);
while (isAllowWrite) {
byte[] audio;
try {
audio = buffer.poll(1500, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
break;
}
if (!isAllowWrite) {
break;
}
if (audio == null) {
EsrLogger.w(TAG, "WriteTask No Audio over 1500ms =====> Exit");
break;
}
writeAudio(audio, audio.length);
EsrResult result = getEsrResult();
if (result != null && result.isFinish()) {
databuffer.clear();
EsrLogger.d(TAG, "WriteTask has finish result=" + result);
writeAudioFlag = EsrInstBase.ESR_AUDIO_END;
break;
}
}
stopEsr();
buffer.clear();
EsrLogger.d(TAG, "WriteTask End<<<<<<<<" + writeThread.getId());
}
}, currentLang);
writeThread.start();
EsrLogger.d(TAG, "WriteTask Start>>>>>>" + writeThread.getId());
}
解决方案
推荐阅读
- javascript - 使用 Ajax 和 formData 的 Laravel 419 错误,
- python - 屏蔽不同大小的数组,然后替换另一个数组的元素
- javascript - vue.runtime.esm.js?2b0e:619 [Vue 警告]:属性或方法“add”未在实例上定义,但在渲染期间引用
- visual-studio - VS 2019 中 Azure LogicApps 的架构和映射
- python - 当两个列表组合在一起时如何从列表项中删除括号、逗号和引号
- html - 父母相对于孩子的位置
- mysql - 如何更新表的所有行而不在 Laravel 中检索它们?
- c++ - C++ 指针警告:算术溢出:对 4 字节值使用运算符“-”,然后将结果转换为 8 字节值
- java - java下MySql Connector SQL Statement不返回任何值
- c - 为什么我的 rust 比我的 C 内存操作慢?