java defunct产生的原因和解决办法

java defunct产生的原因和解决办法:

在很多时候,我们启动JAVA进程后,如果退出这个JAVA进程,在系统进程中仍然可以看到这个进程.
这种情况一般出现在UNIX/LINUX系统,对于WIN平台出现情况较少.

这个进程在UNIX平台上,你即使kill进程号也不能杀掉它,但它仍然占用系统资源,成了真正的"僵尸"。

产生的原因:
以前我们下载JDK时,可以下载到JDK的SRC然后自己编译,现在的官方网站上已经找不到可以自己编
译的JDK包,下载回来的JDK都是释放包,我们可以想象,无论SUN在发布JDK时考虑得如何完美,本地
库都不可能完全和当前系统的版本号完全一致。举个例子,假如System.gc()调用了本地库glic6.0.2.so
那么在当前系统上没有这个版本的库或没有这个版本的库的链结,那么gc()方法肯定不能正确工作。
当然sun在发布的时候可能会把这个本地库打包在JDK发行包中,但glic6.0.2.so中又调用了其它库,如
subglic6.0.21.so,即使系统中存在完全相同的glic6.0.2.so,但你无法确认它调用的库又完全匹配,
事实上这几乎是不可能完全匹配的。

正是这样本地库版本号的不一致,才使得需要调用本地库的JVM底层功能不能正确工作,所以清除,
退出进程等工作就可能无法完成,产生了java defunct。

知道了问题的原因,就能从多方面解决了。如果我们的JDK的src版进行编译安装而不是用SUN提供好的
本地库,当然不会存在上面的问题,但现在好象已经不提供src编译安装的发布包了,所以指定内核版本
号,以便使它和JDK发布时使用的版本相一致,可以基本解决java defunct。

假如你不知道当前JDK的本地库是基于什么内核版本号发布的,一般来说,应该提供系统当前的内核版本号:

在Linux下,先查看当前的内核版本:
uname -r
2.4.21-4.EL
把主版本号COPY下来,调用:
LD_ASSUME_KERNEL=2.4.21-4
export LD_ASSUME_KERNEL

如果你知道某个版本的JDK中的本地库是基于某个内核版本发而布的那你可以直接指定LD_ASSUME_KERNEL为
这个版本,这样会获得最大的一致性
[root@xran-cudu0808-0 scripts]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 4996 1684 ? Ss 01:24 0:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep infinity root 7 0.0 0.0 6848 2996 pts/0 Ss 02:18 0:00 bash root 26 0.0 0.0 6848 2772 pts/1 Ss+ 02:18 0:00 bash root 44 0.0 0.0 6848 2992 pts/2 Ss+ 02:18 0:00 bash root 293 0.0 0.0 0 0 pts/0 Z< 02:21 0:00 [odsNameServer] <defunct> root 296 0.2 0.0 0 0 pts/0 Z< 02:21 0:05 [xranOamCtrl] <defunct> root 300 0.0 0.0 0 0 pts/0 Z 02:21 0:00 [python3] <defunct> root 317 0.0 0.0 0 0 pts/0 Z< 02:21 0:00 [pmon.sh] <defunct> root 390 0.1 0.0 0 0 pts/0 Z 02:21 0:02 [xranUpCtrl] <defunct> root 398 0.0 0.0 0 0 pts/0 Z< 02:21 0:01 [xranGnbCtrl] <defunct> root 407 0.0 0.0 0 0 pts/0 Z< 02:21 0:01 [xranCellCtrl] <defunct> root 452 0.0 0.0 0 0 pts/0 Z< 02:22 0:00 [xranProxyCtrl] <defunct> root 459 0.1 0.0 0 0 pts/0 Z 02:22 0:02 [xranDuCtrl] <defunct> root 1808 0.0 0.0 0 0 pts/0 Z< 02:25 0:00 [sleep] <defunct> root 2059 0.0 0.0 0 0 pts/0 Z< 02:34 0:00 [odsNameServer] <defunct> root 2062 0.4 0.0 0 0 pts/0 Z< 02:34 0:04 [xranOamCtrl] <defunct> root 2066 0.0 0.0 0 0 pts/0 Z 02:34 0:00 [python3] <defunct> root 2083 0.0 0.0 0 0 pts/0 Z< 02:34 0:00 [pmon.sh] <defunct> root 2156 0.2 0.0 0 0 pts/0 Z 02:34 0:02 [xranUpCtrl] <defunct> root 2164 0.1 0.0 0 0 pts/0 Z< 02:34 0:01 [xranGnbCtrl] <defunct> root 2173 0.1 0.0 0 0 pts/0 Z< 02:34 0:01 [xranCellCtrl] <defunct> root 2218 0.0 0.0 0 0 pts/0 Z< 02:34 0:00 [xranProxyCtrl] <defunct> root 2225 0.3 0.0 0 0 pts/0 Z 02:34 0:03 [xranDuCtrl] <defunct> root 4608 0.0 0.0 0 0 pts/0 Z< 02:38 0:00 [sleep] <defunct> root 4869 0.1 0.0 0 0 pts/0 Z< 02:38 0:00 [odsNameServer] <defunct> root 4872 0.6 0.0 0 0 pts/0 Z< 02:38 0:05 [xranOamCtrl] <defunct> root 4876 0.1 0.0 58972 47248 pts/0 S 02:38 0:00 python3 manage.py runserver -h 0.0.0.0 -p 8400 root 4893 0.2 0.0 0 0 pts/0 Z< 02:38 0:01 [pmon.sh] <defunct> root 4961 1.0 0.0 0 0 pts/0 Z 02:38 0:08 [xranUpCtrl] <defunct> root 4974 0.2 0.0 0 0 pts/0 Z< 02:39 0:02 [xranGnbCtrl] <defunct> root 4983 0.3 0.0 0 0 pts/0 Z< 02:39 0:02 [xranCellCtrl] <defunct> root 5028 0.0 0.0 0 0 pts/0 Z< 02:39 0:00 [xranProxyCtrl] <defunct> root 5035 1.5 0.0 0 0 pts/0 Z 02:39 0:12 [xranDuCtrl] <defunct> root 17783 0.0 0.0 0 0 pts/0 Z< 02:52 0:00 [sleep] <defunct> root 17789 0.0 0.0 11536 3068 pts/0 R+ 02:52 0:00 ps aux [root@xran-cudu0808-0 scripts]# cat kill.sh #!/bin/bash # 查找所有以 cmcc 开头的进程,排除 grep 进程 processes=$(ps aux | grep '[x]ran' | awk '{print $2}') # 如果找到进程 if [ -n "$processes" ]; then echo "找到以下以 XRAN 开头的进程,正在终止它们:" echo "$processes" # 遍历进程ID并死每个进程 for pid in $processes; do kill -9 $pid echo "已终止进程: $pid" done else echo "没有找到以 xran 开头的进程。" fi [root@xran-cudu0808-0 scripts]#
最新发布
08-13
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值