2020/05/14 15:37
不胜感谢,解决了我多年的疑惑。
操作系统原理知识的重要性体现的淋漓尽致。
祝大牛事业有成,蒸蒸日上
2020/05/14 16:56
多谢夸赞,要不加一下我的公众号给我涨个粉😄
2019/07/01 17:26
写得很好,当时第一次读,感觉有收获,今天读了一遍感觉还是有收获。
博主的文章就像美酒,越发酵味更醇,真心希望博主多写点这类文章。
2019/07/02 09:16
2018/12/03 10:42

引用来自“文敦赋”的评论

大神,请教个问题!我的理解是OOM的原因是创建太多了的线程。标题中的:堆外内存 体现在哪个地方了?
堆外内存就是每个线程的stack
2018/12/03 10:20
大神,请教个问题!我的理解是OOM的原因是创建太多了的线程。标题中的:堆外内存 体现在哪个地方了?
2018/06/12 17:46

引用来自“我是无证程序员”的评论

你的思考很好,但是这样效率太低,在下传授一个快速定位和解决问题的方法给你。
1.先看看内存哪个对象占用的内存最多。
2.去项目里搜索创建这个对象的代码。
3.检查代码确认并解决问题。
仔细看文章,一开始用MAT就分析出了你说的那些,迅速定位到了代码。但是内存定量分析对不上,这个耗时才比较久。
2018/06/12 16:43
你的思考很好,但是这样效率太低,在下传授一个快速定位和解决问题的方法给你。
1.先看看内存哪个对象占用的内存最多。
2.去项目里搜索创建这个对象的代码。
3.检查代码确认并解决问题。
2018/06/12 11:30

引用来自“FeiMcdull”的评论

问题挺明显的,随着请求不断进来,thread根本不会回收(thread类似一个守护进程,但是thread没有setdeamon)。
值得学习的是楼主的问题定位和数据分析过程。

引用来自“无毁的湖光-Al”的评论

^_^,内存定量分析挺有意思

引用来自“FeiMcdull”的评论

其实问题解决方式直接将new thread设置为守护线程应该不会出现这种情况(setDaemon(true)),不知道楼主最后怎么解决的。理论上守护线程会连同其主线程(用户请求线程)消亡而消亡
这个cachedClient设计出来是为了复用的,被别人滥用了,后来不让他用这个类用一个不建线程的defaultClient就好了。
2018/06/12 11:24

引用来自“FeiMcdull”的评论

问题挺明显的,随着请求不断进来,thread根本不会回收(thread类似一个守护进程,但是thread没有setdeamon)。
值得学习的是楼主的问题定位和数据分析过程。

引用来自“无毁的湖光-Al”的评论

^_^,内存定量分析挺有意思
其实问题解决方式直接将new thread设置为守护线程应该不会出现这种情况(setDaemon(true)),不知道楼主最后怎么解决的。理论上守护线程会连同其主线程(用户请求线程)消亡而消亡
2018/06/12 10:47

引用来自“FeiMcdull”的评论

问题挺明显的,随着请求不断进来,thread根本不会回收(thread类似一个守护进程,但是thread没有setdeamon)。
值得学习的是楼主的问题定位和数据分析过程。
^_^,内存定量分析挺有意思
2018/06/12 10:42
问题挺明显的,随着请求不断进来,thread根本不会回收(thread类似一个守护进程,但是thread没有setdeamon)。
值得学习的是楼主的问题定位和数据分析过程。
2018/06/06 16:18

引用来自“卓sir”的评论

可以可以,好文
😄
2018/06/06 16:15
可以可以,好文
2018/05/22 11:10

引用来自“pain_7”的评论

1. 一般避免直接 new Thread
2. 在构造函数里面,new Thead 启动,应该会被内部类持有 this 引用吧,也不太好。可以在构造完成后调用启动,这样会不会好一些
只要线程在run,都不会被回收的
2018/05/22 11:08
1. 一般避免直接 new Thread
2. 在构造函数里面,new Thead 启动,应该会被内部类持有 this 引用吧,也不太好。可以在构造完成后调用启动,这样会不会好一些
2018/04/13 18:18

引用来自“苦苦奋斗的渣渣”的评论

构造方法里面new Thread也没有调用start方法啊
后面还有一堆代码,没贴上来,现在我改了一下,用省略号代替,最后会start一下
2018/04/13 18:05
构造方法里面new Thread也没有调用start方法啊
2018/01/16 21:42

引用来自“九州暮云”的评论

引用来自“无毁的湖光-Al”的评论

引用来自“九州暮云”的评论

你用jstack怎么看出多出来12563个线程?
jstack dump到一个文件里面,用sublime打开后搜索'Thread-'等关键字。也可以用shell,jstack pid > jstack.txt | grep 'Thread-' | wc -l 😄

回复@无毁的湖光-Al : 原来如此,受教
😄
2018/01/16 21:41

引用来自“无毁的湖光-Al”的评论

引用来自“九州暮云”的评论

你用jstack怎么看出多出来12563个线程?
jstack dump到一个文件里面,用sublime打开后搜索'Thread-'等关键字。也可以用shell,jstack pid > jstack.txt | grep 'Thread-' | wc -l 😄

