鍦ㄤ嬌鐢ㄤ簩榪欑紪鏂囩珷涓彁鍒幫紝鍙互浠ユ眹鎬誨艦寮忔煡鐪嬫棩蹇楋紝涔熷彲浠ラ氳繃鍥捐〃鏉ユ煡鐪嬨?/span>Perf4j璺?/span>log4j闆嗘垚鍚庯紝鍏跺疄涔熷彲浠ヤ互鍥捐〃鐨勫艦寮忔潵鏌ョ湅鎬ц兘鐘跺喌銆?/span>
鎴戜滑榪欑瘒鏂囩珷榪樻槸浣跨敤鍓嶄竴綃囨枃绔犱腑鎻愬埌log4j.xml鐨勯厤緗紝鍏朵粬閮戒竴鏍鳳紝鍙槸鍦ㄩ厤緗腑鍔犲叆浜嗗浘琛ㄧ殑閰嶇疆錛?/span>
<!-- 鐢熸垚firstBlock,secondBlock鐨勫鉤鍧囧肩殑鍥捐〃 -->
<appender name="graphExecutionTimes"
class="org.perf4j.log4j.GraphingStatisticsAppender">
<!-- GraphType:Mean錛堝鉤鍧囧鹼級, Min錛堟渶灝忓鹼級, Max錛堟渶澶у鹼級, TPS錛堟瘡縐掍簨鍔℃暟錛?/span> -->
<param name="GraphType" value="Mean"/>
<param name="TagNamesToGraph" value="firstBlock,secondBlock"/>
<appender-ref ref="graphsFileAppender"/>
</appender>
<!-- 鐢熸垚firstBlock,secondBlock鐨?/span>tps鐨勫浘琛?/span> -->
<appender name="graphExecutionTPS"
class="org.perf4j.log4j.GraphingStatisticsAppender">
<param name="GraphType" value="TPS"/>
<param name="TagNamesToGraph" value="firstBlock,secondBlock"/>
<appender-ref ref="graphsFileAppender"/>
</appender>
<!-- 璁板綍鍥捐〃鐢熸垚url鐨?/span>log鏂囦歡 -->
<appender name="graphsFileAppender" class="org.apache.log4j.FileAppender">
<param name="File" value="/home/perfGraphs.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n"/>
</layout>
</appender>
鍙﹀榪橀渶瑕佹敼涓涓湴鏂癸紝灝辨槸CoalescingStatistics鐨勯厤緗細
<appender name="CoalescingStatistics"
class="org.perf4j.log4j.AsyncCoalescingStatisticsAppender">
<!--
TimeSlice閰嶇疆澶氬皯鏃墮棿闂撮殧鍘誨仛涓嬈℃眹鎬誨啓鍏ユ枃浠朵腑
榛樿鍊兼槸 30000 ms
-->
<param name="TimeSlice" value="10000"/>
<appender-ref ref="fileAppender"/>
<appender-ref ref="graphExecutionTimes"/>
<appender-ref ref="graphExecutionTPS"/>
</appender>
榛勮壊閭f閰嶇疆鐨勬剰鎬濆氨鏄妸鏃ュ織鍐欏叆鍒板浘琛ㄦ棩蹇楀幓銆?/span>
榪愯浠g爜Perf4JAppenderExample錛屾垜浠湪perfGraphs.log鏂囦歡涓敓鎴愪簡鍥捐〃鐨?/span>url錛?/span>
澶у鍙互鎶?/span>url鏀懼埌嫻忚鍣ㄨ闂笅銆?/span>
涓婇潰榪欑鏂瑰紡鍛紝闇瑕佽嚜宸辯櫥褰曞埌鏈嶅姟鍣ㄤ笂錛屾壘鍒?/span>log鏂囦歡錛屽湪鏀懼埌嫻忚鍣ㄤ腑鏌ョ湅錛屾葷殑榪囩▼榪樻槸姣旇緝楹葷儲銆傚鏋滃ぇ瀹墮渶瑕佺洃鎺х殑宸ョ▼鏄竴涓?/span>web宸ョ▼鐨勮瘽錛岄偅灝辨洿鏂逛究浜嗭紝鐩存帴閰嶇疆涓涓?/span>servlet鏉ユ煡鐪嬨?/span>Web.xml鐨勯厤緗涓嬶細
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>perf4j</servlet-name>
<servlet-class>org.perf4j.log4j.servlet.GraphingServlet</servlet-class>
<!-- graphExecutionTimes鍜?/span>graphExecutionTPS灝辨槸鎴戜滑鍦?/span>log4j涓厤緗殑鍚嶇О -->
<init-param>
<param-name>graphNames</param-name>
<param-value>graphExecutionTimes,graphExecutionTPS</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>perf4j</servlet-name>
<url-pattern>/perf4j</url-pattern>
</servlet-mapping>
</web-app>
澶у鍙互鎵撳寘宸ョ▼錛屽茍鏀懼埌web鏈嶅姟鍣ㄤ笅鍚姩錛岀劧鍚庤闂笅/perf4j榪欎釜uri銆?/span>
Maven鏈変竴涓?/span>jetty鎻掍歡錛屽彲浠ユ柟渚垮惎鍔?/span>web宸ョ▼錛屽彧瑕佸ぇ瀹跺湪pom.xml鏂囦歡涓姞鍏ュ涓嬮厤緗細
<plugins>
<!-- jetty鎻掍歡, 璁懼畾绔彛涓?/span>context path-->
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
</plugin>
</plugins>
鍦ㄦ帶鍒跺彴涓緭鍏ワ細mvn jetty:run錛屽嵆鍙傜渷鍘諱簡鎵撳寘鍙戝竷錛屽緢鐪佸績鍠斻?/span>
絎竴嬈$敤http://localhost:8080/perf4j璁塊棶鏌ョ湅鍥捐〃鐨勬椂鍊欐病鏈夌敓鎴愪換浣曚笢瑗匡紝閭f槸鍥犱負鍐呭瓨涓病鏈夋敹闆嗗埌鏈鏂扮殑鎬ц兘鏁版嵁銆傛墍浠ユ垜鍦?/span>index.jsp閲岃皟鐢ㄤ笅浠ヤ究浜х敓鎬ц兘鏁版嵁銆傜劧鍚庨噸鏂拌闂紝榪欎釜鏃跺欏氨鏈夊浘琛ㄧ敓鎴愪簡銆?/span>
Perf4j鏈涓昏鐨勪竴涓ソ澶勫氨鏄彲浠ヨ窡log4j鎴栬卨ogback鏉ユц兘鍒嗘瀽鍜岀洃鎺х嚎涓婅繍琛岀殑紼嬪簭銆傞泦鎴愮殑鏂瑰紡涓昏鏄細鑷畾涔塴og4j鐨刟ppenders閫氳繃鏍囧噯鐨勯厤緗姞鍏ュ埌log4j涓幓錛堝悗闈細鏈夐厤緗殑渚嬪瓙錛夈傛湁涓涓娉ㄦ剰鐨勫湴鏂瑰氨鏄渶瑕佷嬌鐢╨og4j鐨?.2.14鐗堟湰鎴栬呮洿楂樼増鏈傜敱浜庢垜涓鑸兘鏄嬌鐢╨og4j錛屾墍浠ュ浜巐ogback鐨勯泦鎴愭垜灝變笉鎻忚堪浜嗭紝鎴戣寰楀簲璇ュ樊涓嶅鐨勩?/span>
Perf4j鏈閲嶈鐨刟ppender灝辨槸AsyncCoalescingStatisticsAppender錛屽畠浼氭妸涓孌墊椂闂村唴StopWatch鐨勪俊鎭眹鎬誨埌涓涓嫭绔嬬殑GroupedTimingStatistics鏃ュ織淇℃伅錛岀劧鍚庢妸榪欎釜鐙珛鐨勪俊鎭紶緇欎笅娓哥殑appenders錛屾瘮濡俧ileappenders錛岃繖鏍峰氨鍙互鍐欏埌鏂囦歡涓幓浜嗐備篃鍙互浼犵粰per4j鐨勫叾浠栬嚜瀹氫箟appenders銆?/span>
鎺ヤ笅鏉ユ垜浠湅涓涓猯og4j.xml鐨勪緥瀛愶紝鏈変竴涓檺鍒訛紝濡傛灉瑕佷嬌鐢ˋsyncCoalescingStatisticsAppender灝卞彧鑳戒嬌鐢▁ml鏂囦歡鑰屼笉鑳戒嬌鐢╬roperties鏂囦歡銆?/span>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="false" xmlns:log4j="http://jakarta.apache.org/log4j/">
<!--
閰嶇疆鎺у埗鍙拌緭鍑?/span>
-->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %c{1} - %m%n"/>
</layout>
</appender>
<!-- Perf4J appenders -->
<!--
AsyncCoalescingStatisticsAppender鏀墮泦StopWatch鐨勬棩蹇椾俊鎭茍浼犻佸埌涓嬫父鐨勬枃浠?/span>appenders銆?/span>
-->
<appender name="CoalescingStatistics"
class="org.perf4j.log4j.AsyncCoalescingStatisticsAppender">
<!--
TimeSlice閰嶇疆澶氬皯鏃墮棿闂撮殧鍘誨仛涓嬈℃眹鎬誨啓鍏ユ枃浠朵腑
榛樿鍊兼槸 30000 ms
-->
<param name="TimeSlice" value="10000"/>
<appender-ref ref="fileAppender"/>
</appender>
<!-- 鎶婃眹鎬葷殑perf4j鐨勬棩蹇椾俊鎭啓鍒?/span>perfStats.log鏂囦歡涓幓 -->
<appender name="fileAppender" class="org.apache.log4j.FileAppender">
<param name="File" value="/home/perfStats.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n"/>
</layout>
</appender>
<!-- Loggers -->
<!--
閰嶇疆perf4j logger
Additivity璁劇疆鎴?/span>false涓昏鍥犱負鏄笉鎯寵浠g爜榪愯鏃墮棿鐨勬棩蹇楄緭鍑虹粰涓婃父appenders錛屽嵆涓嶈鍦ㄦ帶鍒跺彴杈撳嚭銆?/span>
-->
<logger name="org.perf4j.TimingLogger" additivity="false">
<level value="INFO"/>
<appender-ref ref="CoalescingStatistics"/>
</logger>
<!--
Root logger鎵撳嵃鎵鏈夋棩蹇楋紝浣嗕笉鍖呭惈perf4j鐨勪俊鎭傚師鍥犳槸鍦?/span>TimingLogger閰嶇疆涓緗簡additivity涓?/span>false
-->
<root>
<level value="INFO"/>
<appender-ref ref="console"/>
</root>
</log4j:configuration>
榛勮壊鑳屾櫙鏄痯erf4j鐨勯厤緗俊鎭傚叾浠栭兘鏄痩og4j鐨勫熀鏈厤緗備笅闈㈡槸嫻嬭瘯perf4j涓巐og4j闆嗘垚鐨勪唬鐮併?/span>
package com.baowu.perf4j;
import org.apache.log4j.Logger;
import org.perf4j.StopWatch;
import org.perf4j.log4j.Log4JStopWatch;
public class Perf4JAppenderExample {
public static void main (String[] args) throws Exception {
Logger rootLogger = Logger.getRootLogger();
for (int i = 0; i < 10; i++) {
// Log4JStopWatch榛樿浣跨敤org.perf4j.TimingLogger榪欎釜綾?/span>
StopWatch stopWatch = new Log4JStopWatch();
//妯℃嫙浠g爜榪愯鏃墮棿
Thread.sleep((long) (Math.random() * 1000L));
//鎵撳嵃鍒版帶鍒跺彴
rootLogger.info("Normal logging messages only go to the console");
stopWatch.lap("firstBlock");
Thread.sleep((long) (Math.random() * 2000L));
stopWatch.stop("secondBlock");
}
}
}
榪愯浠g爜銆?/span>
鎺у埗鍙拌緭鍑猴細
INFO root - Normal logging messages only go to the console
INFO root - Normal logging messages only go to the console
INFO root - Normal logging messages only go to the console
INFO root - Normal logging messages only go to the console
INFO root - Normal logging messages only go to the console
INFO root - Normal logging messages only go to the console
INFO root - Normal logging messages only go to the console
INFO root - Normal logging messages only go to the console
INFO root - Normal logging messages only go to the console
INFO root - Normal logging messages only go to the console
鏂囦歡杈撳嚭錛?/span>
杈撳嚭鏍煎紡涔熷彲浠ユ敼鎴?/span>CSV鏍煎紡銆傞厤緗細
<appender name="fileAppender" class="org.apache.log4j.FileAppender">
<param name="File" value="/home/perfStats.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n"/>
</layout>
</appender>
org.apache.log4j.PatternLayout鏀規垚org.perf4j.log4j.StatisticsCsvLayout鍗沖彲銆?/span>
鍏蜂綋鐨勫弬鏁拌鏌ョ湅api銆?br />涓嬭澆宸ョ▼
Perf4j浣跨敤涓涓昏婕旂ず浜嗘ц兘鐩戞帶鐨勬棩蹇楃洿鎺ユ墦鍗板湪鏍囧噯杈撳嚭嫻併傞偅涔堜嬌鐢ㄤ簩鍛㈠垯涓昏鏉ユ紨紺烘庝箞鏉ュ垎鏋愭墦鍗板嚭鏉ョ殑鏃ュ織鏂囦歡銆?/span>
鐢變簬鎴戜滑榪樻病鏈夎窡log4j闆嗘垚錛屾棩蹇楁枃浠舵墦鍗板湪鏍囧噯杈撳嚭嫻侊紝鎴戜滑闇瑕佹妸鏍囧噯杈撳嚭嫻侀噸瀹氬悜鍒?/span>times.log鏂囦歡涓傞噸瀹氬悜鏈変袱縐嶆柟寮忥細鐩存帴copy鍒版枃浠朵腑錛屾垨鑰呭湪eclipse閲屾寚瀹氫笅杈撳嚭鏂囦歡銆傛垜涓昏鏄敤eclipse鎸囧畾杈撳嚭鏂囦歡銆?/span>
鐒跺悗榪愯浠g爜錛?/span>Perf4j浣跨敤涓鐨?/span>Example.java錛夛紝鎺у埗鍙頒細鍦ㄧ涓鍙ヨ瘽涓墦鍑?/span>[Console output redirected to file:E:\yangpingyu\work\times.log]錛岃繖鏍瘋繍琛岀殑緇撴灉浼氬悓鏃舵墦鍗板湪鏂囦歡涓拰鏍囧噯杈撳嚭涓?/span>
鏈変簡times.log錛屾垜浠氨鍙互瀵規棩蹇楁枃浠惰繘琛屽垎鏋愶紝浠ユ壘鍑烘湁闂鐨勪唬鐮併?/span>
鍒嗘瀽鏃ュ織鍛戒護錛?/span>
E:\yangpingyu\work>java -jar perf4j-0.9.16.jar times.log
浠?/span>csv鐨勬牸寮忔潵鏌ョ湅緇撴灉錛屽懡浠ゅ涓嬶細
java -jar perf4j-0.9.16.jar -f csv times.log
浠ヤ笂閮芥槸浠ユ枃鏈殑鏍煎紡榪涜杈撳嚭錛屼絾鏂囨湰娌℃湁鍥捐〃鏇村叿鏈夎〃杈懼姏銆傛墍浠ユ妸緇撴灉浠ュ浘琛ㄥ艦寮忚緭鍑烘槸蹇呬笉鍙皯錛屽垢濂?/span>perf4j涔熸敮鎸侊紝鍛戒護濡備笅錛?/span>
java -jar perf4j-0.9.16.jar --graph perfGraphs.html times.log
鎵ц鍛戒護鍚庯紝鍦ㄦ帶鍒跺彴杈撳嚭鐩稿簲鐨勭粺璁′俊鎭紝鐩稿簲鐨勫湪紓佺洏涓婁篃鐢熸垚浜嗕竴涓?/span>html錛?/span>html閲屽寘鍚鉤鍧囧煎浘琛ㄥ拰tps鍥捐〃銆?/span>
<html>
<head><title>Perf4J Performance Graphs</title></head>
<body>
<br/><br/><img src="http://chart.apis.google.com/chart?cht=lxy&chtt=Mean&chs=750x400&chxt=x,x,y&chd=t:0.0,50.0,100.0|56.3,60.1,6.0|0.0,50.0|88.5,94.5|50.0,100.0|43.2,7.2|0.0,50.0,100.0|71.8,57.4,8.0|0.0,50.0,100.0|100.0,61.2,59.6|0.0,50.0,100.0|63.9,62.0,18.7|0.0,50.0,100.0|34.4,72.1,30.1&chco=ff0000,00ff00,0000ff,00ffff,ff00ff,ffff00,000000&chm=d,ff0000,0,-1,5.0|d,00ff00,1,-1,5.0|d,0000ff,2,-1,5.0|d,00ffff,3,-1,5.0|d,ff00ff,4,-1,5.0|d,ffff00,5,-1,5.0|d,000000,6,-1,5.0&chdl=codeBlock1|codeBlock2.failure|codeBlock2.success|codeBlock3|codeBlock4|codeBlock5|codeBlock6&chxr=2,0,748.5&chxl=0:|18:12:00|18:12:30|18:13:00|1:|Time&chxp=0,0.0,50.0,100.0|1,50&chg=50.0,10"/>
<br/><br/><img src="http://chart.apis.google.com/chart?cht=lxy&chtt=TPS&chs=750x400&chxt=x,x,y&chd=t:0.0,50.0,100.0|36.4,90.9,9.1|0.0,50.0|27.3,63.6|50.0,100.0|36.4,9.1|0.0,50.0,100.0|36.4,90.9,9.1|0.0,50.0,100.0|36.4,90.9,9.1|0.0,50.0,100.0|36.4,90.9,9.1|0.0,50.0,100.0|27.3,100.0,9.1&chco=ff0000,00ff00,0000ff,00ffff,ff00ff,ffff00,000000&chm=d,ff0000,0,-1,5.0|d,00ff00,1,-1,5.0|d,0000ff,2,-1,5.0|d,00ffff,3,-1,5.0|d,ff00ff,4,-1,5.0|d,ffff00,5,-1,5.0|d,000000,6,-1,5.0&chdl=codeBlock1|codeBlock2.failure|codeBlock2.success|codeBlock3|codeBlock4|codeBlock5|codeBlock6&chxr=2,0,0.4&chxl=0:|18:12:00|18:12:30|18:13:00|1:|Time&chxp=0,0.0,50.0,100.0|1,50&chg=50.0,10"/>
</body></html>
浠ヤ笂鏄?/span>html鐨勫唴瀹癸紝閲岄潰鏈閲嶈鐨勪俊鎭氨鏄袱涓?/span>img鏍囩錛岄噷闈㈠叿浣撶殑鍥劇墖鏄?/span>google chart api鐢熸垚銆傚彲浠ユ墦寮html鐩存帴鏌ョ湅鍥捐〃銆?/span>
濡傛灉鎯寵鐪嬫洿璇︾粏鐨勫弬鏁幫紝鍙互浣跨敤—help鏉ユ煡鐪嬨?/span>java -jar perf4j-0.9.16.jar –help銆?/span>
濡傛灉澶у浣跨敤鐨勬槸maven宸ョ▼錛岄偅涔堢幇鍦?/span>pom鏂囦歡涓姞鍏?/span>perf4j鐨勪緷璧栥?/span>
<dependency>
<groupId>org.perf4j</groupId>
<artifactId>perf4j</artifactId>
<version>0.9.16</version>
<scope>compile</scope>
</dependency>
濡傛灉鐢ㄧ殑鏄櫘閫氬伐紼嬶紝閭d箞鐩存帴涓嬭澆jar鍖呮斁鍏?/span>lib鐩綍涓嬪嵆鍙?/span>
渚嬪瓙錛?/span>
package com.baowu.per4j;
import org.perf4j.LoggingStopWatch;
import org.perf4j.StopWatch;
public class Example1 {
public static void main(String[] args) throws InterruptedException{
method1();
method2();
method3();
}
/**
* 鐩戞帶涓澶勪唬鐮佺ず渚?/span>
* @throws InterruptedException
*/
private static void method1() throws InterruptedException{
//鍒涘緩涓涓洃鎺у璞★紝榪欓噷浣跨敤LoggingStopWatch錛屽畠鏄妸緇撴灉鐩存帴杈撳嚭鍒版帶鍒跺彴銆傛垜浠篃鍙互
//浣跨敤StopWatch鐨勫叾浠栧瓙綾伙紝姣斿錛?/span>Log4JStopWatch錛?/span>CommonsLogStopWatch銆備笉榪囪繖浜涘瓙綾婚渶
//瑕佸伐紼嬩嬌鐢ㄦ棩蹇楁鏋?/span>
StopWatch stopWatch = new LoggingStopWatch("codeBlock1");
//榪欓噷灝辨槸涓浜涢渶瑕佺洃鎺х殑浠g爜錛屾垜浠懡鍚嶄負codeBlock1
//浣跨敤綰跨▼浼戠湢鏄負浜嗘ā鎷熶唬鐮佹墽琛屾椂闂?/span>
Thread.sleep((long)(Math.random() * 1000L));
//鍋滄璁$畻浠g爜鎬ц兘
stopWatch.stop();
}
/**
* 涓涓柟娉曞鍑轟唬鐮佺洃鎺?/span>
* @throws InterruptedException
*/
private static void method2() throws InterruptedException{
StopWatch stopWatch = new LoggingStopWatch();
Thread.sleep((long)(Math.random() * 1000L));
stopWatch.lap("codeBlock3");
Thread.sleep((long)(Math.random() * 1000L));
stopWatch.lap("codeBlock4");
Thread.sleep((long)(Math.random() * 1000L));
stopWatch.lap("codeBlock5");
Thread.sleep((long)(Math.random() * 1000L));
stopWatch.stop("codeBlock6");
}
/**
* stop鏂規硶鍙互鍔犲叆涓浜涜鏄庝俊鎭?/span>
*/
private static void method3(){
StopWatch stopWatch = new LoggingStopWatch();
try {
// the code block being timed - this is just a dummy example
long sleepTime = (long)(Math.random() * 1000L);
Thread.sleep(sleepTime);
if (sleepTime > 500L) {
throw new Exception("Throwing exception");
}
stopWatch.stop("codeBlock2.success", "Sleep time was < 500 ms");
} catch (Exception e) {
stopWatch.stop("codeBlock2.failure", "Exception was: " + e);
}
}
}
榪愯緇撴灉錛?/span>
start[1334457619937] time[355] tag[codeBlock1]
start[1334457620296] time[152] tag[codeBlock3]
start[1334457620453] time[138] tag[codeBlock4]
start[1334457620593] time[598] tag[codeBlock5]
start[1334457621187] time[700] tag[codeBlock6]
start[1334457621890] time[619] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception]
Perf4j涓昏鐨勭敤閫旀槸璁¢噺浠g爜鎬ц兘鍜屽垎鏋愭ц兘鏁版嵁銆?/span>
涓轟粈涔堣浣跨敤榪欎釜宸ュ叿鍛紵鎴戜滑鍙互鑱旀兂涓嬫渶鏃╂湡java寮鍙戣呰皟璇曚唬鐮佷嬌鐢ㄧ殑鏂瑰紡錛屼互鍓嶆病鏈夋棩蹇楁鏋訛紝閭?/span>java寮鍙戝氨浣跨敤System.out.println()鏉ヨ緭鍑鴻嚜宸辨兂鏌ョ湅鐨勫彉閲忋備絾鏄繖鏍烽」鐩笂綰跨殑璇濓紝灝辮鍘繪帀榪欎簺鎵撳嵃璇彞浠ュ噺灝戞ц兘褰卞搷銆傞偅涓囦竴鍦ㄧ嚎涓婂嚭闂浜嗭紝璋冭瘯鍝噷鍑洪棶棰樺氨寰堥夯鐑︼紝鍥犱負娌℃湁杈撳嚭鐨勬棩蹇楀彲鏌ャ傛墍浠ュ悗鏉ユ湁浜哄紑鍙戜簡鏃ュ織妗嗘灦錛岄氳繃鏃ュ織綰у埆鎺у埗鏃ュ織鐨勮緭鍑恒?/span>
綾諱技鐨勶紝濡傛灉娌℃湁perf4j錛屾垜浠湪鏌ョ湅浠g爜榪愯鏃墮棿鐨勮瘽鍙互鐢ㄤ互涓嬩唬鐮佹潵瀹炵幇錛?/span>
long start = System.currentTimeMillis();
// execute the block of code to be timed
System.out.println("ms for block n was: " + (System.currentTimeMillis() - start));
榪欑鏂瑰紡鏈夊嚑涓己鐐癸細
1銆?nbsp;榪欑鏂瑰紡杈撳嚭鍐呭姣旇緝鍗曚竴錛屽氨鏄唬鐮佹葷殑榪愯鏃墮棿銆備絾鏄垜浠唬鐮侀渶瑕佹煡鐪嬬殑鎬ц兘鎸囨爣鏈夋洿澶氾紝姣斿鎬葷殑騫沖潎鍊鹼紝鏈灝忓鹼紝鏈澶у鹼紝tps絳夌瓑銆?/span>
2銆?nbsp;涔熻鎴戜滑鐨勪唬鐮佸湪綰夸笂榪愯錛屾垜浠兂鎶婅繖浜涘奸氳繃鍥捐〃鐨勫艦寮忓睍紺哄嚭鏉ャ傛垨鑰呮妸榪欎簺鍐呭閫氳繃jmx杈撳嚭銆?/span>
3銆?nbsp;鍙﹀錛屾垜浠彲鑳芥妸perf4j璺?/span>log4j錛?/span>slf4j絳夋棩蹇楁鏋跺拰鏃ュ織闂ㄩ潰緋葷粺鏁村悎璧鋒潵銆?/span>
鍩轟簬浠ヤ笂榪欎簺闂錛屾墍浠ュ紑婧愮ぞ鍖哄氨鍑虹幇浜?/span>perf4j錛堜漢澶氬姏閲忓ぇ錛岀ぞ鍖虹殑鍔涢噺灝辨槸寮哄ぇ錛夈?/span>
Perf4j涓浜涚壒鎬э細
l 綆鍗曠殑鍋滄鏌ョ湅鏈哄埗鏉ヨ綆楄鍙ユ椂闂存秷鑰楄緭鍑恒?/span>
l 鍛戒護琛岃В鏋?/span>log鏂囦歡浜х敓姹囨繪暟鎹拰鍥捐〃銆?/span>
l 綆鍗曠殑闆嗘垚鏃ュ織妗嗘灦鍜岄棬闈㈡鏋躲?/span>
l 鑷畾涔?/span>log4j鍜?/span>logback鐨?/span>appenders鏉ヤ駭鐢熸暟鎹拰鍥捐〃銆?/span>
l 閫氳繃jmx鏌ョ湅鎬ц兘鎸囨爣錛屽茍鏍規嵁闃堝煎彂閫佹秷鎭?/span>
l Web宸ョ▼鍙互閫氳繃servlet鏉ヨ緭鍑烘ц兘鎸囨爣銆?/span>
l Perf4j鍙互鍜?/span>aop絳夊垏闈㈡鏋舵暣鍚堣搗鏉ヨ緭鍑烘ц兘鎸囨爣銆?/span>
l Perf4j鏄竴涓彲鎵╁睍鐨勬灦鏋勩?/span>
鍏徃鏈榪戜弗鎶撹蔣浠惰川閲忛棶棰橈紝鎴戞娊絀轟簡瑙d簡涓嬫彁楂樹唬鐮佽川閲忕殑涓浜涘紑婧愬伐鍏楓傚叾涓竴涓氨鏄?/span>findbugs銆備嬌鐢?/span>findbugs鏈夊緢澶氭柟寮忥紝姣斿錛氬畨瑁?/span>eclipse findbugs鎻掍歡錛岄氳繃maven璋冪敤鐢熸垚鎶ュ憡銆備粖澶╀富瑕佹紨紺轟笅maven涓?/span>findbugs闆嗘垚銆?/span>
絎竴姝ワ細涓嬭澆maven錛屾垜浣跨敤鐨勬槸maven3銆傛妸maven鐨勫懡浠ゅ姞鍏?/span>PATH鐜鍙橀噺銆?/span>
絎簩姝ワ細鍒涘緩涓涓櫘閫氱殑maven java宸ョ▼銆傚懡浠ゅ涓嬶細mvn archetype:maven-archetyp-quickstart –DgroupId=com.tianya –DartifactId=baowu銆傚鏋滄甯告墽琛岀殑璇濅細鐢熸垚濡備笅緇撴瀯鐨勪竴涓伐紼嬨?/span>
絎笁姝ワ細鎴戜滑鐪嬩笅pom鏂囦歡
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tianya</groupId>
<artifactId>baowu</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<!--閰嶇疆鎻掍歡鏉ユ簮 -->
<pluginRepositories>
<pluginRepository>
<id>Codehaus repository</id>
<url>http://repository.codehaus.org/</url>
</pluginRepository>
</pluginRepositories>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<!-- <configLocation>${basedir}/springside-findbugs.xml</configLocation> -->
<threshold>High</threshold>
<effort>Default</effort>
<findbugsXmlOutput>true</findbugsXmlOutput>
<!-- findbugs xml杈撳嚭璺緞--> <findbugsXmlOutputDirectory>target/site</findbugsXmlOutputDirectory>
</configuration>
</plugin>
</plugins>
</build>
</project>
鎴戞潵瑙i噴涓?/span>xml閰嶇疆錛?/span>
l 閰嶇疆鎻掍歡涓嬭澆鍦板潃
<!--閰嶇疆鎻掍歡鏉ユ簮 -->
<pluginRepositories>
<pluginRepository>
<id>Codehaus repository</id>
<url>http://repository.codehaus.org/</url>
</pluginRepository>
</pluginRepositories>
l 鐢變簬maven鏍稿績鍋氱殑浜嬫儏閮芥槸鎶借薄鐨勬瀯寤鴻繃紼嬶紝寰堝瀹為檯鐨勫伐浣滈兘鏄叿浣撶殑鎻掍歡鏉ュ疄鐜般傛墍浠ュ緢鏄劇劧錛?/span>maven浠ユ彃浠剁殑鏂瑰紡闆嗘垚findbugs銆?/span>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<!-- <configLocation>${basedir}/springside-findbugs.xml</configLocation> -->
<!-- findbugs xml杈撳嚭--> <findbugsXmlOutput>true</findbugsXmlOutput>
<!-- findbugs xml杈撳嚭璺緞--> <findbugsXmlOutputDirectory>target/site</findbugsXmlOutputDirectory>
</configuration>
</plugin>
l 澶у娉ㄦ剰鍒頒簡findbugs鎻掍歡閲岋紝鎴戞敞閲婃帀浜嗕竴鍙ヨ瘽錛屽叾瀹炶繖鍙ヨ瘽灝辨槸鍙互浣跨敤鑷繁鐨?/span>fingbugs閰嶇疆鏉ュ仛媯鏌ャ傛垜鐢ㄧ殑鏄?/span>springside鐨勪竴涓?/span>xml鏂囦歡銆?/span>
絎洓姝ワ細閰嶇疆濂界浉鍏蟲枃浠朵箣鍚庯紝鎺ヤ笅鏉ュ氨鏄墽琛岀浉鍏沖懡浠や簡銆?/span>
mvn compile findbugs:findbugs鐢熸垚鎶ュ憡銆傛姤鍛婄敓鎴愮殑鍦板潃灝辨槸${欏圭洰鏍圭洰褰?/span>}/target/site銆備篃鍙互閫氳繃mvn findbugs:gui gui鐣岄潰鏌ョ湅findbugs鐨?/span>report銆?/span>
浠庡鏍℃瘯涓氬埌宸ヤ綔宸茬粡2騫村崐鏃墮棿浜嗭紝鍦ㄨ眴鐡c佸綋褰撱佷含涓滃拰浜氱帥閫婁笂鍏蟲敞浜嗗緢澶氫功綾嶏紝涔熸瘮杈冨枩嬈㈤涗功搴椼傚綋鐒朵拱浜嗗緢澶氬拰鐪嬩簡閮ㄥ垎錛岃嚜宸卞閲屽緢澶氫功榪樻病鐪嬶紙浜虹被鐨勬儼鎬э紝鍊熷彛錛夈傚湪榪欎袱騫村崐鏃墮棿鍐咃紝璧頒簡涓浜涘集璺紝鎵浠ユ兂鎬葷粨涓嬭嚜宸辯殑瀛︿範鐢熸動銆?/span>
姣曚笟鐨勬椂鍊欏幓浜嗕竴瀹跺垱涓氬瀷鐨勪簰鑱旂綉鍏徃錛屽湪榪欏鍏徃娌℃湁浠諱綍鍩硅鏈哄埗錛屼換浣曚笢瑗塊兘闇瑕侀潬鑷繁鏉ユ崏鎽搞傛牴鎹伐浣滈渶瑕佺湅浜?/span>struts2錛?/span>spring錛?/span>hibernate錛?/span>jstl錛?/span>jsp錛?/span>servlet絳変竴浜?/span>J2EE鐩稿叧緇勪歡鐨勪功鍜岃祫鏂欍備粎闈犺繖浜涙妧鏈篃鑳芥惌寤哄嚭涓涓鍚堜駭鍝佺殑緗戠珯銆傛帴瑙﹀埌infoq緗戠珯涔嬪悗錛屼簡瑙d簡涓浜涘ぇ鍨嬬綉绔欑殑鏋舵瀯鍙樿縼絳夋妧鏈紝鍦ㄤ竴騫寸殑鏃墮棿鍐呬笉鏂拷瀵昏繖浜涗笉絎﹀悎鑷繁鐩墠闇瑕佺殑鎶鏈紝鍏呭叾閲忓氨鏄紑闃斾簡鑷繁鎶鏈殑鐪肩晫銆傜敱浜庝簰鑱旂綉鍏徃鐨勪竴浜涘姡鍔匡紝瀵艱嚧鎴戞湁浜嗚煩妲界殑鎯蟲硶錛屼絾鏄嚭鍘婚潰璇曚箣鍚庯紝鎵嶇煡閬撹嚜宸辨槸浜曞簳涔嬭洐銆傝嚜宸變篃綆楃儹鐖辨妧鏈紝涔熺畻鍔姏瀛︿範鍜岀爺絀剁殑錛岃嚜宸卞弽鎬濆拰鎬葷粨浜嗕竴涓嬶細涓嶆敞閲嶅熀紜銆?/span>
閭d箞瀛︿範浠涔堟墠綆楀熀紜鍛紵鎴戜富瑕佸垪涓句笅鎴戠殑瀛︿範涔﹀崟錛?/span>
ü 璁$畻鏈哄熀紜錛氫換浣曡蔣浠惰繍琛岀殑鍩虹銆?/span>
ü 鎿嶄綔緋葷粺錛氱‖浠剁鐞嗙殑杞歡錛屾垜浠殑搴旂敤杞歡涓昏渚濊禆浜庢搷浣滅郴緇熴?/span>
n 楦熷摜鐨?/span>Linux縐佹埧鑿?/span> 鍩虹瀛︿範綃?/span>
ü 鏁版嵁緇撴瀯錛氳蔣浠?/span>=鏁版嵁緇撴瀯+綆楁硶銆傚叾瀹炴搷浣滅郴緇熻蔣浠跺拰搴旂敤杞歡閮藉湪澶ч噺搴旂敤鏁版嵁緇撴瀯銆?/span>
ü 緗戠粶錛氱郴緇熶竴瀹氶渶瑕佷笌澶栭儴浜や簰錛岄偅灝遍渶瑕佺綉緇溿?/span>
ü 鏁版嵁搴擄細瀛樺偍鏁版嵁銆?/span>
n MySQL 5 鏉冨▉鎸囧崡-(絎?/span>3鐗?/span>)
ü 杞歡宸ョ▼錛氬紑鍙戣蔣浠舵槸涓涓ぇ宸ョ▼錛岄渶瑕佹湁涓濂楃悊璁烘潵綆$悊杞歡寮鍙戙?/span>
n 杞歡宸ョ▼
ü 綆楁硶錛氬皻鏈帴瑙︺?/span>
ü Java鍩虹錛氬叿浣撶殑楂樼駭璇█錛屾渶濂界殑瀛︿範鍦版柟灝辨槸java鐨勫畼鏂圭綉绔欏拰寮婧愪唬鐮併?/span>
n Java緗戠粶緙栫▼(涓枃鐗?/span> 絎笁鐗?/span>)
ü Java榪涢樁錛氶潰鍚戝璞℃濇兂銆佽璁℃ā寮忓拰J2EE娣卞叆銆?/span>
n J2EE璁捐寮鍙戠紪紼嬫寚鍗?/span>錛?/span>Expert One-on-One J2EE Design and Development錛?/span>
n Expert One-on-One J2EE Development without EJB
瀛︿範浜嗚繖浜涘熀紜涔嬪悗錛屾垜浠湪鏉ヨ鍒嗗竷寮忥紝nosql錛屼簯璁$畻錛屼紒涓氶泦鎴愮瓑絳夈傚彧鏈夋帉鎻′簡鍩虹鎴戜滑鎵嶈兘鏇村ソ鐨勫垱鏂般?/span>
Java璇█涓?/span>c璇█鏈変竴涓潪甯擱噸瑕佺殑鍖哄埆灝辨槸錛氬唴瀛樼鐞嗘柟寮忕殑涓嶅悓錛?/span>java璇█鍐呭瓨綆$悊涓嶉渶瑕佺▼搴忓紑鍙戜漢鍛樺叧娉紝鑰?/span>c璇█鐨勫唴瀛樼殑璇鋒眰鍜岄噴鏀鵑兘鏄紑鍙戜漢鍛樻潵澶勭悊銆傝京璇佺殑鎬濈淮鏉ョ湅錛屼笉鍚屽唴瀛樼鐞嗗疄鐜版柟寮忔湁浼樼偣鍜岀己鐐癸紝鎵浠ヨ璦搴旂敤鐨勫満鏅紝鏁堢巼浼氭湁寰堝ぇ涓嶅悓銆?/span>
Jvm榪愯鏃剁殑鏁版嵁鍖哄煙涓昏鏈夛細紼嬪簭璁℃暟鍣ㄣ佽櫄鎷熸満鏍堛佹湰鍦版柟娉曟爤銆佹柟娉曞尯鍜屽爢銆傚叾涓▼搴忚鏁板櫒銆佽櫄鎷熸満鏍堝拰鏈湴鏂規硶鏍堟槸綰跨▼鐙韓錛岃屾柟娉曞尯鍜屽爢鏄墍鏈夌嚎紼嬪叡浜?/span>
ü 紼嬪簭璁℃暟鍣細jvm姣忎釜綰跨▼閮芥湁涓涓▼搴忚鏁板櫒銆傚湪浠諱竴鏃跺埢閮芥湁涓涓嚎紼嬬殑鏂規硶鍦ㄨ繍琛岋紝濡傛灉榪欎釜鏂規硶涓嶆槸鏈湴鏂規硶錛岄偅涔堢▼搴忚鏁板櫒瀛樻斁鐨勫氨鏄鍦ㄦ墽琛岀殑鎸囦護鍦板潃錛涘鏋滄槸鏈湴鏂規硶錛岄偅涔堢▼搴忚鏁板櫒涓瓨鏀劇殑鎸囧畾鍦板潃涓?/span>undefined銆?/span>
ü 铏氭嫙鏈烘爤錛氬綋jvm鍒涘緩涓涓嚎紼嬬殑鏃跺欏氨浼氫負綰跨▼鍒嗛厤涓涓櫄鎷熸満鏍堛備富瑕佺敤浜庡瓨鏀炬柟娉曠殑涓浜涙湰鍦板彉閲忓拰閮ㄥ垎緇撴灉錛屼竴鑸繖閲岀殑澶у皬閮芥槸鍥哄畾錛屼絾涓嶆槸緇濆銆備竴涓柟娉曠殑鎵ц鍒板畬鎴愬氨鏄爤鐨勫叆鏍堝拰鍑烘爤銆傚亣璁懼湪鏌愭柟娉曚腑瀹氫箟浜嗕竴涓璞?/span>Object obj=new Object();鍏朵腑obj鏄瓨鏀懼湪鏍堜笂錛岃?/span>new Object()鏄湪鍫嗕笂鍒嗛厤銆?/span>-Xss鍙互鎺у埗jvm铏氭嫙鏈烘爤鐨勫ぇ灝忋?/span>
ü 鏈湴鏂規硶鏍堬細澶т綋璺熻櫄鎷熸満鏍堢被浼鹼紝涓嶈繃鏄粰鏈湴鏂規硶浣跨敤鐨勩傝櫄鎷熸満鏍堝拰鏈湴鏂規硶鏍堝湪hotspot鏄病鏈夊垎寮瀹炵幇鐨勶紝鑰屾槸緇熺О涓烘爤銆?/span>
ü 鏂規硶鍖猴細涓昏瀛樻斁闈欐佸彉閲忥紝甯擱噺錛岀被鍔犺澆鍣ㄥ姞杞界殑綾葷瓑涓浜涗俊鎭?/span>
ü 鍫嗭細jvm緇濆ぇ閮ㄥ垎鐨勫璞″垎閰嶉兘鍦ㄥ爢涓婂垎閰嶃?/span>-Xmn –Xmx鏄帶鍒跺爢鏈灝忓煎拰鏈澶у鹼紝涓鑸爢鐨勫ぇ灝忓湪浣跨敤浜嗚秴榪?/span>mx璁懼畾鐨?/span>70%鐨勬椂鍊欙紝灝變細鑷姩鎵╁ぇ鍒版渶澶у鹼紝鎵浠ラ槻姝㈣繖縐嶆墿澶у拰緙╁皬鎴戜滑璁劇疆鎴愪竴鏍風殑鍊箋?/span>
ClassCastException綾誨瀷杞崲寮傚父錛屾槸涓涓繍琛屾椂寮傚父銆?/span>
闈炲父甯歌灝辨槸涓嶅悓綾誨瀷涔嬮棿鐨勫己鍒剁被鍨嬭漿鎹㈠氨浼氭姏鍑?/span>ClassCastException寮傚父銆傝繕鏈変竴縐嶅氨鏄笉鍚?/span>ClassLoader鍔犺澆鐨勭浉鍚岀殑綾誨瀷杞崲涔熶細鎶涘嚭ClassCastException銆傛帴涓嬫潵鎴戠敤浠g爜鏉ヨ緇嗚В閲婁笅銆?/span>
1銆?nbsp;寮哄埗綾誨瀷杞崲
public class ClassCastExceptionTest {
/**
* @param args
*/
public static void main(String[] args) {
Animal a1 = new Dog(); //1
Animal a2 = new Cat(); //2
Dog d1 = (Dog)a1; //3
Dog d2 = (Dog)a2; //4
}
}
鎶婄尗杞崲鎴愮嫍錛屾槸涓嶅鐨勩傚悗闈㈡敞閲婁負4鐨勪唬鐮佹槸鏃犳硶姝e父璧嬪肩殑銆?/span>
Exception in thread "main" java.lang.ClassCastException: Cat cannot be cast to Dog
at ClassCastExceptionTest.main(ClassCastExceptionTest.java:13)
2銆?nbsp;涓嶅悓classloader鍔犺澆鐩稿悓綾誨瀷綾諱箣闂寸殑杞崲
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
public class ClassCastExceptionTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
File file = new File(Thread.currentThread().getContextClassLoader().getResource("").getPath());
URL[] urls = {file.toURL()};
URLClassLoader classloader1 = new URLClassLoader(urls, ClassLoader.getSystemClassLoader().getParent());
Class classloader1Animal1 = classloader1.loadClass("Dog");
Dog dog1 = (Dog)classloader1Animal1.newInstance();
URLClassLoader classloader2 = new URLClassLoader(urls, ClassLoader.getSystemClassLoader().getParent());
Class classloader1Animal2 = classloader1.loadClass("Dog");
Dog dog2 = (Dog)classloader1Animal1.newInstance();
dog1 = dog2;
}
}
浠g爜涓垜浠湅鍒?/span>dog1=dog2錛岃繖鏍瘋祴鍊兼槸浼氭姏寮傚父鐨勩?/span>
Exception in thread "main" java.lang.ClassCastException: Dog cannot be cast to Dog
at ClassCastExceptionTest.main(ClassCastExceptionTest.java:17)
浠ュ悗澶у閬囧埌classCastException鐨勬椂鍊欒娉ㄦ剰浜嗭紝涓嶄竴瀹氭槸寮哄埗綾誨瀷杞崲瀵艱嚧鐨勶紝涔熸湁鍙兘涓嶅悓鐨?/span>classloader鍔犺澆浜嗙浉鍚岀殑綾伙紝鐒跺悗榪欎釜綾諱笉鍚岀殑瀹炰緥榪涜璧嬪箋?/span>
錛堜竴錛夐棶棰?/span>
欏圭洰涓渶瑕佸鏂囦歡鍋?/span>md5sum錛屽垎涓ゆ璧幫細1銆佸鏂囦歡嫻佺殑姣忎釜瀛楄妭鐢?/span>md5瀹炰緥榪涜update錛岀劧鍚庤繘琛?/span>digest銆?/span>2銆?/span>digest榪斿洖闀垮害涓?/span>16鐨?/span>byte鏁扮粍錛屼竴鑸垜浠渶瑕佹妸byte鏁扮粍杞垚16榪涘埗瀛楃涓詫紙寰堝寮婧愮殑md5鍔犲瘑綆楁硶濡傛瀹炵幇錛岀湡姝g殑鍘熷洜榪樹笉鏄緢鐞嗚В錛屽彲鑳芥槸渚夸簬鏌ョ湅鍜屼紶杈擄級銆傚叿浣撶殑瀹炵幇浠g爜濡備笅錛?/span>
/**
* 瀵規枃浠惰繘琛?/span>md5 sum鎿嶄綔
* @param checkFile 瑕佽繘琛屽仛md5 sum鐨勬枃浠?/span>
* @return
*/
public static String md5sum(File checkFile){
String md5sumResult = "";
if(checkFile == null || (!checkFile.exists())){
return md5sumResult;
}
MessageDigest digest = MessageDigest.getInstance("MD5");
InputStream is = new FileInputStream(checkFile);
byte[] buffer = new byte[8192];
int read = 0;
try {
while( (read = is.read(buffer)) > 0) {
digest.update(buffer, 0, read);
}
byte[] md5sum = digest.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
md5sumResult = bigInt.toString(16);
}
catch(IOException e) {
throw new RuntimeException("Unable to process file for MD5", e);
}
finally {
try {
is.close();
}
catch(IOException e) {
throw new RuntimeException("Unable to close input stream for MD5 calculation", e);
}
}
return md5sumResult;
}
鍏朵腑榛勮壊鑳屾櫙鑹茬殑杞崲鏂瑰紡鏄湁闂鐨勩備負浠涔堢敤bigint杞?/span>16榪涘埗浼氭湁闂鍛紝鍘熷洜鏄?/span>bigint榪涜16榪涘埗杞崲鐨勬椂鍊欑涓涓?/span>0琚嚜鍔ㄥ幓鎺変簡.
錛堜簩錛夋紜В鍐蟲柟寮?/span>
閭f紜殑鏂瑰紡鏄庝箞鏍風殑鍛紵涓嬮潰鏈変袱縐嶄笉鍚岀殑杞崲鏂瑰紡錛屼絾鏄師鐞嗗叾瀹炴槸涓鑷寸殑銆?/span>
絎竴縐嶆紜殑鏂瑰紡錛堢敱鐜嬪緩鎻愪緵錛夛細
/**
* 灝嗗瓧鑺傛暟緇勮漿鎹負16榪涘埗瀛楃涓?/span>
*
* @param buffer
* @return
*/
public static String toHex(byte[] buffer) {
StringBuffer sb = new StringBuffer(buffer.length * 2);
for (int i = 0; i < buffer.length; i++) {
sb.append(Character.forDigit((buffer[i] & 240) >> 4, 16));
sb.append(Character.forDigit(buffer[i] & 15, 16));
}
return sb.toString();
}
絎簩縐嶆紜殑鏂瑰紡錛?/span>
public static String bytes2HexString(byte[] b) {
String ret = "";
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += hex;
}
return ret;
}
錛堜笁錛夐棶棰樺垎鏋?/span>
Md5綆楁硶瀵逛換浣曢暱搴︾殑瀛楃涓茶繘琛岀紪鐮佹渶鍚庤緭鍑烘槸128浣嶉暱鏁存暟錛屼篃灝辨槸闀垮害涓?/span>16鐨?/span>byte鏁扮粍銆傛垜浠」鐩皟鐢ㄧ殑鏄?/span>jdk瀹炵幇鐨?/span>md5綆楁硶錛屾墍浠ヤ竴鑸槸娌¢棶棰樼殑銆?/span>
鎺ヤ笅鏉ユ垜浠澶勭悊鐨勪簨鎯咃紝鍒嗗埆寰幆鏁扮粍錛?span style="background:yellow;">鎶婃瘡涓瓧鑺傝漿鎹㈡垚2涓?/span>16榪涘埗瀛楃錛屼篃灝辨槸璇存瘡4浣嶈漿鎴愪竴涓?/span>16榪涘埗瀛楃銆?/span>
涓婇潰姝g‘鐨勪袱縐嶆柟寮忎篃灝辨槸鍋氫簡榪欐牱鐨勪簨鎯呫?/span>
絎竴縐嶆柟寮忥細
Character.forDigit((buffer[i] & 240) >> 4, 16)鎶婂瓧鑺傜殑楂?/span>4浣嶅彇鍑哄彸縐?/span>4浣嶆崲綆楁垚int錛岀劧鍚庨氳繃forDigit杞崲鎴?/span>16榪涘埗瀛楃
Character.forDigit(buffer[i] & 15, 16)鎶婂瓧鑺傜殑浣?/span>4浣嶅彇鍑烘崲綆楁垚int錛岀劧鍚庨氳繃forDigit杞崲鎴?/span>16榪涘埗瀛楃
絎簩縐嶆柟寮忥細
Integer.toHexString(b[i] & 0xFF)鎶婃暣涓瓧鑺傝漿鎴?/span>int錛岀劧鍚?/span>toHexString涔熷氨鏄仛楂?/span>4浣嶅拰浣?/span>4浣嶇殑榪愮畻銆備絾鏄繖涓柟娉曞鏋滈珮鍥涗綅鏄?/span>0鐨勮瘽灝變笉杈撳嚭浠諱綍涓滆タ錛?/span>
鎵浠ュ湪杈撳嚭鐨勫瓧絎﹀墠鍔?/span>0鍗沖彲銆?/span>
b[i] & 0xFF灝辨槸鎶?/span>byte杞垚int錛屼負浠涔堢敤涓?/span>oxff鍋氫笌榪愮畻錛屾槸鍥犱負濡傛灉b[i]鏄礋鏁扮殑璇濓紝浠?/span>8浣嶅彉鎴?/span>32浣嶄細琛?/span>1錛屾墍浠ラ渶瑕佷笌0xff鍋氫笌榪愮畻錛屽彲浠ユ妸鍓嶉潰鐨?/span>24浣嶅叏閮ㄦ竻闆訛紝鍙堝彲浠ヨ〃紺烘垚鍘熸潵鐨勫瓧鑺備簡銆?/span>
闄勶細
灝介噺浣跨敤寮婧愭彁渚涚殑宸ュ叿鍖咃紝姣斿錛?/span>
org.apache.commons.codec.digest.DigestUtils.md5Hex(InputStream data)鏉ュ鏂囦歡嫻佽繘琛?/span>md5鍗沖彲錛屾洿鍔犳柟渚匡紝鍙潬銆?/span>
鏃╂湡鐨刯ava紼嬪簭鍛樺彲鑳藉彧瑕佹噦鍩烘湰璇硶錛岃繕鏈夊皯鏁扮殑欏圭洰緇忛獙灝卞彲浠ユ壘鍒頒竴浠芥瘮杈冨ソ鐨勫伐浣溿侸ava鍜宩ava紺懼尯鐨勫彂灞曪紝鏇村鐨勪漢浜嗚В瀹冿紝娣卞叆瀹冦傜幇鍦╦ava紼嬪簭鍛樹簡瑙d竴浜涜娉曟垜鐪嬭繕榪滆繙涓嶅浜嗭紝瀵逛簬jvm鐨勪簡瑙e拰娣卞叆鏄潪甯擱噸瑕佺殑銆傜綉姘戠殑澧炲錛岀綉绔欑殑鍒氭ч渶姹傦紝寰堝緗戠珯闈復楂樻ц兘錛岄珮騫跺彂絳夌瓑涓緋誨垪鐨勯棶棰樸傛病鏈夋繁鍏vm鐨刯ava紼嬪簭鍛樻槸寰堥毦鍐欏嚭楂樿川閲忛珮騫跺彂鐨勪唬鐮侊紙涔熻涓媯掑瓙鎵撴鎵鏈変漢浜嗭紝浣嗘垜鎯崇粷澶ч儴鍒嗘槸鑲畾鐨勶級銆?/span>
Osgi涔熻浣犲茍涓嶉檶鐢燂紝浣嗘槸浠栧簳灞傜殑瀹炵幇鏈哄埗浣犲彲鑳芥病鍘諱簡瑙h繃銆傚鏋滀綘鏄釜鎵撶牬鐮傞攨闂埌搴曠殑浜猴紝浣犺偗瀹氫細鎯崇煡閬搊sgi鏄浣曞仛鍒扮殑銆備絾鏄綘娌℃湁浜嗚Вjvm鐨勭被鍔犺澆浣撶郴錛屼綘鑲畾寰堥毦鐞嗚Вosgi鏄鏋滃仛鍒扮被闅旂絳変竴緋誨垪鐨勯棶棰樸備笉榪囨兂瀹屾暣鐞嗚Вosgi榪橀渶瑕佸叾浠栧緢澶氭柟闈㈢殑鐭ヨ瘑錛屼絾鏄畠鍩烘湰鐨勬満鍒惰繕鏄殑浜嗚Вjvm鐨勭被鍔犺澆鏈哄埗銆?/span>
Java綾誨簱鏈変簺鍖呭彧鏄畾涔変簡涓涓爣鍑嗭紝鍏蜂綋鐨勫疄鐜伴兘鏄敱鍏蜂綋鐨勪緵搴斿晢鏉ユ彁渚涖侸ava涓庢暟鎹簱榪炴帴灝辨槸涓涓緢濂界殑渚嬪瓙銆侸ava.sql綾誨簱鍙槸瀹氫箟浜唈ava涓庢暟鎹簱榪炴帴鐨勬爣鍑嗭紝閭d箞涓巑ysql灝遍渶瑕乵syql鐨勯┍鍔紝oracle灝遍渶瑕乷racle鐨勯┍鍔紝鑰宩ava.sql綾誨簱鏄敱bootstrap classloader鍔犺澆錛岄┍鍔ㄥ寘涓殑綾繪槸鐢?span>system classloader鏉ュ姞杞斤紝涓嶅悓綾誨姞杞藉櫒鍔犺澆鐨勭被鏄棤娉曠浉浜掕璇嗭紝鎵浠ヨ嚜鐒朵篃鏃犳硶姝e父鎻愪緵鍔熻兘浜嗐俲vm鍙堟槸鎻愪緵浜嗕粈涔堟満鍒惰浠栦滑浜や簰鍛紵濡傛灉浣犵‘瀹炲榪欎簺闂姣棤澶寸華鐨勮瘽錛岄偅涔堟垜瑙夊緱浣犵湡鐨勮濂藉ソ鐞嗚В涓媕vm綾誨姞杞戒綋緋匯?/span>
榪欑瘒鏂囩珷涓昏鏄粙緇嶄笅jvm綾誨姞杞界殑鏈哄埗鍩虹鐭ヨ瘑銆傚叧浜庡叾浠栫浉鍏蟲秹鍙婏紝鏈夋椂闂寸殑璇濓紝鎴戜細鍗曠嫭鍐欐枃绔犳潵浠嬬粛銆?/span>
1銆?/span> java綾誨姞杞藉櫒
1.1 Bootstrap classloader錛歴un jdk鏄敤c++瀹炵幇錛屾墍浠ュ湪浠g爜涓綘鏄棤娉曡幏鍙栨鍔犺澆鍣ㄧ殑瀹炰緥銆傛鍔犺澆鍣ㄤ富瑕佽礋璐e姞杞?JAVA_HOME/jre/lib/rt.jar銆俲ava綾諱腑鑾峰彇緇撴灉涓簄ull錛岃繖閲屽彲浠ョ敤涓涓緥瀛愯窇涓嬭瘉鏄庯細
public class Test {
public static void main(String[] arg) throws Exception{
ClassLoader classloader = Test.class.getClassLoader();
System.out.println(classloader);
System.out.println(classloader.getParent());
System.out.println(classloader.getParent().getParent());
}
}
杈撳嚭緇撴灉錛?/span>
sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null
鏈鍚庤緭鍑虹殑null灝辨槸浠h〃bootstrap classloader銆?/span>
1.2 Extension classloader錛氫富瑕佸姞杞芥墿灞曞姛鑳界殑jar錛?JAVA_HOME/jre/lib/ext/*.jar銆?/span>
1.3 System classloader錛氬姞杞絚laspath涓殑jar鍖呫?/span>
1.4鑷畾涔?classloader錛氫富瑕佸姞杞戒綘鎸囧畾鐨勭洰褰曚腑鐨勫寘鍜岀被銆?/span>
2銆?/span> 鍙屼翰濮旀淳妯″瀷
緋葷粺榪愯鏃訛紝鎴戜滑璇鋒眰鍔犺澆String綾伙紝姝ゆ椂System Classloader鑷繁涓嶆壘classpath涓殑鍖咃紝鎶婅姹傝漿鍙戠粰Extension Classloader錛屼絾瀹冧篃涓嶅仛鏌ユ壘錛屽張杞彂緇橞ootstrap Classloader錛屼絾鏄畠鍙戠幇鑷繁娌℃湁parent浜嗐備簬鏄粬鍦╮t.jar鍖呬腑鎵懼埌String綾誨茍鍔犺澆鍒癹vm涓彁渚涗嬌鐢ㄣ侸vm涓轟粈涔堣榪欎箞瀹炵幇鍛紵鍏跺疄鍜宩ava瀹夊叏浣撶郴鏈夊叧銆傚亣璁緅vm涓嶆槸榪欎箞瀹炵幇錛屾垜浠嚜瀹氫箟涓涓猄tring綾伙紝鍋氫竴浜涚牬鍧忥紝閭d箞榪愯jvm鐨勬満鍣ㄨ偗瀹氳鍙楀埌鎹熷潖銆傚叿浣撲緥瀛愶細
public class String {
public static void main(String[] args) {
System.out.println("hello world");
}
}
鎴戜滑榪愯鑷畾涔塖tring綾葷殑鏃跺欐姤閿欎簡錛岃娌℃湁main鏂規硶錛屽彲鎴戜滑瀹氫箟鐨勬槑鏄庢湁鐨勶紝鍢垮樋錛屽媧炬満鍒剁殑緙樻晠鏈鍚庡姞杞藉埌鐨勬槸鐢眀ootstrap classloader鍦╮t.jar鍖呬腑鐨凷tring錛岄偅涓被鏄病鏈塵ain鏂規硶錛屽洜姝ゆ姤閿欎簡銆?/span>
3銆?/span> 綾婚殧紱?/span>
jvm涓殑綾繪槸錛氱被鍔犺澆鍣?鍖呭悕+綾誨悕銆傛瘮濡傦細URLClassLoader1錛孶RLClassLoader2鍒嗗埆鍔犺澆com.test.Test鐨勬椂鍊欎細鍔犺澆涓ゆ錛屽洜涓烘瘡涓猚lassloader涓殑綾誨浜庡叾浠朿lassloader鏉ヨ鏄殧紱葷殑錛屼笉璁よ瘑鐨勩備緥瀛愶細
import java.net.URL;
import java.net.URLClassLoader;
public class CustomClassloaderTest {
public static void main(String[] args) throws Exception {
URL url = new URL("file:/g:/");
URLClassLoader ucl = new URLClassLoader(new URL[]{url});
Class c = ucl.loadClass("Yang");
c.newInstance();
System.out.println(c.getClassLoader());
URLClassLoader ucl2 = new URLClassLoader(new URL[]{url});
Class c2 = ucl2.loadClass("Yang");
c2.newInstance();
System.out.println(c2.getClassLoader());
}
}
澶у鎶奩ang綾誨瓨鍦╣鐩樹笅銆?/span>
public class Yang {
static {
System.out.println("Yang");
}
}
榪愯緇撴灉錛?/span>
Yang
java.net.URLClassLoader@c17164
Yang
java.net.URLClassLoader@61de33
鐪嬪埌姣忔鍔犺澆Yang綾葷殑鏃跺欓兘杈撳嚭Yang錛岃鏄嶻ang綾昏鍔犺澆浜嗕袱嬈°?/span>
濡傛灉浣犱笉紜俊錛屽彲浠ヤ慨鏀逛笅浠g爜錛岃鍚屼竴classloader鍔犺澆Yang綾諱袱嬈?/span>
import java.net.URL;
import java.net.URLClassLoader;
public class CustomClassloaderTest {
public static void main(String[] args) throws Exception {
URL url = new URL("file:/g:/");
URLClassLoader ucl = new URLClassLoader(new URL[]{url});
Class c = ucl.loadClass("Yang");
c.newInstance();
System.out.println(c.getClassLoader());
Class c2 = ucl.loadClass("Yang");
c2.newInstance();
System.out.println(c2.getClassLoader());
}
}
鐪嬬湅杈撳嚭緇撴灉錛?/span>
Yang
java.net.URLClassLoader@c17164
java.net.URLClassLoader@c17164
緇撴灉涓彧杈撳嚭浜嗕竴嬈ang銆傚洜姝ゅ彲浠ヨ瘉鏄庢垜浠渶寮濮嬭鐨勭被闅旂銆?/span>
4銆?/span> 綰跨▼涓婁笅鏂囩被鍔犺澆鍣?/span>
鎴戜滑鐞嗚В浜嗗弻浜插媧炬ā鍨嬶紝閭d箞鐩墠鍙湁鐢變笅鍚戜笂鍗曞悜瀵繪壘綾伙紙system->extension->bootstrap錛?/span>
銆傛垜浠湪鏈寮濮嬬殑鏃跺欒榪囷紝java.sql鍖呬腑鐨勭被鐢眀ootstrap鎴杄xtension classloader鍔犺澆錛岃宮ysql椹卞姩鍖呮槸鍦╟lasspath涓敱system鏉ュ姞杞斤紝浣哹ootstrap涓殑綾繪槸鏃犳硶鎵懼埌system classloader涓殑綾伙紝姝ゆ椂闈犵嚎紼嬩笂涓嬫枃綾誨姞杞藉櫒鏉ヨВ鍐熾傜嚎紼嬩笂涓嬫枃綾誨姞杞藉櫒涓昏灝辨槸鑳借jvm綾誨姞杞芥ā鍨嬪叿鏈変簡鍚戜笅瀵繪壘鐨勫彲鑳斤紝bootstrap->extension->system錛屽鏋滀笉鍋氫換浣曡緗紝綰跨▼涓婁笅鏂囩被鍔犺澆鍣ㄩ粯璁ゆ槸system classloader銆傛湰鏉ヨ繖閲屾兂鍐欎竴涓緥瀛愮殑錛屽彲鏄湁鐐歸夯鐑︼紝鎵浠ヤ笅嬈″崟鐙啓涓綃囧叧浜庤繖鏂歸潰鐨勭煡璇嗐?/span>