隨筆-2  評論-6  文章-5  trackbacks-0
            2007年3月27日
          JVM Thread DUMP 
          Windows 下用Ctrl-Break,Unix 下用 kill -3 <pid> 的命令讓JVM輸出 thread dump。
          每隔幾秒 thread dump 一次,多做幾次,分析比較。

          Thread Dump分析
          1 找出這幾次Thread dump 文件中,有哪些 Java Thread 處于長時間等待狀態,很有可能就是問題之所在。
          2 如果Java 線程等在某些不可能出錯的地方,如 java.lang.XXX/java.util.XXX對象的某個方法,則很有可能是因為出現了 OutOfMemoryError 異常,原因不外乎是JVM 堆內存過小或出現內存泄漏。
          3 對于死鎖,最直接的表現就是至少兩個線程長時間等待相互持有的對象(每個線程所持有的對象和它當前等待的對象都可以從 dump 中看到)。
          4 對于死循環,要輔助CPU占用率確定;如果發現CPU至少一顆使用率為100%,并且有線程長時間位于用戶代碼處,則很有可能是死循環引起。


          多線程缺陷排查
          對于Java死鎖問題很少出現,多線程訪問變量時沖突很常見。
          一般出在多線程共享同一對象實例如全局Map,Servlet,Interceptor,或如多線程同時訪問某個靜態方法,而此靜態方法不巧又訪問另一個靜態變量。
          這類問題自測發現不了,在并發壓力測試時才能發現。如果代碼的入口檢查做得好,多半會拋出一些莫名其妙的異常;要不然就會出現正常運行但數據庫記錄不對的情況。
          對這種問題,并無多好的辦法解決,主要還是靠看異常堆棧和靜態代碼分析來解決。


          內存泄漏排查
          一般用商用輔助工具排查,但有可能出現在JVM heap dump 模式下,運行極度緩慢的情況。
          笨笨曾經用過一個非常簡單的工具,效果不錯,它可以做到在不影響jvm 執行速度的情況下,做heap dump,然后對dump出的文件進行排序,檢查即可。

          posted @ 2007-07-09 22:01 tornado 閱讀(866) | 評論 (0)編輯 收藏

          忙了一天就為了把幾個文件變成zip包:
          發現:1,java的zip中文有問題用ant的
          ???????????? 2,只能生成zip,不能往原有的zip里面添加東西

          /**
          ? *
          ? * @param list 準備壓縮文件bean列表,bean里面是壓縮文件的路進和名字
          ? * @param outDir 輸出路徑
          ? * @param outName? 輸出文件名
          ? */
          ?
          ?public static void zipFilesAntJar(List list,String outDir,String outName){
          ??FileOutputStream fout;
          ??org.apache.tools.zip.ZipOutputStream zipOut;
          ??try {
          ???fout = new FileOutputStream(outDir+outName);
          ???
          ???zipOut = new org.apache.tools.zip.ZipOutputStream(fout);
          ???for (Iterator iter = list.iterator(); iter.hasNext();) {
          ????FileBean fb = (FileBean) iter.next();
          ????
          ?????FileInputStream fin = new FileInputStream(fb.getPathName());
          ?????
          ?????zipOut.setEncoding("GBK");
          ?????zipOut.putNextEntry(new org.apache.tools.zip.ZipEntry(fb.getName()));
          ?????
          ?????int number = 0;
          ?????byte[] b = new byte[1024];
          ?????while((number=fin.read(b))!=-1){
          ??????zipOut.write(b, 0, number);
          ?????}
          ?????zipOut.flush();
          ?????fin.close();
          ????
          ???}
          ???zipOut.close();
          ???fout.close();
          ??} catch (FileNotFoundException e) {
          ???e.printStackTrace();
          ??} catch (IOException e) {
          ???e.printStackTrace();
          ??}
          ??
          ?}

          public class FileBean {
          ?private String path;
          ?private String name;
          ?
          ?public FileBean(String path,String name){
          ??this.path = path;
          ??this.name = name;
          ?}
          ?public String getName() {
          ??return name;
          ?}
          ?public void setName(String name) {
          ??this.name = name;
          ?}
          ?public String getPath() {
          ??return path;
          ?}
          ?public void setPath(String path) {
          ??this.path = path;
          ?}
          ?public String getPathName(){
          ??return path+name;
          ?}
          }

          ?

          posted @ 2007-03-27 17:19 tornado 閱讀(397) | 評論 (0)編輯 收藏
          主站蜘蛛池模板: 铁力市| 历史| 巨野县| 班玛县| 洛隆县| 牡丹江市| 陆良县| 河东区| 庄浪县| 合阳县| 辛集市| 巴林左旗| 广水市| 江孜县| 盐池县| 雷山县| 冕宁县| 安阳市| 平泉县| 霍林郭勒市| 开封县| 依兰县| 安龙县| 怀宁县| 台东市| 博白县| 通州区| 遂溪县| 深泽县| 神农架林区| 山阴县| 合川市| 屏东县| 巴彦县| 龙里县| 故城县| 丰城市| 西平县| 合山市| 潮安县| 武冈市|