Android 安卓系统内存不足时使用ExecutorService
我使用服务。但有时会因记忆错误而发生 错误日志Android 安卓系统内存不足时使用ExecutorService,android,Android,我使用服务。但有时会因记忆错误而发生 错误日志 java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again at java.lang.Thread.nativeCreate(Native Method) at java.lang.Thread.start(Thread.java:1063) at java.util.concurrent.ThreadPoolExecutor.add
java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
at java.lang.Thread.nativeCreate(Native Method)
at java.lang.Thread.start(Thread.java:1063)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:921)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1339)
at kr.co.iosystem.blackeyeonandroid.m4m.domain.CapturePipeline.executeProcessor(CapturePipeline.java:195)
at kr.co.iosystem.blackeyeonandroid.m4m.domain.CapturePipeline.start(CapturePipeline.java:156)
at kr.co.iosystem.blackeyeonandroid.record.VideoCapture.start(VideoCapture.java:92)
at kr.co.iosystem.blackeyeonandroid.record.Capturing.startCapturing(Capturing.java:97)
at kr.co.iosystem.blackeyeonandroid.record.RecTimerHandler.startRecording(RecTimerHandler.java:221)
at kr.co.iosystem.blackeyeonandroid.record.RecTimerHandler.handleMessage(RecTimerHandler.java:83)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5415)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:745)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:635)
我的消息来源呢
protected ExecutorService pools;
public void start() {
pools = Executors.newCachedThreadPool();
executeProcessor();
}
protected void executeProcessor() {
pools.execute(new Runnable() {
@Override
public void run() {
...
}
}
}
首先,pools=Executors.newCachedTheadPool;previous pools=Executors.newSingleThreadExecutor
通常情况下,这种情况。当我在android上使用ExecutorService时,如何修复OutOfMemory
如果你知道这个问题。请给我一些建议
感谢cachedThreadPoolExecutor将在给定新任务的情况下创建可能无限多的线程。我不确定您的run方法中包含了什么,但是如果它有for循环/while循环或任何其他生成新工作的机制,它将自动创建一个占用内存的新线程。这可能会导致您收到OutOfMemoryException 要进行诊断,请尝试使用FixedThreadPoolt numOfThreads和少量线程(例如4),然后查看是否仍然出现错误 如果是,那么考虑运行方法如何消耗内存。 如果没有,那么您现在知道cachedThreadPoolExecutor创建的线程数量有问题,请尝试分解任务以使用更少的线程。试着找出线程数/内存使用率/性能的最佳点,这类东西通常是关于管理的,很少有一刀切的方法。
运行该方法的目的是什么?单个线程执行器只会在后台创建一个新线程。但是,run方法中的工作将按顺序执行。如果这适合您的用例,那么继续。我可以问一下你在做什么工作吗。如果您不希望在运行方法不是内存密集型的情况下产生内存开销,如果您正在做的工作是大量计算而不是IO,如果您担心并发问题,如果您同时做大量I/O工作,例如读取网络/从磁盘/相机/麦克风,我建议使用FixedThreadPoolExecutor每个线程的线程数来处理这些单独的任务