您的位置:首页 > 编程语言 > Java开发

内存溢出:java.lang.OutOfMemoryError: pthread_create (stack size 131072 bytes) failed: Out of memory

2017-11-06 09:27 666 查看

一,遇到的问题

1.报错代码:

private void sendUnConnectMsgToServer(){
String id = preferences.getString(ConstantUtil.KEY_ID,"0");
sendInstallDateTask = new SendInstallDateTask(id, "0","0","0","0","0","0","0","0","00","0","0");
sendInstallDateTask.execute((Void) null);
}


2.报错日志如下:

java.lang.OutOfMemoryError: pthread_create (stack size 131072 bytes) failed: Out of memory
at java.lang.VMThread.create(Native Method)
at java.lang.Thread.start(Thread.java:1026)
at com.android.volley.RequestQueue.start(RequestQueue.java:142)
at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:66)
at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:78)
at com.sdkj.heaterbluetooth.service.SocketService.sendUnConnectMsgToServer(SocketService.java:452)
at com.sdkj.heaterbluetooth.service.SocketService.access$700(SocketService.java:41)
at com.sdkj.heaterbluetooth.service.SocketService$5.handleMessage(SocketService.java:297)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5398)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:603)
at dalvik.system.NativeStart.main(Native Method)


3.产生原因

内存中产生大量的sendInstallDateTask对象使用完没回收

4.解决办法

将sendInstallDateTask对象用完后及时置null

二,常见的内存溢出报错

常见原因

内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

代码中存在死循环或循环产生过多重复的对象实体;

使用的第三方软件中的BUG;

启动参数内存值设定的过小;

Java代码导致OutOfMemoryError错误的解决

需要重点排查以下几点:

检查代码中是否有死循环或递归调用。

检查是否有大循环重复产生新对象实体。

检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可 能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。

检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

解决java.lang.OutOfMemoryError的方法有如下几种

一、增加jvm的内存大小

在执行某个class文件时候,可以使用java -Xmx256M aa.class来设置运行aa.class时jvm所允许占用的最大内存为256M。

二、 优化程序,释放垃圾

主要包括避免死循环,应该及时释放种资源:内存, 数据库的各种连接,防止一次载入太多的数据。导致java.lang.OutOfMemoryError的根本原因是程序不健壮。因此,从根本上解决Java内存溢出的唯一方法就是修改程序,及时地释放没用的对象,释放内存空间。 遇到该错误的时候要仔细检查程序,嘿嘿,遇到过一次这种问题之后,以后写程序就会小心多了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