@@ -39,30 +39,30 @@ $ show-busy-java-threads.sh
3939The stack of busy(57.0%) thread(23355/0x5b3b) of java process(23269) of user(admin):
4040" pool-1-thread-1" prio=10 tid=0x000000005b5c5000 nid=0x5b3b runnable [0x000000004062c000]
4141 java.lang.Thread.State: RUNNABLE
42- at java.text.DateFormat.format(DateFormat.java:316)
43- at com.xxx.foo.services.common.DateFormatUtil.format(DateFormatUtil.java:41)
44- at com.xxx.foo.shared.monitor.schedule.AppMonitorDataAvgScheduler.run(AppMonitorDataAvgScheduler.java:127)
45- at com.xxx.foo.services.common.utils.AliTimer$2 .run(AliTimer.java:128)
46- at java.util.concurrent.ThreadPoolExecutor$Worker .runTask(ThreadPoolExecutor.java:886)
47- at java.util.concurrent.ThreadPoolExecutor$Worker .run(ThreadPoolExecutor.java:908)
48- at java.lang.Thread.run(Thread.java:662)
42+ at java.text.DateFormat.format(DateFormat.java:316)
43+ at com.xxx.foo.services.common.DateFormatUtil.format(DateFormatUtil.java:41)
44+ at com.xxx.foo.shared.monitor.schedule.AppMonitorDataAvgScheduler.run(AppMonitorDataAvgScheduler.java:127)
45+ at com.xxx.foo.services.common.utils.AliTimer$2 .run(AliTimer.java:128)
46+ at java.util.concurrent.ThreadPoolExecutor$Worker .runTask(ThreadPoolExecutor.java:886)
47+ at java.util.concurrent.ThreadPoolExecutor$Worker .run(ThreadPoolExecutor.java:908)
48+ at java.lang.Thread.run(Thread.java:662)
4949
5050The stack of busy(26.1%) thread(24018/0x5dd2) of java process(23269) of user(admin):
5151" pool-1-thread-2" prio=10 tid=0x000000005a968800 nid=0x5dd2 runnable [0x00000000420e9000]
5252 java.lang.Thread.State: RUNNABLE
53- at java.util.Arrays.copyOf(Arrays.java:2882)
54- at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
55- at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:572)
56- at java.lang.StringBuffer.append(StringBuffer.java:320)
57- - locked < 0x00000007908d0030> (a java.lang.StringBuffer)
58- at java.text.SimpleDateFormat.format(SimpleDateFormat.java:890)
59- at java.text.SimpleDateFormat.format(SimpleDateFormat.java:869)
60- at java.text.DateFormat.format(DateFormat.java:316)
61- at com.xxx.foo.services.common.DateFormatUtil.format(DateFormatUtil.java:41)
62- at com.xxx.foo.shared.monitor.schedule.AppMonitorDataAvgScheduler.run(AppMonitorDataAvgScheduler.java:126)
63- at com.xxx.foo.services.common.utils.AliTimer$2 .run(AliTimer.java:128)
64- at java.util.concurrent.ThreadPoolExecutor$Worker .runTask(ThreadPoolExecutor.java:886)
65- at java.util.concurrent.ThreadPoolExecutor$Worker .run(ThreadPoolExecutor.java:908)
53+ at java.util.Arrays.copyOf(Arrays.java:2882)
54+ at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
55+ at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:572)
56+ at java.lang.StringBuffer.append(StringBuffer.java:320)
57+ - locked < 0x00000007908d0030> (a java.lang.StringBuffer)
58+ at java.text.SimpleDateFormat.format(SimpleDateFormat.java:890)
59+ at java.text.SimpleDateFormat.format(SimpleDateFormat.java:869)
60+ at java.text.DateFormat.format(DateFormat.java:316)
61+ at com.xxx.foo.services.common.DateFormatUtil.format(DateFormatUtil.java:41)
62+ at com.xxx.foo.shared.monitor.schedule.AppMonitorDataAvgScheduler.run(AppMonitorDataAvgScheduler.java:126)
63+ at com.xxx.foo.services.common.utils.AliTimer$2 .run(AliTimer.java:128)
64+ at java.util.concurrent.ThreadPoolExecutor$Worker .runTask(ThreadPoolExecutor.java:886)
65+ at java.util.concurrent.ThreadPoolExecutor$Worker .run(ThreadPoolExecutor.java:908)
6666...
6767```
6868
@@ -92,31 +92,75 @@ The stack of busy(26.1%) thread(24018/0x5dd2) of java process(23269) of user(adm
9292### 用法
9393
9494``` bash
95- # 查找当前目录下所有Jar中的重复类的jar
96- show-duplicate-java-classes.py
95+ # 查找当前目录下所有Jar中的重复类
96+ show-duplicate-java-classes
9797
98- # 查找当前目录下所有Jar中的重复类的Jar
99- show-duplicate-java-classes.py -v
98+ # 查找指定目录下所有Jar中的重复类
99+ show-duplicate-java-classes path/to/lib/dir
100100
101- # 查找当前目录及其子目录下所有Jar中的重复类
102- show-duplicate-java-classes.py -r
101+ # 查找多个指定Class目录下的重复类
102+ show-duplicate-java-classes path/to/lib/dir1 /path/to/lib/dir2
103103
104- # 查找当前目录下所有Jar中的重复类,排除指定的一些Jar,使用glob匹配
105- show-duplicate-java-classes.py -e ' *spring*.jar' --excludes ' *apache*.jar'
106-
107- # 查找当前目录下所有Jar中的重复类,结果到html文件中,包含Jar中重复类的明细
108- show-duplicate-java-classes.py --html
104+ # 查找指定Class目录和指定目录下所有Jar中的重复类的jar
105+ show-duplicate-java-classes -c path/to/classes/dir1 -c path/to/classes/dir2 path/to/lib/dir1 /path/to/lib/dir2
109106```
110107
111108### 示例
112109
113110``` bash
114- $ show-duplicate-java-classes.py
115- [' ./ace4j-servicemgr-inner-api-0.0.1-20141223.031744-27.jar' , ' ./ace4j-servicemgr-inner-impl-0.0.1-20141223.031744-27.jar' ]
116- [' ./ace4j-servicemgr-impl-0.0.1-SNAPSHOT.jar' , ' ./ace4j-servicemgr-inner-impl-0.0.1-20141223.031744-27.jar' ]
117- ......
111+ $ show-duplicate-java-classes WEB-INF/lib
112+ $ show-duplicate-java-classes -c WEB-INF/classes WEB-INF/libFound duplicate classes in below class path:
113+ 1 (293@2): WEB-INF/lib/sourceforge.spring-2.5.6.SEC02.jar WEB-INF/lib/sourceforge.spring.modules.orm-2.5.6.SEC02.jar
114+ 2 (2@3): WEB-INF/lib/servlet-api-3.0-alpha-1.jar WEB-INF/lib/jsp-api-2.1-rev-1.jar WEB-INF/lib/jstl-api-1.2-rev-1.jar
115+ 3 (104@2): WEB-INF/lib/commons-io-2.2.jar WEB-INF/lib/jakarta.commons.io-2.0.jar
116+ 4 (6@3): WEB-INF/lib/jakarta.commons.logging-1.1.jar WEB-INF/lib/commons-logging-1.1.1.jar WEB-INF/lib/org.slf4j.jcl104-over-slf4j-1.5.6.jar
117+ 5 (344@2): WEB-INF/lib/sourceforge.spring-2.5.6.SEC02.jar WEB-INF/lib/sourceforge.spring.modules.context-2.5.6.SEC02.jar
118+ ...
119+
120+ ================================================================================
121+ Duplicate classes detail info:
122+ ================================================================================
123+ 1 (293@2): WEB-INF/lib/sourceforge.spring-2.5.6.SEC02.jar WEB-INF/lib/sourceforge.spring.modules.orm-2.5.6.SEC02.jar
124+ 1 org/springframework/orm/toplink/TopLinkTemplate$1 3.class
125+ 2 org/springframework/orm/hibernate3/HibernateTemplate$2 4.class
126+ 3 org/springframework/orm/jpa/vendor/HibernateJpaDialect.class
127+ 4 org/springframework/orm/hibernate3/TypeDefinitionBean.class
128+ 5 org/springframework/orm/hibernate3/SessionHolder.class
129+ ...
130+ 2 (2@3): WEB-INF/lib/servlet-api-3.0-alpha-1.jar WEB-INF/lib/jsp-api-2.1-rev-1.jar WEB-INF/lib/jstl-api-1.2-rev-1.jar
131+ 1 javax/servlet/ServletException.class
132+ 2 javax/servlet/ServletContext.class
133+ 3 (104@2): WEB-INF/lib/commons-io-2.2.jar WEB-INF/lib/jakarta.commons.io-2.0.jar
134+ 1 org/apache/commons/io/input/ProxyReader.class
135+ 2 org/apache/commons/io/output/FileWriterWithEncoding.class
136+ 3 org/apache/commons/io/output/TaggedOutputStream.class
137+ 4 org/apache/commons/io/filefilter/NotFileFilter.class
138+ 5 org/apache/commons/io/filefilter/TrueFileFilter.class
139+ ...
140+ ...
118141
119- $ show-duplicate-java-classes.py --html > result.html
142+ ================================================================================
143+ class paths to find:
144+ ================================================================================
145+ 1 : WEB-INF/lib/sourceforge.spring.modules.context-2.5.6.SEC02.jar
146+ 2 : WEB-INF/lib/misc.htmlparser-0.0.0.jar
147+ 3 : WEB-INF/lib/normandy.client-1.0.2.jar
148+ 4 : WEB-INF/lib/xml.xmlgraphics__batik-css-1.7.jar-1.7.jar
149+ 5 : WEB-INF/lib/jakarta.ecs-1.4.2.jar
150+ ...
151+
152+ $ show-duplicate-java-classes WEB-INF/lib
153+ COOL! No duplicate classes found!
154+
155+ ================================================================================
156+ class paths to find:
157+ ================================================================================
158+ 1 : WEB-INF/lib/sourceforge.spring.modules.context-2.5.6.SEC02.jar
159+ 2 : WEB-INF/lib/misc.htmlparser-0.0.0.jar
160+ 3 : WEB-INF/lib/normandy.client-1.0.2.jar
161+ 4 : WEB-INF/lib/xml.xmlgraphics__batik-css-1.7.jar-1.7.jar
162+ 5 : WEB-INF/lib/jakarta.ecs-1.4.2.jar
163+ ...
120164```
121165
122166### 贡献者
@@ -344,9 +388,9 @@ tcp-connection-state-counter.sh
344388
345389``` bash
346390$ tcp-connection-state-counter.sh
347- ESTABLISHED 290
348- TIME_WAIT 212
349- SYN_SENT 17
391+ ESTABLISHED 290
392+ TIME_WAIT 212
393+ SYN_SENT 17
350394```
351395
352396:beer : [ parseOpts.sh] ( parseOpts.sh )
@@ -401,13 +445,13 @@ source /path/to/parseOpts.sh
401445
402446parseOpts " a,a-long|b,b-long:|c,c-long+" -a -b bv --c-long c.sh -p pv -q qv arg1 \; aa bb cc
403447# 可以通过下面全局变量来获得解析的参数值:
404- # _OPT_VALUE_a = true
405- # _OPT_VALUE_a_long = true
406- # _OPT_VALUE_b = bv
407- # _OPT_VALUE_b_long = bv
408- # _OPT_VALUE_c = (c.sh -p pv -q qv arg1) ,数组类型
409- # _OPT_VALUE_c_long = (c.sh -p pv -q qv arg1) ,数组类型
410- # _OPT_ARGS = (aa bb cc) ,数组类型
448+ # _OPT_VALUE_a = true
449+ # _OPT_VALUE_a_long = true
450+ # _OPT_VALUE_b = bv
451+ # _OPT_VALUE_b_long = bv
452+ # _OPT_VALUE_c = (c.sh -p pv -q qv arg1) ,数组类型
453+ # _OPT_VALUE_c_long = (c.sh -p pv -q qv arg1) ,数组类型
454+ # _OPT_ARGS = (aa bb cc) ,数组类型
411455```
412456
413457` -- ` 的使用效果示例:
@@ -418,13 +462,13 @@ source /path/to/parseOpts.sh
418462
419463parseOpts " a,a-long|b,b-long:|c,c-long+" -a -b bv -- --c-long c.sh -p pv -q qv arg1 \; aa bb cc
420464# 可以通过下面全局变量来获得解析的参数值:
421- # _OPT_VALUE_a = true
422- # _OPT_VALUE_a_long = true
423- # _OPT_VALUE_b = bv
424- # _OPT_VALUE_b_long = bv
425- # _OPT_VALUE_c 没有设置过
426- # _OPT_VALUE_c_long 没有设置过
427- # _OPT_ARGS = (--c-long c.sh -p pv -q qv arg1 ';' aa bb cc) ,数组类型
465+ # _OPT_VALUE_a = true
466+ # _OPT_VALUE_a_long = true
467+ # _OPT_VALUE_b = bv
468+ # _OPT_VALUE_b_long = bv
469+ # _OPT_VALUE_c 没有设置过
470+ # _OPT_VALUE_c_long 没有设置过
471+ # _OPT_ARGS = (--c-long c.sh -p pv -q qv arg1 ';' aa bb cc) ,数组类型
428472```
429473
430474### 兼容性
0 commit comments