回复@无毁的湖光-Al : 原来如此,受教
2018/01/16 19:17

引用来自“鳄鱼的眼泪”的评论

不使用一些常用的cache库,非要重新造轮子的必然效应

@鳄鱼的眼泪 ^_^
2018/01/16 19:11
不使用一些常用的cache库,非要重新造轮子的必然效应
2018/01/16 17:09

引用来自“zigzagroad”的评论

这里主要原因不是使用了new Thread创建新线程,而是在新创建线程中的run方法永远在执行,造成线程不能正常退出运行。

@zigzagroad ^_^
2018/01/16 17:03
这里主要原因不是使用了new Thread创建新线程,而是在新创建线程中的run方法永远在执行,造成线程不能正常退出运行。
2018/01/16 16:34

引用来自“东胜神洲”的评论

之前在看别人的代码时,每次看到 new Thread(),我都会觉得不舒服:不会 new 太多而爆了吗?。。只是一直没碰到过爆例,你这个实例非常好!。。前人之鉴,后人之师啊。。(拱手)受教受教了。
Thread运行完之后内存回收的,这边为什么一直存在,是由于run里面写了个无限循环,导致Thread一直在运行,回收不掉。
2018/01/16 16:31
之前在看别人的代码时,每次看到 new Thread(),我都会觉得不舒服:不会 new 太多而爆了吗?。。只是一直没碰到过爆例,你这个实例非常好!。。前人之鉴,后人之师啊。。(拱手)受教受教了。
2018/01/16 16:17

引用来自“市委书记李达康”的评论

牛逼
😄
2018/01/16 16:16
牛逼
2018/01/16 16:16

引用来自“天选老司机”的评论

上首页了,花哥牛逼😆
😄 哈哈
2018/01/16 16:14
上首页了,花哥牛逼😆
2018/01/16 15:51

引用来自“梁国强-java”的评论

厉害,关注了

@梁国强-java ^_^
2018/01/16 15:44
厉害,关注了
2018/01/16 15:04

引用来自“sulinixl”的评论

这不是“内存泄漏”,只是线程太多太浪费而已。这种问题jmap、jstack一看就明白,jstack输出上万个线程时候,就应该知道有问题。一般生产环境应用几百个线程就够多了,毕竟CPU核心就那么多,线程太多也没有意义,还凭空浪费资源。
下面的内存定量计算才是有意思的😄
2018/01/16 15:04
这不是“内存泄漏”,只是线程太多太浪费而已。这种问题jmap、jstack一看就明白,jstack输出上万个线程时候,就应该知道有问题。一般生产环境应用几百个线程就够多了,毕竟CPU核心就那么多,线程太多也没有意义,还凭空浪费资源。
2018/01/16 14:16

引用来自“Jamson丶”的评论

生产系统上一直有个类似的问题,就是随着请求增加,线程也会增加,到了GC了就会被删掉回落,周而复始。排查了一轮还没处理好,不知道大佬你有没有什么想法?
如果用的tomcat可以设定tomcat本身的最大线程数。如果是业务线程的话,不要自己new Thread,用线程池,同时设定最大线程数。
2018/01/16 14:13
生产系统上一直有个类似的问题,就是随着请求增加,线程也会增加,到了GC了就会被删掉回落,周而复始。排查了一轮还没处理好,不知道大佬你有没有什么想法?
2018/01/16 13:53

引用来自“hyuan”的评论

讲到linux知识这块就不太懂了😂
看看ulk就懂了😄
2018/01/16 13:43
讲到linux知识这块就不太懂了😂
2018/01/16 13:00

引用来自“糖果先生”的评论

这种定时任务可以用Concurrent 的sdk写啊,写在构造函数里,不挂才怪,代码review的时候就应该发现这样的问题。

@糖果先生 本来就是想让别人用单例模式用的 没想到拿来new了
2018/01/16 12:56
这种定时任务可以用Concurrent 的sdk写啊,写在构造函数里,不挂才怪,代码review的时候就应该发现这样的问题。
2018/01/16 12:19

引用来自“一生做恶”的评论

过程挺屌,但是好像没治本呢

@一生做恶 修改方案很简单 就是用了个不创建thread的DefaultBnsClient类 所以没写出来
2018/01/16 12:10
过程挺屌,但是好像没治本呢
2018/01/16 11:40

引用来自“开源中国首席圣杯守护者Saber”的评论

请问是用什么工具查看分析的?
jstack、MAT以及smaps,博客里面都有写
2018/01/16 11:40

引用来自“Ryan-瑞恩”的评论

楼主,,,你使用 JProfile 看看堆外。
线上机器没有JProfile😄
2018/01/16 11:40

引用来自“dxbj1010”的评论

看来写多线程代码的地方都需要注意啊
是啊😄
2018/01/16 11:37
请问是用什么工具查看分析的?
2018/01/16 11:35
楼主,,,你使用 JProfile 看看堆外。
2018/01/16 11:34
看来写多线程代码的地方都需要注意啊
2018/01/16 11:22

