java句柄数过多解决办法

java句柄数过多解决办法

使用file-leak-detector指定为应用程序的javaagent,然后重启程序,通过file-leak-detector提供能力,可以查看句柄和线程名称的信息,可直接排查出是哪行代码问题

包下载地址:http://search.maven.org/remotecontent?filepath=org/kohsuke/file-leak-detector/1.13/file-leak-detector-1.13-jar-with-dependencies.jar

git地址:https://github.com/jenkinsci/lib-file-leak-detector

file-leak-detector启动
前置条件

两种方式,必须是在同一台机器

第一种方式(需要重启)

和项目一起启动

shell 复制代码
#查看入参解释
java -javaagent:/data/file-leak-detector.jar=http=19999,trace=/data/tracefile.log -jar project.jar
第二种方式(无需重启,但只能看到当前时间以后创建的句柄)

直接启动,并将要监控的jvm虚拟机PID指定为入参

shell 复制代码
java -jar path/to/file-leak-detector-jar-with-dependencies.jar PID  http=19999
  • PID使用需要监听的java程序进程id替换!
  • 注意这种方式,只会监控到新创建的句柄,之前的无法检测到
file-leak-detector入参解释
  1. 多个入参可以使用','隔开
shell 复制代码
http=19999,trace=/data/tracefile.log
  1. http表示启动一个mini web服务,可以通过指定端口访问
  2. trace表示开启和关闭句柄打印日志信息,打印到指定地址
file-leak-detector的使用

如果生产环境19999端口未开放,可以使用curl命令查看句柄信息

shell 复制代码
#查看全部句柄信息
curl localhost:19999
#只看每个句柄的第一行
curl localhost:19999 | grep "by thread:"
#查看每个句柄的前两行和首行
curl localhost:19999 | grep -A 2 "by thread:"
#其他命令
curl  localhost:19999 | grep "socket channel by" | wc -l
curl  localhost:19999 | grep "selector by" | wc -l
curl  localhost:19999 | grep "selector by\|socket channel by"
#样例
#4 selector by thread:Kafka-LagCheck1 on Tue Jan 09 11:24:01 CST 2024
        at java.nio.channels.spi.AbstractSelector.<init>(AbstractSelector.java:86)
        at sun.nio.ch.SelectorImpl.<init>(SelectorImpl.java:54)
        at sun.nio.ch.EPollSelectorImpl.<init>(EPollSelectorImpl.java:64)
        at sun.nio.ch.EPollSelectorProvider.openSelector(EPollSelectorProvider.java:36)
        at java.nio.channels.Selector.open(Selector.java:227)
        at org.apache.kafka.common.network.Selector.<init>(Selector.java:160)
        at org.apache.kafka.common.network.Selector.<init>(Selector.java:214)
        at org.apache.kafka.common.network.Selector.<init>(Selector.java:227)
        at org.apache.kafka.common.network.Selector.<init>(Selector.java:231)
        at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:749)
        at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:666)
        at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:646)
其它获得句柄数方式
shell 复制代码
#查看句柄数详情
lsof -p PID
#统计某个PID句柄数
lsof -p  PID|wc -l
更多内容请参考:https://github.com/BaoPiao/blog
相关推荐
Remember_9931 天前
Java 工厂方法模式:解耦对象创建的优雅方案
java·开发语言·python·算法·工厂方法模式
小楼v1 天前
使用Nacos实现动态IP黑名单过滤
java·后端·微服务·nacos
A懿轩A1 天前
【Java 基础编程】Java 运算符完全指南:算术/关系/逻辑/位运算与优先级,避免常见坑
java·开发语言
时艰.1 天前
Java 并发编程核心知识点
java·开发语言
雾削木1 天前
使用 ESPHome 的核心指令
java·前端·javascript·单片机·嵌入式硬件
Dylan的码园1 天前
深入浅出Java排序:从基础算法到实战优化(下)
java·算法·排序算法
中二病码农不会遇见C++学姐1 天前
文明6 Mod制作核心组件关系解密:从XML到游戏的奇幻漂流
java·运维·服务器·游戏
我爱娃哈哈1 天前
SpringBoot + ResponseBodyEmitter 实时异步流式推送:告别轮询,让数据推送更高效
java·spring boot·后端
白宇横流学长1 天前
基于 SpringBoot 的足球俱乐部管理系统设计与实现【源码+文档】
java·spring boot·后端
电商API&Tina1 天前
唯品会获得vip商品详情 API 返回值说明
java·大数据·开发语言·数据库·人工智能·spring