使用 IntentService 报错: java.lang.InstantiationException: class has no zero argument constructor

本文介绍了一种常见的IntentService构造函数错误:java.lang.InstantiationException,即类没有无参构造函数。通过添加一个包含super调用的构造函数解决了此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用 IntentService 报错:
java.lang.InstantiationException: class has no zero argument constructor
解释一下 :报错原因,没有空构造函数。然而当你创造出空构造,居然还报错。

public MyJpushIntentService() {// 
        super("someName");// 关键是这句话
    }
这是我  MyJpushIntentService的空构造  super("someName")。
ok  解决问题  。
06-15 04:44:39.547689 7077 7077 I AEE_AED : java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again 06-15 04:44:39.547689 7077 7077 I AEE_AED : at java.lang.Thread.nativeCreate(Native Method) 06-15 04:44:39.547689 7077 7077 I AEE_AED : at java.lang.Thread.start(Thread.java:976) 06-15 04:44:39.547689 7077 7077 I AEE_AED : at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:1100) 06-15 04:44:39.547689 7077 7077 I AEE_AED : at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1511) 06-15 04:44:39.547689 7077 7077 I AEE_AED : at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) 06-15 04:44:39.547689 7077 7077 I AEE_AED : at com.longcheer.runin.utils.RFShellUtils.exec(RFShellUtils.java:39) 06-15 04:44:39.547689 7077 7077 I AEE_AED : at com.longcheer.runin.testcase.Thermal.ThermalService.checkCpuTemp(ThermalService.java:158) 06-15 04:44:39.547689 7077 7077 I AEE_AED : at com.longcheer.runin.testcase.Thermal.ThermalService.init(ThermalService.java:79) 06-15 04:44:39.547689 7077 7077 I AEE_AED : at com.longcheer.runin.testcase.Thermal.ThermalService.onHandleIntent(ThermalService.java:57) 06-15 04:44:39.547689 7077 7077 I AEE_AED : at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:77) 06-15 04:44:39.547689 7077 7077 I AEE_AED : at android.os.Handler.dispatchMessage(Handler.java:107) 06-15 04:44:39.547689 7077 7077 I AEE_AED : at android.os.Looper.loopOnce(Looper.java:249) 06-15 04:44:39.547689 7077 7077 I AEE_AED : at android.os.Looper.loop(Looper.java:337) 06-15 04:44:39.547689 7077 7077 I AEE_AED : at android.os.HandlerThread.run(HandlerThread.java:85)
最新发布
06-17
<think>我们正在处理一个关于Android平台上`java.lang.OutOfMemoryError:pthread_create(1040KBstack)failed`错误的问题,特别是在使用`ThreadPoolExecutor`时发生。根据引用内容,该错误通常与线程创建有关,可能由于两个原因:1.进程的栈内存超过虚拟机最大内存限制;2.线程数达到系统最大限制(例如华为手机限制为300个线程)。根据引用[3],一个解决方法是使用有界队列或调整线程池参数,例如:```javanewThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLISECONDS,newLinkedBlockingQueue<Runnable>());```这里使用了固定大小的线程池,并且使用了一个无界队列(实际上`LinkedBlockingQueue`默认是无界的),但无界队列可能导致堆积大量任务从而消耗内存。因此,我们可能需要调整队列大小或使用其他策略。引用[4]指出,栈内存回收在线程结束时就会回收,因此我们需要确保线程池中的线程能够及时回收,并且避免创建过多线程。解决方案思路:1.控制线程池的最大线程数,避免创建过多线程(特别是超过系统限制,如300)。2.使用合适的队列,避免任务无限堆积导致内存溢出。3.合理设置线程存活时间,使得空闲线程能够被回收。4.针对特定手机厂商(如华为)的系统限制,需要更加严格地控制线程数。具体步骤:1.分析当前线程池的配置,确保最大线程数不会过高(例如,不要超过系统限制,可以保守设置为50或100,具体根据设备情况调整)。2.使用有界队列(如`newArrayBlockingQueue<Runnable>(queueSize)`)并设置合适的队列大小,这样当队列满时,可以采取拒绝策略。3.设置线程存活时间(keepAliveTime),并允许回收空闲线程(通过设置`allowCoreThreadTimeOut(true)`可以回收核心线程)。4.定义合理的拒绝策略(RejectedExecutionHandler),例如记录日志、降级处理等。示例代码:```javaintcorePoolSize=2;//核心线程数intmaxPoolSize=50;//最大线程数,根据设备情况调整,避免超过系统限制(如华为300)longkeepAliveTime=30;//空闲线程存活时间(秒)BlockingQueue<Runnable>queue=newArrayBlockingQueue<>(100);//有界队列,防止任务无限堆积ThreadPoolExecutorexecutor=newThreadPoolExecutor(corePoolSize,maxPoolSize,keepAliveTime,TimeUnit.SECONDS,queue,newThreadFactory(){//自定义线程工厂,可以设置线程优先级、名称等@OverridepublicThreadnewThread(Runnabler){Threadthread=newThread(r);thread.setPriority(Thread.NORM_PRIORITY);thread.setName("MyThreadPool-"+thread.getId());returnthread;}},newThreadPoolExecutor.CallerRunsPolicy()//拒绝策略:由调用线程执行该任务);//允许回收核心线程executor.allowCoreThreadTimeOut(true);```另外,引用[4]提到可以查看当前进程的线程数,我们可以通过以下命令监控:```adbshelltop-m20#找到进程PIDadbshellps-T[PID]|wc-l#计算该进程的线程数```这样,我们可以确保线程数不会超过限制。此外,我们还需要检查代码中是否在其他地方创建了线程(如直接使用`newThread()`或使用多个线程池),确保整个应用的线程总数可控。总结:通过合理配置线程池参数(线程数、队列、存活时间、拒绝策略)并监控线程总数,可以避免`pthread_create`导致的OOM。</think>### 解决 Android 中 `pthread_create` OOM 错误 当在 Android 上遇到 `java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed` 错误时,通常是由线程资源耗尽引起的。以下是系统级原因和解决方案: #### 根本原因分析 1. **线程数超限**: - Android 系统对单个进程的线程数有限制(华为等厂商可能限制为 300 个线程)[^4] - 每个线程默认分配 1MB 栈空间(1040KB = Java 栈 + Native 栈)[^4] - 公式:$$ \text{总内存消耗} = \text{线程数} \times \text{栈大小} $$ 2. **线程池配置问题**: - 无界队列导致线程无限增长 ```java // 错误示例:无界队列可能堆积大量任务 new ThreadPoolExecutor(0, Integer.MAX_VALUE, ...); ``` #### 解决方案 **1. 优化线程池配置** ```java // 正确配置示例 ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize, // 核心线程数 (建议 2-4) maxPoolSize, // 最大线程数 (不超过 50) 30L, TimeUnit.SECONDS, // 空闲线程超时 new LinkedBlockingQueue<>(100), // 有界队列 new ThreadPoolExecutor.DiscardPolicy() // 拒绝策略 ); ``` - **关键参数**: - `maxPoolSize` ≤ 50(保守值,避免触发系统限制)[^3] - 使用有界队列(如 `ArrayBlockingQueue`)防止任务无限堆积 - 设置拒绝策略(`DiscardPolicy`/`CallerRunsPolicy`) **2. 线程复用策略** - 全局共享线程池(避免多处创建) - 使用 `AsyncTask.THREAD_POOL_EXECUTOR` 系统级线程池 - 监控线程数: ```bash adb shell ps -T [PID] | wc -l # 查看进程线程数 ``` **3. 内存优化** ```java // 降低线程栈大小(需权衡稳定性) Thread thread = new Thread(null, runnable, "thread-name", 256 * 1024); ``` - 栈大小范围:256KB~1MB(默认 1MB)[^4] - 仅适用于计算密集型任务 **4. 泄漏检测** - 使用 `StrictMode` 检测线程泄漏: ```java StrictMode.setVmPolicy(new VmPolicy.Builder() .detectLeakedClosableObjects() .penaltyLog() .build()); ``` #### 华为设备特殊处理 ```java // 华为设备线程数限制适配 if (Build.MANUFACTURER.equalsIgnoreCase("huawei")) { maxPoolSize = Math.min(maxPoolSize, 250); // 预留安全阈值 } ``` > **关键原则**:线程是昂贵资源,应像管理内存一样严格管理线程生命周期。推荐使用 `ThreadPoolExecutor` + 有界队列的组合方案[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值