Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓系统内存不足时使用ExecutorService_Android - Fatal编程技术网

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每个线程的线程数来处理这些单独的任务