隨筆-204  評論-90  文章-8  trackbacks-0
           


          這是一些在工作中常用到的一些小技術,拿出來和大家分享

          1.用:set list來查看所有不可見字符,反之用:set nolist關閉
          2.vim操作ftp,打開:
          :e ftp://192.168.0.1/1.txt
          保存(如果不存在則創建):
          :w ftp://192.168.0.1/1.txt
          讀取:
          :r ftp://192.168.0.1/1.txt
          以上操作第一次打開時需要輸入用戶名和密碼,
          以后就不用了,vim 會記住的。
          3.Ctrl+R 是在編輯時或者命令行界面下調入寄存器值的熱鍵,Ctrl+R+/ 會得到上一次查詢的條件,Ctrl+R+<寄存器名>; 相當于 Normal 模式下的 "<寄存器名>;p 命令
          4.vim在編輯一個文件時如果打開多個文件,:args <CTRL-R>;% file2 file3
          5.如何刪除連續兩行之間的回車符,使連續的兩行成為一行,Jx
          6.想顯示行號,可以用 :set nu
          7.vim中光標在C函數和系統調用上時,按K進入man手冊頁
          8.V 打開"可視模式"(不是虛擬模式,虛擬是 virtual)后,可以有很多種辦法移動光標的,不一定非得用 h j k l , 比如可以搜索定位, 也可以用 [[ ]] ][ [] } { 等段落定位的命令. v]] v[[ v} 這樣就可以選中一大塊,而不用一行一行地選 還有 H L 這些都可以用. 詳細請 help motion 另外, vim 內置了很多以 a 打頭的文本對象, 如 a{ 表示一個 {} 塊, ap 表示一個段落等等。=a{ 就可以重排當前語法塊.
          9.全選的命令是 ggVG gg表示到第一行第一個字母, V進入visual line G則到文件尾。
          10.vim是否支持將語法高亮度顯示的結果保存為一個html文檔,:TOhtml
          11.用:split new | r!ls 來獲得外部命令的輸入,其中r !ls 則表示執行外部命令 ls,并且捕獲(讀入)它的輸出。
          12.vi中用``就可以回到剛才的位置,vim中用ctrl+o
          13.用:set ai的命令來啟動自動縮進。用:syntax on命令來啟動語法著色
          14.在"插入模式"下刪除光標到行尾的字符,^od$,^o 表示同時按住 Ctrl 和 O 鍵,其實也可以是^oD,還有就是如果要刪除到某個字符位置的話,就用^odfx,x表示要刪除到的字符
          15.自動縮進set autoindent 和set cindent
          16.括號自動補全:iab ( ()
          17.刪除所有偶數行<ESC>;ggqajddq10000@a
          18.排版代碼gg=G
          19.:args查看正在編輯的文件名或者用ctrl+g
          20.gj gk 分別可以向下、向上移動一個物理行
          posted @ 2008-07-16 16:35 一凡 閱讀(743) | 評論 (0)編輯 收藏
          這部分簡要介紹一下TCP/IP的內部結構,為討論與互聯網有關的安全問題打下基礎。TCP/IP協議組之所以流行,部分原因是因為它可以用在各 種各樣的信道和底層協議(例如T1和X.25、以太網以及RS-232串行接口)之上。確切地說,TCP/IP協議是一組包括TCP協議和IP協議, UDP(User Datagram Protocol)協議、ICMP(Internet Control Message Protocol)協議和其他一些協議的協議組。

          TCP/IP協議的開發研制人員將Internet分為五個層次,以便于理解,它也稱為互聯網分層模型或互聯網分層參考模型,如下表:

          應用層(第五層)
          傳輸層(第四層)
          互聯網層(第三層)
          網絡接口層(第二層)
          物理層(第一層)

          物理層:對應于網絡的基本硬件,這也是Internet物理構成,即我們可以看得見的硬設備,如PC機、互連網服務器、網絡設備等,必須對這些硬設備的電氣特性作一個規范,使這些設備都能夠互相連接并兼容使用。

          網絡接口層:它定義了將資料組成正確幀的規程和在網絡中傳輸幀的規程,幀是指一串資料,它是資料在網絡中傳輸的單位。

          互聯網層:本層定義了互聯網中傳輸的“信息包”格式,以及從一個用戶通過一個或多個路由器到最終目標的"信息包"轉發機制。
          傳輸層:為兩個用戶進程之間建立、管理和拆除可靠而又有效的端到端連接。

          應用層:它定義了應用程序使用互聯網的規程。

          詳細請看

          參考資料:http://baike.baidu.com/view/7649.htm
          posted @ 2008-07-16 11:38 一凡 閱讀(195) | 評論 (0)編輯 收藏


          任務調度的crond常駐命令
          crond
          linux用來定期執行程序的命令。當安裝完成操作系統之后,默認便會啟動此任務調度命令。crond命令每分鍾會定期檢查是否有要執行的工作,如果有要執行的工作便會自動執行該工作。而linux任務調度的工作主要分為以下兩類:
          1
          、系統執行的工作:系統周期性所要執行的工作,如備份系統數據、清理緩存
          2
          、個人執行的工作:某個用戶定期要做的工作,例如每隔10分鐘檢查郵件服務器是否有新信,這些工作可由每個用戶自行設置

           

          CrontabUNIX系統下的定時任務觸發器,其使用者的權限記載在下列兩個文件中:

           

          文件

           

          含義

           

          /etc/cron.deny

           

          該文件中所列的用戶不允許使用Crontab命令

           

          /etc/cron.allow

           

          該文件中所列的用戶允許使用Crontab命令

           

          /var/spool/cron/

           

          是所有用戶的crontab文件

           

          /var/spool/cron/crontabs

          /var/spool/cron/crontabs


          Crontab
          命令的格式為:crontab –l|-r|-e|-i [username],其參數含義如表一:

           

          參數名稱

           

          含義

           

          示例

           

          -l

           

          顯示用戶的Crontab文件的內容

           

          crontabl –l

           

          -i

           

          刪除用戶的Crontab文件前給提示

           

          crontabl -ri

           

          -r

           

          Crontab目錄中刪除用戶的Crontab文件

           

          crontabl -r

           

          -e

           

          編輯用戶的Crontab文件

           

          crontabl -e

           


          用戶所建立的Crontab文件存于/var/spool/cron中,其文件名與用戶名一致。
          它的格式共分為六段,前五段為時間設定段,第六段為所要執行的命令段,
          格式如下:* * * * * <command>
          其時間段的含義如表二:

           

           

          含義

           

          取值范圍

           

          第一段

           

          代表分鐘

           

          0—59

           

          第二段

           

          代表小時

           

          0—23

           

          第三段

           

          代表日期

           

          1—31

           

          第四段

           

          代表月份

           

          1—12

           

          第五段

           

          代表星期幾,0代表星期日

           

          0—6

           

          例:如果用戶的Crontab文件的內容是:29 19 * * * echo its dinner time,則系統每天的19:29顯示‘its dinner time’

          示例(創建一個cron全過程,每分鐘都會在test.txt里輸入當前時間):

           

          1.     以普通用戶登錄linux系統(我用的是CentOS4.1)

           

          2.     $crontab –e
          說明:系統默認的編輯器是VIM,如果不是請加上以下shell:
              $EDITOR=vi
              $export EDITOR

           

          3.     輸入”*/1 * * * * date >> $HOME/test.txt”,save and exit VIM

           

          4.     $su root

           

          5.     $cd /etc/init.d

           

          6.     ./crond restart

           

          下面看看看幾個具體的例子:
          0 */2 * * * /sbin/service httpd restart 
          意思是每兩個小時重啟一次apache

           

          ● 50 7 * * * /sbin/service sshd start  意思是每天750開啟ssh服務

           

          ● 50 22 * * * /sbin/service sshd stop  意思是每天2250關閉ssh服務

           

          ● 0 0 1,15 * * fsck /home  每月1號和15號檢查/home 磁盤

           

          ● 1 * * * * /home/bruce/backup  每小時的第一分執行 /home/bruce/backup這個文件

           

          ● 00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \;  每周一至周五3點鐘,在目錄/home中,查找文件名為*.xxx的文件,并刪除4天前的文件。
          ● 30 6 */10 * * ls  意思是每月的1、11、21、31日是的6:30執行一次ls命令
          posted @ 2008-06-30 11:57 一凡 閱讀(276) | 評論 (0)編輯 收藏
           命令如下:
          $RESIN_HOME/bin/httpd.sh -conf $RESIN_HOME/conf/resin.conf -Djava.awt.headless=true -server 'servername' -pid 'log/coinstat.pid' -verbose start


          posted @ 2008-06-20 16:03 一凡 閱讀(430) | 評論 (0)編輯 收藏
          1.命令行參數(Command-line arguments)

          -install (Windows) install Resin as a service (but doesn't automatically start.)

          -install-as xxx (Windows) install Resin as a named service (but doesn't utomatically start.)

          -remove (Windows) install Resin as a service (but doesn't automatically start.)

          -remove-as xxx (Windows) remove Resin as a named service (but doesn't automatically start.)

          2.JDK參數(JDK arguments:在Httpd.sh參數的配置)
          <1>.文件位置:${resin30}/bin/httpd.sh

          <2>.args='-J-server -Xms200m -Xmx1024m -Xloggc:./log/gc.log -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Djava.awt.headless=true'
          參數說明:

          (1)J-server -Xms200m -Xmx1024m 其中,-Xms200m 表示啟動時,初時內存大小,-Xmx1024m最大內存占用大小。(-Xmn100m可選)

          (2)-XX:MaxNewSize=256m -XX:MaxPermSize=256m 表示:內存的永久保存區域(PermGen space)的大小,PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域OutOfMemoryError: PermGen space從表面上看就是內存溢出,解決方法也一定是加大內存。說說為什么會內存益出:這一部分用于存放Class和Meta的信息,Class在被 Load的時候被放入PermGen space區域,它和和存放Instance的Heap區域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理
          一般 -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m這些值不需要設置的,除非perm溢出,設置一下MaxPermSize就行,啟動腳本加上-server后,也不用在設置MaxNewSize。

          (3)-Djava.awt.headless=true 解決在linux/unix驗證碼圖片不能顯示的問題。

          3.通用 JVM 參數

          指定傳遞到啟動應用程序服務器進程的 Java 虛擬機代碼的命令行參數。

          下面是可以在“通用 JVM 參數”字段中輸入的可選命令行參數。如果輸入多個自變量,請在每個自變量之間輸入空格。
          重要: 如果該參數表明它僅適用于 IBM Developer Kit,您就無法為另一個 JVM 使用該參數,例如 Sun JDK 或 HP JDK。
          -Xquickstart
          可以使用 -Xquickstart 來以低于缺省方式的優化級別進行初始編譯。之后,根據采樣結果的不同,可以采用缺省方式下初始編譯的級別來進行重新編譯。適合于早期的平均速度比長期運行吞吐量更為重要的應用程序 -Xquickstart。在某些調試方案、測試裝置和短時間運行的工具中,可以將啟動時間縮短 15% 到 20%。

          -Xverify:none
          如果在類裝入期間要跳過類驗證階段,可以使用 -Xverify:none。在啟用即時(JIT)編譯器的情況下使用 -Xverify:none 能夠將啟動時間縮短 10-15%。

          -Xnoclassgc
          可以使用 -Xnoclassgc 來禁用類垃圾回收。此操作可以提高類重用程度,并可以略微提高性能。但是,其代價是您無法收集這些類擁有的資源。可以使用 verbose:gc 配置設置(此設置將輸出類垃圾回收統計信息)來監控垃圾回收。檢查這些統計信息將幫助您理解再生的資源和再生資源必需的垃圾回收量之間的平衡。然而,如果在您的工作負載中反復地垃圾回收同一組類,那么您應該禁用垃圾回收。缺省情況下,啟用類垃圾回收。

          -Xgcthreads
          可以同時使用數個垃圾回收線程,這也稱為并行垃圾回收。在“通用 JVM 參數”字段中輸入此值時,還要輸入您的機器的處理器數,例如,-Xgcthreadsn,其中 n 是處理器數。在具有 n 個處理器的節點上,缺省線程數是 n。如果您的機器有多個處理器,那么您應該使用并行垃圾回收。此參數僅對于 IBM Developer Kit 是有效的。

          -Xnocompactgc
          可以使用 -Xnocompactgc 來禁用堆壓縮,這是成本最高的垃圾回收操作。在 IBM Developer Kit 中避免壓縮。如果您禁用堆壓縮,那么消除了所有相關的開銷。

          -Xinitsh
          可以使用 -Xinitsh 來設置存儲類對象的堆的初始大小。方法定義和靜態字段也與類對象一起存儲。盡管系統堆大小沒有上限,但是設置初始大小,以避免產生涉及調用操作系統內存管理器的擴展系統堆大小的花銷。您可以通過了解 WebSphere Application Server 產品中裝入的類數目(大約是 8,000 個類)以及它們的平均大小,來計算理想的初始系統堆大小。了解應用程序可幫助您將它們計算進去。您只可以為 IBM Developer Kit 使用此參數。

          -Xgpolicy
          可以使用 -Xgpolicy 來設置垃圾回收策略。如果垃圾回收策略(gcpolicy)設置為 optavgpause,使用并發作標記跟蹤在堆滿之前從堆棧啟動的應用程序線程。垃圾回收器暫停變得協調統一了,并且長時間的暫停也不再明顯了。其代價是吞吐量降低,這是因為線程可能必須要執行額外的操作。缺省的建議值為 optthruput。輸入值 -Xgcpolicy:[optthruput|optavgpause]。您只可以為 IBM Developer Kit 使用此參數。

          -XX
          基于 Sun 的 Java Development Kit(JDK)V1.4.2 有生成垃圾回收功能,這允許分隔內存池以包含不同時效的對象。垃圾回收循環根據時效收集與其他對象彼此獨立的對象。使用其他參數,您可以單獨設置內存池的大小。為了實現更好的性能,您應該對包含短期存活對象的池的大小進行設置,以使該池中的對象的存活時間不會超過一個垃圾回收循環。新生成的池的大小由 NewSize 和 MaxNewSiz 參數確定。

          第一次垃圾回收循環中存活下來的對象轉移到另一個池中。生還者池的大小由參數 SurvivorRatio 確定。如果垃圾回收變成了瓶頸,您可以嘗試定制生成池設置。要監控垃圾回收統計信息,使用 Tivoli Performance Viewer 中的對象統計信息或 verbose:gc 配置設置。輸入下列值:
          -XX:NewSize (lower bound)
          -XX:MaxNewSize (upper bound)
          -XX:SurvivorRatio=NewRatioSize
          缺省值為:NewSize=2m MaxNewSize=32m SurvivorRatio=2。但是,如果 JVM 的堆大小大于 1GB,那么應該使用值:-XX:newSize=640m -XX:MaxNewSize=640m -XX:SurvivorRatio=16,或者將堆的總大小的 50% 到 60% 分配給新生成的池。

          -Xminf
          可以使用 -Xminf 來指定最小可用堆大小百分比。如果可用空間低于指定量,那么堆增長。在啟用復位的方式中,此選項指定中間件和瞬態堆的可用空間的最小百分率。這是

          -server | -client
          基于 Sun 的 Java Development Kit(JDK)V1.4.2 中的 Java 熱點技術引入了一種自適應 JVM,該 JVM 包含用于隨著時間的推移而優化字節碼執行的算法。JVM 以兩種方式運行,分別為 -server 和 -client。如果您使用缺省值 -client 方式,將會獲得較快的啟動時間以及較小的內存占用量,但是獲得的擴展性能也較低。如果有足夠的時間來允許 HotSpot JVM 通過執行連續執行字節代碼來熱身,您可以使用 -server 方式以增強性能。在大多數情況下,應該使用 -server 方式,這將長時間地保持運行時執行高效運行。您可以監控進程大小以及服務器啟動時間,來檢查 -client 和 -server 之間的區別。
          posted @ 2008-06-20 15:50 一凡 閱讀(1598) | 評論 (0)編輯 收藏
              用MyEclipse寫web工程時,總是顯示jsp文件錯誤,很不爽,我們可以不讓它進行語法檢查:
              右鍵你的工程-- MyEclipse -- Exclude From Validation即可以去掉語法檢查。
          posted @ 2008-06-02 18:49 一凡 閱讀(2146) | 評論 (0)編輯 收藏

          請到這里下載我的錄像:http://download.csdn.net/source/457437

          jetty-7.0.0pre1在MyEclipse 5.0M1中應用配置

          公司有一個項目需要使用一個嵌入式web server,在網上找了一通也沒找著一篇完整的文章,現整理一份出來,便與大家參考。
          需特別注意的是Jetty 6.0以前的版本和后來的是有差別的,以下為jetty-7.0.0pre1在myEclipse 5.0M1中應用配置步驟:
          它的原理在網上很多,看源代碼也好,我這里只說明應用

          我的環境:
          windows 2000 + JDK 1.5.0_08 + Eclipse 3.2.1 + MyEclipse 5.0M1
          錄像從第2步開始

          1、下載jetty-7.0.0pre1
          我下的是最新版的,下載地址:ftp://ftp.mortbay.org/pub/
          解壓到相應的目錄,我解到了d:/

          2、打開myEclipse,
             a.新建java工程JettyTest
             b.建立source folder src
             c.建立目錄 conf, contexts, logs, webapps
             d.在webapps建立manage目錄作為web工作目錄
             e.在src下建包com.willpower.jetty
             f.將D:\jetty-7.0.0pre1\lib下的三個jar包加入工程的classpath, 將D:\jetty-7.0.0pre1\lib\jsp-2.1下的四個jar包加入工程的classpath
             g.copy D:\jetty-7.0.0pre1\etc下的jetty.xml, webdefault.xml和realm.properties到conf下
             h.copy D:\jetty-7.0.0pre1\contexts下的test.xml到contexts下并改名為manage.xml
             i.修改jetty.xml, manage.xml
             j.在webapps/manage下新建index.jsp
             k.在src/com.willpower.jetty 里新建Start.java并加入main(),加入以下代碼:
                Server server = new Server(8080);
                    server.setHandler(new DefaultHandler());
                    XmlConfiguration cfg = null;
                    try {
                        cfg = new XmlConfiguration(new FileInputStream("./conf/jetty.xml"));
                        cfg.configure(server);
                        server.start(); 
                        System.out.println("Jetty Started ...");
                       
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (SAXException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }       
             l.運行Start類,用IE訪問http://localhost:8080/, 點擊/manage ---> org.mortbay.jetty.webapp.WebAppContext@bb05de
             剛才是因為忘記修改jetty.xml所致
            
             到此Jetty運行JSP成功
             停止服務
            
          3、繼續在Jetty中運行servlet
             a.在webapps/manage下建立WEB-INF, 并新建web.xml用于配置servlet, 并將contexts下的webdefalut.xml的內容copy到web.xml里
               修改contexts下的manage.xml
             b.在src下新建包com.willpower.servlet, 并新建servlet Manage                                                         
                request.setCharacterEncoding("GB2312");                                                                          
                String name = request.getParameter("name");                                                                       
                System.out.println("您提交的數據為:" + name);                                                                    
                System.out.println("OK");                                                                                         
             c.在web.xml里配置servlet, 將下面的代碼加入web.xml的servlet配置區域
                     <servlet>
                      <servlet-name>Manage</servlet-name>
                      <servlet-class>com.willpower.servlet.Manage</servlet-class>
                      <load-on-startup>1</load-on-startup>
                    </servlet>
                 
                    <servlet-mapping>
                      <servlet-name>Manage</servlet-name>
                      <url-pattern>/Manage</url-pattern>
                    </servlet-mapping>
             d.修改webapps/manage/index.jsp,加入以下代碼   
                 <br>
                  <form name="manage" method="Post" action="/manage/Manage">
                  &nbsp;
                  &nbsp;<input type="text" name="name" />
                  <input type="submit" name="button2" value="提交" />
                 
                  </form>
             e.運行Start類,用IE訪問http://localhost:8080/, 點擊/manage ---> org.mortbay.jetty.webapp.WebAppContext@bb05de
             f.到此Jetty運行servlet成功  
             停止服務
              
               希望對大家有所幫助 2008-05-16 18:16
              
              
              
              
              
          posted @ 2008-05-16 18:26 一凡 閱讀(1793) | 評論 (0)編輯 收藏
            
              轉自http://blog.csdn.net/shengbox/archive/2007/09/18/1789647.aspx
             照編譯原理的觀點,程序運行時的內存分配有三種策略,分別是靜態的,棧式的,和堆式的.
             靜態存儲分配是指在編譯時就能確定 每個數據目標在運行時刻的存儲空間需求,因而在編譯時就可以給他們分配固定的內存空間.這種分配策略要求程序代碼中不允許有可變數據結構(比如可變數組) 的存在,也不允許有嵌套或者遞歸的結構出現,因為它們都會導致編譯程序無法計算準確的存儲空間需求.
             棧式存儲分配也可稱為動態存儲分配,是 由一個類似于堆棧的運行棧來實現的.和靜態存儲分配相反,在棧式存儲方案中,程序對數據區的需求在編譯時是完全未知的,只有到運行的時候才能夠知道,但是 規定在運行中進入一個程序模塊時,必須知道該程序模塊所需的數據區大小才能夠為其分配內存.和我們在數據結構所熟知的棧一樣,棧式存儲分配按照先進后出的 原則進行分配。
             靜態存儲分配要求在編譯時能知道所有變量的存儲要求,棧式存儲分配要求在過程的入口處必須知道所有的存儲要求,而堆式存儲分 配則專門負責在編譯時或運行時模塊入口處都無法確定存儲要求的數據結構的內存分配,比如可變長度串和對象實例.堆由大片的可利用塊或空閑塊組成,堆中的內 存可以按照任意順序分配和釋放. 
           堆和棧的比較
            上面的定義從編譯原理的教材中總結而來,除靜態存儲分配之外,都顯得很呆板和難以理解,下面撇開靜態存儲分配,集中比較堆和棧:
             從堆和棧的功能和作用來通俗的比較,堆主要用來存放對象的,棧主要是用來執行程序的.而這種不同又主要是由于堆和棧的特點決定的:
              在編程中,例如C/C++中,所有的方法調用都是通過棧來進行的,所有的局部變量,形式參數都是從棧中分配內存空間的。實際上也不是什么分配,只是從棧頂 向上用就行,就好像工廠中的傳送帶(conveyor belt)一樣,Stack Pointer會自動指引你到放東西的位置,你所要做的只是把東西放 下來就行.退出函數的時候,修改棧指針就可以把棧中的內容銷毀.這樣的模式速度最快,當然要用來運行程序了.需要注意的是,在分配的時候,比如為一個即將 要調用的程序模塊分配數據區時,應事先知道這個數據區的大小,也就說是雖然分配是在程序運行時進行的,但是分配的大小多少是確定的,不變的,而這個"大小 多少"是在編譯時確定的,不是在運行時.
             堆是應用程序在運行的時候請求操作系統分配給自己內存,由于從操作系統管理的內存分配,所以在分配 和銷毀時都要占用時間,因此用堆的效率非常低.但是堆的優點在于,編譯器不必知道要從堆里分配多少存儲空間,也不必知道存儲的數據要在堆里停留多長的時 間,因此,用堆保存數據時會得到更大的靈活性。事實上,面向對象的多態性,堆內存分配是必不可少的,因為多態變量所需的存儲空間只有在運行時創建了對象之 后才能確定.在C++中,要求創建一個對象時,只需用new命令編制相關的代碼即可。執行這些代碼時,會在堆里自動進行數據的保存.當然,為達到這種靈活 性,必然會付出一定的代價:在堆里分配存儲空間時會花掉更長的時間!這也正是導致我們剛才所說的效率低的原因,看來列寧同志說的好,人的優點往往也是人的 缺點,人的缺點往往也是人的優點(暈~). 

           JVM中的堆和棧  
            JVM是基于堆棧的虛擬機.JVM為每個新創建的線程都分配一個堆棧.也就是說,對于一個Java程序來說,它的運行就是通過對堆棧的操作來完成的。堆棧以幀為單位保存線程的狀態。JVM對堆棧只進行兩種操作:以幀為單位的壓棧和出棧操作。
             我們知道,某個線程正在執行的方法稱為此線程的當前方法.我們可能不知道,當前方法使用的幀稱為當前幀。當線程激活一個Java方法,JVM就會在線程的 Java堆棧里新壓入一個幀。這個幀自然成為了當前幀.在此方法執行期間,這個幀將用來保存參數,局部變量,中間計算過程和其他數據.這個幀在這里和編譯 原理中的活動紀錄的概念是差不多的.
            從Java的這種分配機制來看,堆棧又可以這樣理解:堆棧(Stack)是操作系統在建立某個進程時或者線程(在支持多線程的操作系統中是線程)為這個線程建立的存儲區域,該區域具有先進后出的特性。
              每一個Java應用都唯一對應一個JVM實例,每一個實例唯一對應一個堆。應用程序在運行中所創建的所有類實例或數組都放在這個堆中,并由應用所有的線程 共享.跟C/C++不同,Java中分配堆內存是自動初始化的。Java中所有對象的存儲空間都是在堆中分配的,但是這個對象的引用卻是在堆棧中分配,也 就是說在建立一個對象時從兩個地方都分配內存,在堆中分配的內存實際建立這個對象,而在堆棧中分配的內存只是一個指向這個堆對象的指針(引用)而已。
          GC的思考
             Java為什么慢?JVM的存在當然是一個原因,但有人說,在Java中,除了簡單類型(int,char等)的數據結構,其它都是在堆中分配內存(所以說Java的一切都是對象),這也是程序慢的原因之一。
              我的想法是(應該說代表TIJ的觀點),如果沒有Garbage Collector(GC),上面的說法就是成立的.堆不象棧是連續的空間,沒有辦法指 望堆本身的內存分配能夠象堆棧一樣擁有傳送帶般的速度,因為,誰會為你整理龐大的堆空間,讓你幾乎沒有延遲的從堆中獲取新的空間呢?
             這個時 候,GC站出來解決問題.我們都知道GC用來清除內存垃圾,為堆騰出空間供程序使用,但GC同時也擔負了另外一個重要的任務,就是要讓Java中堆的內存 分配和其他語言中堆棧的內存分配一樣快,因為速度的問題幾乎是眾口一詞的對Java的詬病.要達到這樣的目的,就必須使堆的分配也能夠做到象傳送帶一樣, 不用自己操心去找空閑空間.這樣,GC除了負責清除Garbage外,還要負責整理堆中的對象,把它們轉移到一個遠離Garbage的純凈空間中無間隔的 排列起來,就象堆棧中一樣緊湊,這樣Heap Pointer就可以方便的指向傳送帶的起始位置,或者說一個未使用的空間,為下一個需要分配內存的對象" 指引方向".因此可以這樣說,垃圾收集影響了對象的創建速度,聽起來很怪,對不對?
             那GC怎樣在堆中找到所有存活的對象呢?前面說了,在建 立一個對象時,在堆中分配實際建立這個對象的內存,而在堆棧中分配一個指向這個堆對象的指針(引用),那么只要在堆棧(也有可能在靜態存儲區)找到這個引 用,就可以跟蹤到所有存活的對象.找到之后,GC將它們從一個堆的塊中移到另外一個堆的塊中,并將它們一個挨一個的排列起來,就象我們上面說的那樣,模擬 出了一個棧的結構,但又不是先進后出的分配,而是可以任意分配的,在速度可以保證的情況下,Isn't it great?
             但是,列寧同志 說了,人的優點往往也是人的缺點,人的缺點往往也是人的優點(再暈~~).GC()的運行要占用一個線程,這本身就是一個降低程序運行性能的缺陷,更何況 這個線程還要在堆中把內存翻來覆去的折騰.不僅如此,如上面所說,堆中存活的對象被搬移了位置,那么所有對這些對象的引用都要重新賦值.這些開銷都會導致 性能的降低.
             此消彼長,GC()的優點帶來的效益是否蓋過了它的缺點導致的損失,我也沒有太多的體會,Bruce Eckel 是Java的支持者,王婆賣瓜,話不能全信.個人總的感覺是,Java還是很慢,它的發展還需要時間.
            上面的體會是我看了TIJ.3rdEdition.Revision4.0中第四章之后得出的,內容和前面的有些不同.我沒有看過侯捷的中文版本,但我覺得,在關鍵問題上,原版的TIJ的確更值得一讀.所以和中文版配合起來學習是比較不錯的選擇.
             我只能算一個Java的初學者,沒想到起了這么個題目,卻受到這么多人的關注,欣喜之余,也決心盡力寫好下面的每一篇.不過這一篇完了,我就該準備赴美簽 證了,如果成功,那就要等到8月27號CS的研究生院開學之后,才有時間會開始研究下一章了,希望可以多從原版中獲取一點經驗. 
          posted @ 2008-05-07 09:44 一凡 閱讀(287) | 評論 (0)編輯 收藏
          Linux 包含了一個叫 gdb 的 GNU 調試程序. gdb 是一個用來調試 C 和 C++ 程序的強力調試器. 它使你能在程序運行時觀察程序的內部結構和內存的使用情況. 以下是 gdb 所提供的一些功能:
          1、啟動你的程序,可以按照你的自定義的要求隨心所欲的運行程序。
          2、可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式)
          3、當程序被停住時,可以檢查此時你的程序中所發生的事。
          4、動態的改變你程序的執行環境。
          當你啟動 gdb 后, 你能在命令行上指定很多的選項. 可以以下面的方式來運行 gdb gdb <fname>
          當你用這種方式運行 gdb , 你能直接指定想要調試的程序. 這將告訴gdb 裝入名為 fname 的可執行文件. 你也可以用 gdb 去檢查一個因程序異常終止而產生的 core 文件, 或者與一個正在運行的程序相連. 你可以參考 gdb 指南頁或在命令行上鍵入 gdb -h 得到一個有關這些選項的說明的簡單列表.  
          為調試編譯代碼
          為了使 gdb 正常工作, 你必須使你的程序在編譯時包含調試信息. 調試信息包含你程序里的每個變量的類型和在可執行文件里的地址映射以及源代碼的行號.  gdb 利用這些信息使源代碼和機器碼相關聯.
          在編譯時用 -g 選項打開調試選項.


          命   令 描  述
          file 裝入想要調試的可執行文件.
          kill 終止正在調試的程序.
          list 列出產生執行文件的源代碼的一部分.
          next 執行一行源代碼但不進入函數內部.
          step 執行一行源代碼而且進入函數內部.
          run 執行當前被調試的程序
          quit 終止 gdb
          watch 使你能監視一個變量的值而不管它何時被改變.
          break 在代碼里設置斷點, 這將使程序執行到這里時被掛起.
          make 使你能不退出 gdb 就可以重新產生可執行文件.
          shell 使你能不離開 gdb 就執行 UNIX shell 命令. 

          (a)設置斷點
          break 20;---在第20行設置斷點
          break func;---在函數func的入口處設置斷點
          (b)取消斷點
          delete break 20;---取消第20行的斷點
          delete break func;---取消函數func入口處的斷點
          (c)運行代碼
          run;
          r;
          (d)顯示變量或函數值
          display;
          p;
          (e)單步執行
          next;
          n;
          (f)跳步執行
          step;
          s;
          (g)循環執行
          continue;
          c;
          (h)列出運行棧內容
          bt;
          一個調試示例
          ——————

          源程序:tst.c

               1 #include <stdio.h>
               2
               3 int func(int n)
               4 {
               5         int sum=0,i;
               6         for(i=0; i<n; i++)
               7         {
               8                 sum+=i;
               9         }
              10         return sum;
              11 }
              12
              13
              14 main()
              15 {
              16         int i;
              17         long result = 0;
              18         for(i=1; i<=100; i++)
              19         {
              20                 result += i;
              21         }
              22
              23        printf("result[1-100] = %d \n", result );
              24        printf("result[1-250] = %d \n", func(250) );
              25 }

          編譯生成執行文件:(Linux下)
          cc -g tst.c -o tst

          使用GDB調試:

          gdb tst  <---------- 啟動GDB
          GNU gdb 5.1.1
          Copyright 2002 Free Software Foundation, Inc.
          GDB is free software, covered by the GNU General Public License, and you are
          welcome to change it and/or distribute copies of it under certain conditions.
          Type "show copying" to see the conditions.
          There is absolutely no warranty for GDB.  Type "show warranty" for details.
          This GDB was configured as "i386-SuSE-linux"...
          (gdb) l     <-------------------- l命令相當于list,從第一行開始例出原碼。
          1        #include <stdio.h>
          2
          3        int func(int n)
          4        {
          5                int sum=0,i;
          6                for(i=0; i<n; i++)
          7                {
          8                        sum+=i;
          9                }
          10               return sum;
          (gdb)       <-------------------- 直接回車表示,重復上一次命令
          11       }
          12
          13
          14       main()
          15       {
          16               int i;
          17               long result = 0;
          18               for(i=1; i<=100; i++)
          19               {
          20                       result += i;   
          (gdb) break 16    <-------------------- 設置斷點,在源程序第16行處。
          Breakpoint 1 at 0x8048496: file tst.c, line 16.
          (gdb) break func  <-------------------- 設置斷點,在函數func()入口處。
          Breakpoint 2 at 0x8048456: file tst.c, line 5.
          (gdb) info break  <-------------------- 查看斷點信息。
          Num Type           Disp Enb Address    What
          1   breakpoint     keep y   0x08048496 in main at tst.c:16
          2   breakpoint     keep y   0x08048456 in func at tst.c:5
          (gdb) r           <--------------------- 運行程序,run命令簡寫
          Starting program: /home/hchen/test/tst

          Breakpoint 1, main () at tst.c:17    <---------- 在斷點處停住。
          17               long result = 0;
          (gdb) n          <--------------------- 單條語句執行,next命令簡寫。
          18               for(i=1; i<=100; i++)
          (gdb) n
          20                       result += i;
          (gdb) n
          18               for(i=1; i<=100; i++)
          (gdb) n
          20                       result += i;
          (gdb) c          <--------------------- 繼續運行程序,continue命令簡寫。
          Continuing.
          result[1-100] = 5050       <----------程序輸出。

          Breakpoint 2, func (n=250) at tst.c:5
          5                int sum=0,i;
          (gdb) n
          6                for(i=1; i<=n; i++)
          (gdb) p i        <--------------------- 打印變量i的值,print命令簡寫。
          $1 = 134513808
          (gdb) n
          8                        sum+=i;
          (gdb) n
          6                for(i=1; i<=n; i++)
          (gdb) p sum
          $2 = 1
          (gdb) n
          8                        sum+=i;
          (gdb) p i
          $3 = 2
          (gdb) n
          6                for(i=1; i<=n; i++)
          (gdb) p sum
          $4 = 3
          (gdb) bt        <--------------------- 查看函數堆棧。
          #0  func (n=250) at tst.c:5
          #1  0x080484e4 in main () at tst.c:24
          #2  0x400409ed in __libc_start_main () from /lib/libc.so.6
          (gdb) finish    <--------------------- 退出函數。
          Run till exit from #0  func (n=250) at tst.c:5
          0x080484e4 in main () at tst.c:24
          24              printf("result[1-250] = %d \n", func(250) );
          Value returned is $6 = 31375
          (gdb) c     <--------------------- 繼續運行。
          Continuing.
          result[1-250] = 31375    <----------程序輸出。

          Program exited with code 027. <--------程序退出,調試結束。
          (gdb) q     <--------------------- 退出gdb。

          posted @ 2008-04-18 15:51 一凡 閱讀(500) | 評論 (0)編輯 收藏
            示例:

          d=`date +%d`
          echo 
          "size" $'\t' "month" $'\t' "day" $'\t' "time" $'\t' "dir/file"
          ls 
          -*/* | awk '{if($5 > 0 && $7 == '$d') print $5 "\t" $6 "\t" $7 "\t" $8 "\t" $9}'

          值得注意的是d=`date +%d`, 這里的引號不是“;”右邊的鍵而是“tab”上面的那個
          posted @ 2008-04-18 13:45 一凡 閱讀(7613) | 評論 (3)編輯 收藏
          僅列出標題
          共21頁: First 上一頁 8 9 10 11 12 13 14 15 16 下一頁 Last 
          主站蜘蛛池模板: 新丰县| 惠来县| 和顺县| 通城县| 常州市| 合阳县| 汤原县| 衡山县| 双桥区| 永康市| 秭归县| 布拖县| 基隆市| 日土县| 区。| 井陉县| 油尖旺区| 贵溪市| 营口市| 呼图壁县| 滦南县| 德江县| 龙山县| 缙云县| 彩票| 施甸县| 富裕县| 崇州市| 长沙县| 祁连县| 梁山县| 高邑县| 抚松县| 古田县| 邛崃市| 华坪县| 三原县| 策勒县| 时尚| 汽车| 天镇县|