java 多线程,这种情况是否正常。线程总数一直在上升,但是内存没有出现过大的波动

问题描述

java 多线程,这种情况是否正常。线程总数一直在上升,但是内存没有出现过大的波动
因根据不同的任务需要定时创建线程池,为什么线程总数一直在上升?

解决方案

线程数一直上升,建议开通jmx,利用远程的工具查看,例如jdk自带的jvisualvm。出现这种情况原因比较多,例如:
1)线程之间资源竞争,导致前面线程池没有释放资源,后面线程阻塞
2)线程出现死循环
3)优先级线程一直占据竞争资源
4)某些方法同步锁或者某些变量同步锁

建议用jvisualvm查看应该关闭的线程堵塞的方法的行数。

解决方案二:
你如何实现的线程池,是使用java的ThreadPoolExecutor 么,还是用 Executors.newFixedThreadPool生成固定大小的线程池。代码贴上来看看,“线程总数一直在上升,但是内存没有出现过大的波动”,你是通过工具看的的么,你用jstack看到线程有很多么?

解决方案三:
线程数一直上升,说明你的线程池没有释放资源

解决方案四:
线程数一直上升,说明你的线程池没有释放资源

解决方案五:
线程数一直上升,说明你的线程池没有释放资源

解决方案六:
线程数一直上升,说明你的线程池没有释放资源

解决方案七:
线程数一直上升,说明你的线程池没有释放资源

时间: 2024-12-24 11:44:17

java 多线程,这种情况是否正常。线程总数一直在上升,但是内存没有出现过大的波动的相关文章

Java多线程编程实战之实现线程

Java编程语言使多线程如此简单有效,以致于某些程序员说它实际上是自然的.尽管在 Java 中使用线程比在其他语言中要容易得多,仍然有一些概念需要掌握.要记住的一件重要的事情是 main() 函数也是一个线程,并可用来做有用的工作.程序员只有在需要多个线程时才需要创建新的线程. Thread 类 Thread 类是一个具体的类,即不是抽象类,该类封装了线程的行为.要创建一个线程,程序员必须创建一个从 Thread 类导出的新类.程序员必须覆盖 Thread 的 run() 函数来完成有用的工作.

Java多线程编程基础之非线程的方法

[wait(),notify()/notityAll()方法] 关于这两个方法,有很多的内容需要说明.在下面的说明中可能会有很多地方 不能一下子明白,但在看完本节后,即使不能完全明白,你也一定要回过头来记住 下面的两句话: [wait(),notify()/notityAll()方法是普通对象的方法(Object超类中实现), 而不是线程对象的方法] [wait(),notify()/notityAll()方法只能在同步方法中调用] [线程的互斥控制] 多个线程同时操作某一对象时,一个线程对该对

Java多线程:用三个线程控制循环输出10次ABC

题目:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个线程, 按顺序输出ABC, 循环10次. 解题思路:要按顺序输出ABC, 循环10次,就要控制三个线程同步工作,也就是说要让三个线程轮流输出,直到10个ABC全部输出则结束线程.这里用一个Lock对象来控制三个线程的同步.用一个int型变量state标识由那个线程输出.   1 package com.thread; 2 3 import java.util.concurrent.locks.Lock

详解Java多线程编程中CountDownLatch阻塞线程的方法_java

直译过来就是倒计数(CountDown)门闩(Latch).倒计数不用说,门闩的意思顾名思义就是阻止前进.在这里就是指 CountDownLatch.await() 方法在倒计数为0之前会阻塞当前线程. CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. CountDownLatch 的作用和 Thread.join() 方法类似,可用于一组线程和另外一组线程的协作.例如,主线程在做一项工作之前需要一系列的准备工作,只有这些准备工

我只好到这里问问题了,关于java多线程,已经怎样关线程

问题描述 我有个类继承了Jpanle,这个类里有自动创建线程的方法,而我新new这个类的时候原来的线程还存在.我不断new结果是线程只增不减问题就出来了,原来线程还在运行,导致显示出的效果非常差劲原来是多线程并发,我想关闭原来所有运行的线程 解决方案 首先,所谓关闭线程其实就是让Thread.run方法能正常结束,方法结束则线程会自动退出.很多程序会在run中执行一个死循环以达到守护线程的效果,在这种情况下如果你希望线程退出,那么比较好的方式就是想办法告诉这个循环"你可以退出了"比如:

java多线程编程之捕获子线程异常示例_java

通过try catch是无法捕获子线程异常的,Thread对象提供了setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法用来获取线程中产生的异常. 复制代码 代码如下: package threads; import java.lang.Thread.UncaughtExceptionHandler; public class TextException{  public static void main(String

java多线程中的异常处理机制简析_java

在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉.这一点是通过java.lang.Runnable.run()方法声明(因为此方法声明上没有throw exception部分)进行了约束.但是线程依然有可能抛出unchecked exception,当此类异常跑抛出时,线程就会终结,而对于主线程和其他线程完全不受影响,且完全感知不到某个线程抛出的异常(也是说完全无法catch到这个异常

超详细的Java多线程教程

<一>概述.定义任务 一.概述 为什么使用线程?从c开始,任何一门高级语言的默认执行顺序是"按照编写的代码的顺序执行",日常开发过程中写的业务逻辑,但凡不涉及并发的,都是让一个任务顺序执行以确保得到想要的结果.但是,当你的任务需要处理的业务比较多时,且这些业务前后之间没有依赖(比如, a执行的过程中b也可以执行,b没有必要必须等待a执行完毕再去执行),那么此时,我们可以将一个任务拆分成多个小任务. 例如,任务a负责接收键盘的输入,b负责将一些参数及计算提前做好(假设计算量比

java多线程 参数已经传入构造方法 进入run方法时参数却被改变

问题描述 java多线程 参数已经传入构造方法 进入run方法时参数却被改变 请教各位大神:我在for循环里面执行线程,遇到一个问题,代码如下:private static final ExecutorService executors = Executors.newScheduledThreadPool(10);......for(...){executors.execute(new PublishThread(map));}PublishThread实现了Runnable方法,它有一个私有成