引用来自“风车361”的评论

受教了
😄
2018/01/16 11:21
受教了
2018/01/16 11:07

引用来自“光脚满地跑”的评论

高并发场景下使用这种方式实现定时调度,看了想砍人哎,new出来2.8w个线程放在那里,想哭
😄 问题找到解决就行了
2018/01/16 10:24

引用来自“晕dows”的评论

为什么我用firefox,chrome,ie,都看不到评论...
顺便看一下我自己的能不能看到...
现在能看到了吗?
2018/01/16 10:24

引用来自“unknown”的评论

分析过程受教了,出现问题的代码是太烂了
写代码的人不了解内部的实现,就拿来用了😄
2018/01/16 10:24

引用来自“black83”的评论

牛批
😄
2018/01/16 10:24

引用来自“九州暮云”的评论

你用jstack怎么看出多出来12563个线程?
jstack dump到一个文件里面,用sublime打开后搜索'Thread-'等关键字。也可以用shell,jstack pid > jstack.txt | grep 'Thread-' | wc -l 😄
2018/01/16 10:22

引用来自“淘淘我的小宝宝”的评论

大秀一番GC和fork肌肉,没对业务代码特别是sleep的深深忏悔,不怕中断吗,美中不足。望海涵。
sleep是必须的,不然早在OOM之前,应用就会被线程调度卡的不行。你说的不怕中断是指?
2018/01/16 10:21

引用来自“阿信sxq”的评论

厉害,能弱弱的问一下,这个怎么修改吗,因为这里有一个类似的问题
在这种用完即弃的情况就不需要新建内存自动刷新了。原本CachedBnsClient是DefaultBnsClient一个增强,其增强点就是这个无限循环线程。所以我们直接用DefaultBnsClient替换就行了,DefaultBnsClient内部没有new Thread。😄
2018/01/16 10:19

引用来自“淘淘我的小宝宝”的评论

大秀一番GC和fork肌肉,没对业务代码特别是sleep的深深忏悔,不怕中断吗,美中不足。望海涵。
😄
2018/01/16 10:18

引用来自“爱喝貓的咖啡”的评论

又一个跪在new Thread()上的。。。Java thread所用内存是jvm向os额外申请的,直到进程结束前不释放,所以不停的new Thread(),jvm早晚会挂。
线程退出了就释放了,我这里没释放的原因是由于写了了无限循环,导致线程不能退出,才导致内存泄露。
2018/01/16 10:06
为什么我用firefox,chrome,ie,都看不到评论...
顺便看一下我自己的能不能看到...
2018/01/16 10:02
分析过程受教了,出现问题的代码是太烂了
2018/01/16 09:40
牛批
2018/01/16 09:29

引用来自“爱喝貓的咖啡”的评论

又一个跪在new Thread()上的。。。Java thread所用内存是jvm向os额外申请的,直到进程结束前不释放,所以不停的new Thread(),jvm早晚会挂。

线程退出时,就可以被释放了
2018/01/16 09:27
你用jstack怎么看出多出来12563个线程?
2018/01/16 09:23
又一个跪在new Thread()上的。。。Java thread所用内存是jvm向os额外申请的,直到进程结束前不释放,所以不停的new Thread(),jvm早晚会挂。
2018/01/16 08:58
厉害,能弱弱的问一下,这个怎么修改吗,因为这里有一个类似的问题
2018/01/12 11:26

引用来自“harryxue12”的评论

体现了new Thread()带来的坑,如果他不sleep 那么久的话,可能能更早的发现问题。
😄
2018/01/12 11:09
体现了new Thread()带来的坑,如果他不sleep 那么久的话,可能能更早的发现问题。
2018/01/10 23:18

引用来自“爱宝贝丶”的评论

写的很好👍👍👍

@爱宝贝丶 ^_^
2018/01/10 23:10
写的很好👍👍👍
2018/01/10 10:07

引用来自“NoSuchMan”的评论

66666 菜鸟的我以前也看过博主的 其他问题排查的 文章 总结的非常到位 受教了

@NoSuchMan ^_^
2018/01/10 10:04
66666 菜鸟的我以前也看过博主的 其他问题排查的 文章 总结的非常到位 受教了
2018/01/10 09:18

引用来自“开源中国首席董事长”的评论

牛逼。项目禁止 直接new Thread(); 特别是并发特别高的。

@开源中国首席董事长 ^_^
2018/01/10 09:14
牛逼。项目禁止 直接new Thread(); 特别是并发特别高的。
2018/01/09 15:59

引用来自“周胜”的评论

博主大牛,特来膜拜
多谢胜哥😄
2018/01/09 15:59
666666666
2018/01/09 15:59
博主大牛,特来膜拜
2018/01/09 08:01

引用来自“马进举”的评论

牛逼,我也有个看着有点像的问题,明天这样去排查看看,不过是win2008

@马进举 ^_^
2018/01/09 00:47
牛逼,我也有个看着有点像的问题,明天这样去排查看看,不过是win2008
回复 @
{{emojiItem.symbol}}
返回顶部
顶部