设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间20 现在时间20 缓存数据 和聪明人交流,和靠谱的人恋爱,和进取的人共事,和幽默的人随行。晚安!

和聪明人交流,和靠谱的人恋爱,和进取的人共事,和幽默的人随行。晚安!

查看: 1354|回复: 1

Java频繁创建线程排查和解决方案

[复制链接]

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:15
  • 打卡月天数:0
  • 打卡总奖励:215
  • 最近打卡:2023-08-27 10:31:59
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
29
主题
25
精华
0
金钱
310
积分
66
注册时间
2023-8-13
最后登录
2025-9-8

发表于 2025-2-20 02:59:58 | 显示全部楼层 |阅读模式
目录
  • 产生原因
  • Java 服务器可以跑多少个线程
  • Java 线程多影响内存吗
  • java线程占多大的内存,占哪里的内存
    • 占多大的内存
    • 占哪里的内存
  • 总结

    产生原因

    因为编译工具突然报错,需要手动创建线程池,之前都是用ExecutorService直接创建的线程池用的封装好的,但是阿里巴巴规范不让用,网上找了个代码copy导致创建的线程池无法关闭,暂时没关注原因,解决的话还是使用ExecutorService的注入类,并且配置好线程池参数,而不去new线程池,也不要随缘关闭线程池,引发了一些列知识点总结一下。

    Java 服务器可以跑多少个线程

    一台Java服务器能跑多少个线程?这个问题来自一次线上报警如下图,超过了我们的配置1200阈值产生了预警。

    1. [告警触发:1] thread_size Alerts Firing [critical] jvm当前活跃线程数超过1200, 当前值:1258, 描述: 当前活跃线程数已经超过1200 alertname:thread_size application:oldlu:gray exported_application:msun-ecg-app-ecg hospital:/人民 instance:10.9.2.155:30260 job:jvm_exporter notify:base r_cluster:eu0 severity:critical type:jvm 开始时间:2022-11-15 15:05:01
    复制代码

    共计1258个线程,和监控数据得出的吻合。但这个数量应该是大了,我们都知道线程多了,就会有线程切换,带来性能开销。

    当时就想到一台java服务器到底可以跑多少个线程呢?跟什么有关系?现整理如下。

    每个线程都有一个线程栈空间通过-Xss设置,查了一下我们服务器的关于jvm内存的配置

    1. -Xms4096m
    2. -Xmx4096m
    3. -XX:MaxPermSize=1024m1.2.3.
    复制代码

    只有这三个,并没有-Xss 和-XX:ThreadStackSize的配置,因此是走的默认值。几种JVM的默认栈大小

    1.png

    可以通过如下命令打印输出默认值的大小,命令:jinfo -flag ThreadStackSize

    1. [root@host-192-168-202-229 ~]#jinfo -flag ThreadStackSize 1807
    2. -XX:ThreadStackSize=10241.2.3.
    复制代码

    线程数量=(机器本身可用内存-JVM分配的堆内存)/Xss的值,比如我们的容器本身大小是8G,堆大小是4096M,走-Xss默认值,可以得出 最大线程数量:4096个。

    根据计算公式,得出如下结论:

    • 结论1:jvm堆越大,系统创建的线程数量越小。
    • 结论2:当-Xss的值越小,可生成线程数量越多。

    我们知道操作系统分配给每个进程的内存大小是有限制的,比如32位的Windows是2G。因此操作系统对一个进程下的线程数量是有限制的,不能无限的增多。经验值:3000-5000左右。

    刚才说的是不考虑系统限制的情况,那如果考虑系统限制呢,主要跟以下几个参数有关系

    • /proc/sys/kernel/pid_max 增大,线程数量增大,pid_max有最高值,超过之后不再改变,而且32,64位也不一样
    • /proc/sys/kernel/thread-max 系统可以生成最大线程数量
    • max_user_process(ulimit -u)centos系统上才有,没有具体研究
    • /proc/sys/vm/max_map_count 增大,数量增多

    线程是非常宝贵的资源,我们要严格控制线程的数量,象上面我们的截图情况,显然线程数量过多。这个是跟我们自己配置了fixed大小的线程池有关系。京东有自己的rpc框架jsf,里面可以针对每个服务端口设置线程大小。

    Java 线程多影响内存吗

    主要的影响如下:

    • 消耗时间:线程的创建和销毁都需要时间,当有大量的线程创建和销毁时,那么这些时间的消耗则比较明显,将导致性能上的缺失
    • 非常耗CPU和内存:大量的线程创建、执行和销毁是非常耗cpu和内存的,这样将直接影响系统的吞吐量,导致性能急剧下降,如果内存资源占用的比较多,还很可能造成OOM
    • 容易导致GC频繁的执行:大量的线程的创建和销毁很容易导致GC频繁的执行,从而发生内存抖动现象,而发生了内存抖动,对于移动端来说,最大的影响就是造成界面卡顿

    而针对上述所描述的问题,解决的办法归根到底就是:重用已有的线程,从而减少线程的创建。所以这就涉及到线程池(ExecutorService)的概念了,线程池的基本作用就是进行线程的复用,下面将具体介绍线程池的使用

    使用线程池管理线程的优点

    • 节省系统的开销:线程的创建和销毁由线程池维护,一个线程在完成任务后并不会立即销毁,而是由后续的任务复用这个线程,从而减少线程的创建和销毁,节约系统的开销
    • 节省时间:线程池旨在线程的复用,这就可以节约我们用以往的方式创建线程和销毁所消耗的时间,减少线程频繁调度的开销,从而节约系统资源,提高系统吞吐量
    • 提高性能:在执行大量异步任务时提高了性能
    • 方便控制:Java内置的一套ExecutorService线程池相关的api,可以更方便的控制线程的最大并发数、线程的定时任务、单线程的顺序执行等

    优先级线程池的优点

    从上面我们可以得知,创建一个优先级线程池非常有用,它可以在线程池中线程数量不足或系统资源紧张时,优先处理我们想要先处理的任务,而优先级低的则放到后面再处理,这极大改善了系统默认线程池以FIFO方式处理任务的不灵活

    java线程占多大的内存,占哪里的内存

    说到线程,我们往往想到的是线程安全、线程池,很少会去考虑线程的内存。

    那么一个线程占用多大的内存?占用哪里的内存呢?

    占多大的内存

    • jdk1.4默认的单个线程是占用256k的内存
    • jdk1.5+默认的单个线程是占用1M的内存
    • 可以通过-Xss参数设定,一般默认就好

    占哪里的内存

    这TM还用问?java线程当然是占用jvm的内存啊!

    好,我们做个实验,用jMeter同时并发调用java里某个接口200次,让java里增加大约190个线程(tomcat会有驻留线程,我这是10个),看下堆内存的情况:

    2.png

    从图中看到当线程猛增时,堆内存也猛增,然后堆内存会迅速下降,这是因为堆上new了大量的对象,所以猛增,然后线程执行完后,对象被GC了,所以下降。

    上面提到堆内存下降是因为线程执行完了,GC回收了new出来的对象。但从图中看出,堆内存下降后线程数并没有下降,这是为什么呢?

    用过线程池的都知道,线程执行完后并不会立即销毁掉,会有一个保活时间,保活时间过了后才会销毁 jdk1.8,每个线程占用1M内存,如果是占用的堆内存,那堆内存应该会增加190M左右,但从图中看并没有,所以线程不是占用的堆内存空间。

    实际上,java里每新起一个线程,jvm会向操作系统请求新起一个本地线程,此时操作系统会用空闲的内存空间来分配这个线程。所以java里线程并不会占用 jvm的内存空间,而是会占用操作系统空闲的内存空间,所以不会引起oom,占用的是堆外内存

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持晓枫资讯。


    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
    晓枫资讯-科技资讯社区-免责声明
    免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
          1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
          2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
          3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
          4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
          5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
    http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

      离线 

    TA的专栏

    • 打卡等级:无名新人
    • 打卡总天数:1
    • 打卡月天数:0
    • 打卡总奖励:5
    • 最近打卡:2025-02-16 19:37:54
    等级头衔

    等級:晓枫资讯-列兵

    在线时间
    0 小时

    积分成就
    威望
    0
    贡献
    0
    主题
    0
    精华
    0
    金钱
    19
    积分
    4
    注册时间
    2024-9-20
    最后登录
    2025-2-16

    发表于 2025-10-18 14:17:35 | 显示全部楼层
    顶顶更健康!!!
    http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
    严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    1楼
    2楼

    手机版|晓枫资讯--科技资讯社区 本站已运行

    CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

    晓枫资讯--科技资讯社区

    本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

    如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表