java:for java for循环改多线程创建线程,断点不进线程里面

java因创建太多线程内存溢出?请大家帮我分析下这张jconsole的图示结果 - ITeye问答
web容器用的是tomcat8,jdk8,都是64位的。 在应用中有一个循环来调用ICE接口,使用的是ICE的库,调用的时候会创建大量的线程,到了一定的时候就会报错,tomcat退出。在tomcat bin目录下生成hs_err_pidxxx.log文件,开头错误提示:
# # There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (malloc) failed to allocate 1817056 bytes for Chunk::new
-------------------- 查了下,应该是没有内存创建更多的线程了。
下面截一张jconsole的图,保留了tomcat退出时的vm状况,里面还有我的tomcat的启动参数等信息。我的问题是,这里显示的启动的线程总数显然是太大了,但活动线程只有43个,那些不活动的线程是否没有回收?我在每次循环结束都调用gc(),并且观察到堆内存被较好地控制在70M左右,不往上涨了,说明gc()是起作用了,但线程为什么没有回收?这种局面有什么办法可破?
这么多线程哪里来的?一个进程来说,这么多线程只能起反作用
没有HEAP dump很难说是什么地方出现问题
一万多个线程,而运行状态才40多个,建议看一下这部分!
1,你的tomcat支持同时运行的线程数量有限,但并不会忽略你创建的其他线程,其他线程只是处于等待状态。
2,每创建一个线程,jvm都会分配一定的内存空间给它
3,从你提供的信息可以看出,你的程序在不停的创建线程,导致最后内存溢出,由于大多数的线程是处于等待状态,所以这些线程分配的内存空间是被浪费掉的。
4,如果你怀疑有线程没有被回收,那么只有可能是一种情况,你的线程没有正常结束,也就是说有死锁的现象出现,那么这属于是代码逻辑的问题。
5,如果你想解决这个问题,可以使用线程池来管理你的线程,重复利用系统资源。
希望对你有所帮助。
内存溢出有好几种,包括堆溢出,栈溢出,Perm溢出等等,建议先借助工具看看到底是那块溢出,jprofile不知道能不能看,建议你试试。根据你截图看至少不是堆溢出。
另外我看你JVM参数里面有个-Xss716k,我查了下是设置每个线程的Stack大小,我不知道这个参数是不是有影响,建议可以做个试验。把这个参数调大,然后观察tomcate宕机的时间有没有延长。如果有延长,建议调大或者干脆别设了。
再说线程的事,你启动的线程很多,但是活动的线程很少,需要考虑下是否有死锁的情况,建议看下core dump文件是否存在线程死锁。
记得ICE的使用中,单例即可,还有看看每次执行完的时间,是不是没有超时设置等,线程池设置等。丢弃策略
直接内存溢出。
可能会有内在泄漏
参考下这个
http://blog.csdn.net/renxianzuo/article/details/6824716
垃圾回收组合执行回收时间非常长,应该存在问题。
参考这篇文章,看看是否对你有用。
.cn/s/blog_72ef7bea0101cthq.html
已解决问题
未解决问题相关文章推荐
1 for语句里面可以定义多个变量,但是必须是同型的
题目:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个线程, 按顺序输出ABC, 循环10次。
解题思路:要按顺序输出ABC, 循环10次,就要控制三个线程...
在学习多线程的互斥与同步中遇到一个问题,如下:public class Test {
public static void main(String[] args) {
最近在做接口的时候总是遇到一个for语句中 每次循环会涉及很多资源,包括 ftp io db,总想用现场来控制太.找到一篇文章
/blog/14...
在for里面,如果执行一次for里面的内容所需时间“较长”(相对而言),不妨改用线程池的方式。
如下测试:
public class ExecutorTest2 {
private stati...
原文地址:/widebright/item/83f648c365c4
第一次试用vc2010的openmp功能, 多...
循环创建多线程时保证参数的有效性
当我们需要在一个循环中传递参数时,使用使用函数的方法一般都是:
此文为个人学习《C#并行编程高级教程》的笔记,总结并调试了一些文章中的代码示例。 在以后开发过程中可以加以运用。
对于并行任务,与其相关紧密的就是对一些共享资源,数据结构的并行访问。经常要做的就是...
在Java中,可以在一个类内部定义另一个类,这种类称为嵌套类(nested class)。嵌套类有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类较少使用,非静态嵌套类使用较多,也就是常说的内部类。其中...
在学习多线程的互斥与同步中遇到一个问题,如下:public class Test {
public static void main(String[] args) {
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)本帖子已过去太久远了,不再提供回复功能。相关文章推荐
在java高级开发中,经常会碰到多线程,关于线程的关闭,可能会用stop() 方法,但是stop是线程不安全的,一般采用interrupt,判断线程是否中止采用isInterrupted,
如果线程...
1. Thread.stop()函数
stop()函数终止线程就像是强行拔掉电源线关机一样,可能会带来未知风险,因此目前不再推荐使用这种方式。请忘记它吧~~
2. 改变标志变量状态
通常我们会在线...
需要开启一个线程,这个线程一直阻塞等待某件事情发生,最后根据主线程
Java中终止线程的方式主要有三种:
1、使用stop()方法,已被弃用。原因是:stop()是立即终止,会导致一些数据被到处理一部分就会被终止,而用户并不知道哪些数据被处理,哪些没有被处理,产生了...
Java中的线程的生命周期大体可分为5种状态。
①NEW:这种情况指的是,通过New关键字创建了Thread类(或其子类)的对象
②RUNNABLE:这种情况指的是Thread类的对象调用了sta...
java.util.concurrent.Executors:static class DefaultThreadFactory implements ThreadFactory {
线程启动完毕后,在运行时可能需要终止,Java提供的终止方法只有一个stop,但是我 不建议使用这个方法,因为它有以下三个问题:
stop方法是过时的
从Java编码规则来说,已经过时的方法...
线程的基本概念线程是在进程内部运行的一个执行分支,它是运行在进程的地址空间中。和进程之间的独立性不同,线程之间更强调共享性,它共享进程的地址空间,比如数据段,代码段,堆。。。以及文件描述符表。因此,无...
http://blog.csdn.net/chenqiu1024/article/details/2829827
了解JAVA多线程编程的人都知道,要产生一个线程有两种方法,一是类直接继承Thr...
要 介绍了利用MATLAB信号处理工具箱进行FIR滤波器设计的三种方法:程序设计法、FDATool设计法和SPTool设计法,给出了详细的设计步骤,并将设计的滤波器应用到一个混和正弦波信号,以验...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)用for循环,是每个循环创建了一个线程吗?为什么输出不是1到100顺序输出,而是没有规矩的呢
是不是先创建所有线程,然后线程再开始争用处理机时间?main方法是一个线程吗?求解答,谢谢谢谢谢谢?
写下你的评论...
写下你的评论...
Copyright (C)
All Rights Reserved | 京ICP备 号-2

我要回帖

更多关于 java线程循环执行 的文章

 

随机推荐