<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    自由飛翔

    我在仰望,java之上

    統計

    留言簿(2)

    我關注的blog

    閱讀排行榜

    評論排行榜

    #

    linux查詢包含某ip的文件

    一、grep命令
    grep即 (global search regular expression(RE) and print out the line
    eg:grep -F 192.168.1.1 -R ./
    二、find結合grep
    從根目錄開始查找所有文本文件,并找出包含"
    192.168.1.1
    "的行
    find ./ -type f -print | xargs grep 192.168.1.1
    從根目錄開始查找所有擴展名為.
    properties
    的文本文件,并找出包含"192"的行
    find . -type f -name "*.properties" | xargs grep "192"

    posted @ 2011-09-02 11:13 GavinMiao 閱讀(376) | 評論 (0)編輯 收藏

    JSP、servlet、struts線程安全問題分析

    Servlet之所以比CGI效率高就是因為Servlet是多線程的。
    Servlet規范已經聲明Servlet不是線程安全的.
    JSP中使用聲明的變量是Servlet的實例變量,不是線程安全的,其他都是線程安全的。

    那么怎樣才能是Servlet安全呢,凡是多個線程可以共享的就不要使用(實例變量+類變量),就這么簡單。也可以使用synchronized同步方法,但是這樣效率不高,還可以使用單線程模型,這樣的話效率就更低了,100個請求同時來的時候就要實例化100個實例。

    方法中的臨時變量是不會影響線程安全的,因為他們是在棧上分配空間,而且每個線程都有自己私有的棧空間。

    總結:線程安全問題主要是由實例變量造成的,不管在Servlet還是JSP,或者在Struts的Action里面,不要使用實例變量,
    任何方法里面都不要出現實例變量,你的程序就是線程安全的。


    在Servlet/JSP中的幾種變量類型
    源自 : http://www.javaresearch.org/article/8465.htm
    一、在Servlet/JSP中的幾種變量類型
    在編寫Servlet/JSP程序時,對實例變量一定要小心使用。因為實例變量是非線程安全的。
    在Servlet/JSP中,變量可以歸為下面的幾類:
    1. 類變量
    request,response,session,config,application,以及JSP頁面內置的page, pageContext。
    其中除了application外,其它都是線程安全的。
    2. 實例變量
    實例變量是實例所有的,在堆中分配。在Servlet/JSP容器中,一般僅實例化一個Servlet/JSP實例,
    啟動多個該實例的線程來處理請求。而實例變量是該實例所有的線程所共享,所以,實例變量不是線程安全的。
    3. 局部變量
    局部變量在堆棧中分配,因為每一個線程有自己的執行堆棧,所以,局部變量是線程安全的。
    二、在Servlet/JSP中的多線程同步問題
    在JSP中,使用實例變量要特別謹慎。首先請看下面的代碼:
    // instanceconcurrenttest.jsp
    <%@ page contentType="text/html;charset=GBK" %>
    <%!
        //定義實例變量
        String username;
        String password;
        java.io.PrintWriter output;
    %>
    <%
        //從request中獲取參數
        username = request.getParameter("username");
        password = request.getParameter("password");
        output = response.getWriter();
        showUserInfo();    
    %>
    <%!
        public void showUserInfo() {
            //為了突出并發問題,在這兒首先執行一個費時操作
            int i =0;
            double sum = 0.0;
            while (i++ < 200000000) {
                sum += i;
            }
            
            output.println(Thread.currentThread().getName() + "<br>");
            output.println("username:" + username + "<br>");
            output.println("password:" + password + "<br>");
        }
    %>
    在這個頁面中,首先定義了兩個實例變量,username和password。
    然后在從request中獲取這兩個參數,并調用showUserInfo()方法將請求用戶的信息回顯在該客戶的瀏覽器上。
    在一個用戶訪問是,不存在問題。
    但在多個用戶并發訪問時,就會出現其它用戶的信息顯示在另外一些用戶的瀏覽器上的問題。這是一個嚴重的問題。
    為了突出并發問題,便于測試、觀察,我們在回顯用戶信息時執行了一個模擬的費時操作,
    比如,下面的兩個用戶同時訪問(可以啟動兩個IE瀏覽器,或者在兩臺機器上同時訪問):
    a:    http://localhost:8080/instanceconcurrenttest.jsp?username=a&password=123
    b:    http://localhost:8080/instanceconcurrenttest.jsp?username=b&password=456
    如果a點擊鏈接后,b再點擊鏈接,那么,a將返回一個空白屏幕,b則得到a以及b兩個線程的輸出。請看下面的屏幕截圖:
     
    從運行結果的截圖上可以看到,Web服務器啟動了兩個線程分別來處理來自a和b的請求,但是在a卻得到一個空白的屏幕。這是因為上面程序中的output, username和password都是實例變量,是所有線程共享的。在a訪問該頁面后,將output設置為a的輸出,username,password分別置為a的信息,而在a執行printUserInfo()輸出username和password信息前,b又訪問了該頁面,把username和password置為了b的信息,并把輸出output指向到了b。隨后a的線程打印時,就打印到了b的屏幕了,并且,a的用戶名和密碼也被b的取代。請參加下圖所示:
    而實際程序中,由于設置實例變量,使用實例變量這兩個時間點非常接近,
    所以,像本例的同步問題并沒有這么突出,可能會偶爾出現,但這卻更加具有危險性,也更加難于調試。
    同樣,對于Servlet也存在實例變量的多線程問題,請看上面頁面的Servlet版:
    // InstanceConcurrentTest.java
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.PrintWriter;
    public class InstanceConcurrentTest extends HttpServlet 
    {
        String username;
        String password;
        PrintWriter out;
        public void doGet(HttpServletRequest request, HttpServletResponse response) 
             throws ServletException,java.io.IOException
        {
            //從request中獲取參數
            username = request.getParameter("username");
            password = request.getParameter("password");
            System.out.println(Thread.currentThread().getName() + 
                         " | set username:" + username);
            out = response.getWriter();
            showUserInfo();    
        }
        public void showUserInfo() {
            //為了突出并發問題,在這兒首先執行一個費時操作
            int i =0;
            double sum = 0.0;
            while (i++ < 200000000) {
                sum += i;
            }
            out.println("thread:" + Thread.currentThread().getName());
            out.println("username:"+ username);
            out.println("password:" + password);
        }
    }
    三、解決方案
    1. 以單線程運行Servlet/JSP
    在JSP中,通過設置:<%@ page isThreadSafe="false" %>,在Servlet中,
    通過實現javax.servlet.SingleThreadModel,
    此時Web容器將保證JSP或Servlet實例以單線程方式運行。
    重要提示:在測試中發現,Tomcat 4.1.17不能正確支持isThreadSafe屬性,
    所以,指定isTheadSafe為false后,在Tomcat 4.1.17中仍然出現多線程問題,這是Tomcat 4.1.17的Bug。在Tomcat 3.3.1和Resin 2.1.5中測試通過。
    2. 去除實例變量,通過參數傳遞
    從上面的分析可見,應該在Servlet/JSP中盡量避免使用實例變量。
    比如,下面的修正代碼,去除了實例變量,通過定義局部變量,并參數進行傳遞。
    這樣,由于局部變量是在線程的堆棧中進行分配的,所以是線程安全的。
    不會出現多線程同步的問題。代碼如下:
    <%@ page contentType="text/html;charset=GBK" %>
    <%
        //使用局部變量
        String username;
        String password;
        java.io.PrintWriter output;
        //從request中獲取參數
        username = request.getParameter("username");
        password = request.getParameter("password");
        output = response.getWriter();
        showUserInfo(output, username, password);    
    %>
    <%!
        public void showUserInfo(java.io.PrintWriter _output, 
             String _username, String _password) {
            //為了突出并發問題,在這兒首先執行一個費時操作
            int i =0;
            double sum = 0.0;
            while (i++ < 200000000) {
                sum += i;
            }
            
            _output.println(Thread.currentThread().getName() + "<br>");
            _output.println("username:" + _username + "<br>");
            _output.println("password:" + _password + "<br>");
        }
    %>
    注:有的資料上指出在printUserInfo()方法或者實例變量的相關操作語句上使用synchronized關鍵字進行同步,
    但這樣并不能解決多線程的問題。因為,這樣雖然可以使對實例變量的操作代碼進行同步,
    但并不能阻止一個線程使用另外一個線程修改后的“臟的”實例變量。
    所以,除了降低運行效率外,不會起到預期效果。


    待續...............

    posted @ 2011-09-02 10:30 GavinMiao 閱讀(1078) | 評論 (0)編輯 收藏

    JVM類加載初始化學習筆記(轉載)

         摘要: 文章來源:http://developer.51cto.com/art/200906/129346.htm1. Classloader的作用,概括來說就是將編譯后的class裝載、加載到機器內存中,為了以后的程序的執行提供前提條件。2. 一段程序引發的思考:風中葉老師在他的視頻中給了我們一段程序,號稱是世界上所有的Java程序員都會犯的錯誤。詭異代碼如下:Java代碼package te...  閱讀全文

    posted @ 2011-09-01 15:09 GavinMiao 閱讀(1568) | 評論 (0)編輯 收藏

    Java內存溢出的詳細解決方案(轉載)

    文章來源:http://developer.51cto.com/art/200906/129346.htm
    一、內存溢出類型
    1、java.lang.OutOfMemoryError: PermGen space
    JVM管理兩種類型的內存,堆和非堆。堆是給開發人員用的上面說的就是,是在JVM啟動時創建;非堆是留給JVM自己用的,用來存放類的信息的。它和堆不同,運行期內GC不會釋放空間。如果web app用了大量的第三方jar或者應用有太多的class文件而恰好MaxPermSize設置較小,超出了也會導致這塊內存的占用過多造成溢出,或者tomcat熱部署時侯不會清理前面加載的環境,只會將context更改為新部署的,非堆存的內容就會越來越多。
    PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域,這塊內存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGen space中,它和存放類實例(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的應用中有很CLASS的話,就很可能出現PermGen space錯誤,這種錯誤常見在web服務器對JSP進行pre compile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm默認的大小(4M)那么就會產生此錯誤信息了。 
    一個最佳的配置例子:(經過本人驗證,自從用此配置之后,再未出現過tomcat死掉的情況)
    set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
    2、java.lang.OutOfMemoryError: Java heap space
    第一種情況是個補充,主要存在問題就是出現在這個情況中。其默認空間(即-Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4。如果內存剩余不到40%,JVM就會增大堆到Xmx設置的值,內存剩余超過70%,JVM就會減小堆到Xms設置的值。所以服務器的Xmx和Xms設置一般應該設置相同避免每次GC后都要調整虛擬機堆的大小。假設物理內存無限大,那么JVM內存的最大值跟操作系統有關,一般32位機是1.5g到3g之間,而64位的就不會有限制了。
    注意:如果Xms超過了Xmx值,或者堆最大值和非堆最大值的總和超過了物理內存或者操作系統的最大限制都會引起服務器啟動不起來。
    垃圾回收GC的角色
    JVM調用GC的頻度還是很高的,主要兩種情況下進行垃圾回收:
    當應用程序線程空閑;另一個是java內存堆不足時,會不斷調用GC,若連續回收都解決不了內存堆不足的問題時,就會報out of memory錯誤。因為這個異常根據系統運行環境決定,所以無法預期它何時出現。
    根據GC的機制,程序的運行會引起系統運行環境的變化,增加GC的觸發機會。
    為了避免這些問題,程序的設計和編寫就應避免垃圾對象的內存占用和GC的開銷。顯示調用System.GC()只能建議JVM需要在內存中對垃圾對象進行回收,但不是必須馬上回收,
    一個是并不能解決內存資源耗空的局面,另外也會增加GC的消耗。
    二、JVM內存區域組成
    簡單的說java中的堆和棧
    java把內存分兩種:一種是棧內存,另一種是堆內存
    1。在函數中定義的基本類型變量和對象的引用變量都在函數的棧內存中分配;
    2。堆內存用來存放由new創建的對象和數組
    在函數(代碼塊)中定義一個變量時,java就在棧中為這個變量分配內存空間,當超過變量的作用域后,java會自動釋放掉為該變量所分配的內存空間;在堆中分配的內存由java虛擬機的自動垃圾回收器來管理
    堆的優勢是可以動態分配內存大小,生存期也不必事先告訴編譯器,因為它是在運行時動態分配內存的。缺點就是要在運行時動態分配內存,存取速度較慢;
    棧的優勢是存取速度比堆要快,缺點是存在棧中的數據大小與生存期必須是確定的無靈活性。
    java堆分為三個區:New、Old和Permanent
    GC有兩個線程:
    新創建的對象被分配到New區,當該區被填滿時會被GC輔助線程移到Old區,當Old區也填滿了會觸發GC主線程遍歷堆內存里的所有對象。Old區的大小等于Xmx減去-Xmn
    java棧存放
    棧調整:參數有+UseDefaultStackSize -Xss256K,表示每個線程可申請256k的棧空間
    每個線程都有他自己的Stack
    三、JVM如何設置虛擬內存
    提示:在JVM中如果98%的時間是用于GC且可用的Heap size 不足2%的時候將拋出此異常信息。
    提示:Heap Size 最大不要超過可用物理內存的80%,一般的要將-Xms和-Xmx選項設置為相同,而-Xmn為1/4的-Xmx值。
    提示:JVM初始分配的內存由-Xms指定,默認是物理內存的1/64;JVM最大分配的內存由-Xmx指定,默認是物理內存的1/4。
    默認空余堆內存小于40%時,JVM就會增大堆直到-Xmx的最大限制;空余堆內存大于70%時,JVM會減少堆直到-Xms的最小限制。因此服務器一般設置-Xms、-Xmx相等以避免在每次GC 后調整堆的大小。
    提示:假設物理內存無限大的話,JVM內存的最大值跟操作系統有很大的關系。
    簡單的說就32位處理器雖然可控內存空間有4GB,但是具體的操作系統會給一個限制,
    這個限制一般是2GB-3GB(一般來說Windows系統下為1.5G-2G,Linux系統下為2G-3G),而64bit以上的處理器就不會有限制了
    提示:注意:如果Xms超過了Xmx值,或者堆最大值和非堆最大值的總和超過了物理內存或者操作系統的最大限制都會引起服務器啟動不起來。
    提示:設置NewSize、MaxNewSize相等,"new"的大小最好不要大于"old"的一半,原因是old區如果不夠大會頻繁的觸發"主" GC ,大大降低了性能
    JVM使用-XX:PermSize設置非堆內存初始值,默認是物理內存的1/64;
    由XX:MaxPermSize設置最大非堆內存的大小,默認是物理內存的1/4。
    解決方法:手動設置Heap size
    修改TOMCAT_HOME/bin/catalina.bat
    在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
    JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
    四、性能檢查工具使用
    定位內存泄漏:
    JProfiler工具主要用于檢查和跟蹤系統(限于Java開發的)的性能。JProfiler可以通過時時的監控系統的內存使用情況,隨時監視垃圾回收,線程運行狀況等手段,從而很好的監視JVM運行情況及其性能。
    1. 應用服務器內存長期不合理占用,內存經常處于高位占用,很難回收到低位;
    2. 應用服務器極為不穩定,幾乎每兩天重新啟動一次,有時甚至每天重新啟動一次;
    3. 應用服務器經常做Full GC(Garbage Collection),而且時間很長,大約需要30-40秒,應用服務器在做Full GC的時候是不響應客戶的交易請求的,非常影響系統性能。
    因為開發環境和產品環境會有不同,導致該問題發生有時會在產品環境中發生,通常可以使用工具跟蹤系統的內存使用情況,在有些個別情況下或許某個時刻確實是使用了大量內存導致out of memory,這時應繼續跟蹤看接下來是否會有下降,
    如果一直居高不下這肯定就因為程序的原因導致內存泄漏。
    五、不健壯代碼的特征及解決辦法
    1、盡早釋放無用對象的引用。好的辦法是使用臨時變量的時候,讓引用變量在退出活動域后,自動設置為null,暗示垃圾收集器來收集該對象,防止發生內存泄露。
    對于仍然有指針指向的實例,jvm就不會回收該資源,因為垃圾回收會將值為null的對象作為垃圾,提高GC回收機制效率;
    2、我們的程序里不可避免大量使用字符串處理,避免使用String,應大量使用StringBuffer,每一個String對象都得獨立占用內存一塊區域;
    String str = "aaa";
    String str2 = "bbb";
    String str3 = str + str2;//假如執行此次之后str ,str2以后再不被調用,那它就會被放在內存中等待Java的gc去回收,程序內過多的出現這樣的情況就會報上面的那個錯誤,建議在使用字符串時能使用StringBuffer就不要用String,這樣可以省不少開銷;
    3、盡量少用靜態變量,因為靜態變量是全局的,GC不會回收的;
    4、避免集中創建對象尤其是大對象,JVM會突然需要大量內存,這時必然會觸發GC優化系統內存環境;顯示的聲明數組空間,而且申請數量還極大。
    這是一個案例想定供大家警戒
    使用jspsmartUpload作文件上傳,運行過程中經常出現java.outofMemoryError的錯誤,
    檢查之后發現問題:組件里的代碼
    m_totalBytes = m_request.getContentLength();
    m_binArray = new byte[m_totalBytes];
    問題原因是totalBytes這個變量得到的數極大,導致該數組分配了很多內存空間,而且該數組不能及時釋放。解決辦法只能換一種更合適的辦法,至少是不會引發outofMemoryError的方式解決。參考:http://bbs.xml.org.cn/blog/more.asp?name=hongrui&id=3747
    5、盡量運用對象池技術以提高系統性能;生命周期長的對象擁有生命周期短的對象時容易引發內存泄漏,例如大集合對象擁有大數據量的業務對象的時候,可以考慮分塊進行處理,然后解決一塊釋放一塊的策略。
    6、不要在經常調用的方法中創建對象,尤其是忌諱在循環中創建對象。可以適當的使用hashtable,vector 創建一組對象容器,然后從容器中去取那些對象,而不用每次new之后又丟棄
    7、一般都是發生在開啟大型文件或跟數據庫一次拿了太多的數據,造成 Out Of Memory Error 的狀況,這時就大概要計算一下數據量的最大值是多少,并且設定所需最小及最大的內存空間值。

    posted @ 2011-09-01 14:46 GavinMiao 閱讀(490) | 評論 (0)編輯 收藏

    java 內存分配(轉載)

    文章來源:http://developer.51cto.com/art/201009/225071_1.htm

    一般Java在內存分配時會涉及到以下區域:

    ◆寄存器:我們在程序中無法控制

    ◆棧:存放基本類型的數據和對象的引用,但對象本身不存放在棧中,而是存放在堆中

    ◆堆:存放用new產生的數據

    ◆靜態域:存放在對象中用static定義的靜態成員

    ◆常量池:存放常量

    ◆非RAM存儲:硬盤等永久存儲空間

    Java內存分配中的棧

    在函數中定義的一些基本類型的變量數據和對象的引用變量都在函數的棧內存中分配。
      
    當在一段代碼塊定義一個變量時,Java就在棧中 為這個變量分配內存空間,當該變量退出該作用域后,Java會自動釋放掉為該變量所分配的內存空間,該內存空間可以立即被另作他用。

    Java內存分配中的堆

    堆內存用來存放由new創建的對象和數組。 在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。

    在堆中產生了一個數組或對象后,還可以 在棧中定義一個特殊的變量,讓棧中這個變量的取值等于數組或對象在堆內存中的首地址,棧中的這個變量就成了數組或對象的引用變量。  引用變量就相當于是 為數組或對象起的一個名稱,以后就可以在程序中使用棧中的引用變量來訪問堆中的數組或對象。引用變量就相當于是為數組或者對象起的一個名稱。

    引用變量是普通的變量,定義時在棧中分配,引用變量在程序運行到其作用域之外后被釋放。而數組和對象本身在堆中分配,即使程序 運行到使用 new 產生數組或者對象的語句所在的代碼塊之外,數組和對象本身占據的內存不會被釋放,數組和對象在沒有引用變量指向它的時候,才變為垃圾,不能在被使用,但仍 然占據內存空間不放,在隨后的一個不確定的時間被垃圾回收器收走(釋放掉)。這也是 Java 比較占內存的原因。

    實際上,棧中的變量指向堆內存中的變量,這就是Java中的指針
     
    常量池 (constant pool)

    常量池指的是在編譯期被確定,并被保存在已編譯的.class文件中的一些數據。除了包含代碼中所定義的各種基本類型(如int、long等等)和對象型(如String及數組)的常量值(final)還包含一些以文本形式出現的符號引用,比如:

    ◆類和接口的全限定名;

    ◆字段的名稱和描述符;

    ◆方法和名稱和描述符。

    虛擬機必須為每個被裝載的類型維護一個常量池。常量池就是該類型所用到常量的一個有序集和,包括直接常量(string,integer和 floating point常量)和對其他類型,字段和方法的符號引用。

    對于String常量,它的值是在常量池中的。而JVM中的常量池在內存當中是以表的形式存在的, 對于String類型,有一張固定長度的CONSTANT_String_info表用來存儲文字字符串值,注意:該表只存儲文字字符串值,不存儲符號引 用。說到這里,對常量池中的字符串值的存儲位置應該有一個比較明了的理解了。
    在程序執行的時候,常量池 會儲存在Method Area,而不是堆中。

    堆與棧

    Java的堆是一個運行時數據區,類的(對象從中分配空間。這些對象通過new、newarray、 anewarray和multianewarray等指令建立,它們不需要程序代碼來顯式的釋放。堆是由垃圾回收來負責的,堆的優勢是可以動態地分配內存 大小,生存期也不必事先告訴編譯器,因為它是在運行時動態分配內存的,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由于要在運行時動態 分配內存,存取速度較慢。

    棧的優勢是,存取速度比堆要快,僅次于寄存器,棧數據可以共享。但缺點是,存在棧中的數據大小與生存期必須是 確定的,缺乏靈活性。棧中主要存放一些基本類型的變量數據(int, short, long, byte, float, double, boolean, char)和對象句柄(引用)。

    棧有一個很重要的特殊性,就是存在棧中的數據可以共享。假設我們同時定義:

    1. int a = 3;   
    2. int b = 3;  

    編譯器先處理int a = 3;首先它會在棧中創建一個變量為a的引用,然后查找棧中是否有3這個值,如果沒找到,就將3存放進來,然后將a指向3。接著處理int b = 3;在創建完b的引用變量后,因為在棧中已經有3這個值,便將b直接指向3。這樣,就出現了a與b同時均指向3的情況。

    這時,如果再令 a=4;那么編譯器會重新搜索棧中是否有4值,如果沒有,則將4存放進來,并令a指向4;如果已經有了,則直接將a指向這個地址。因此a值的改變不會影響 到b的值。

    要注意這種數據的共享與兩個對象的引用同時指向一個對象的這種共享是不同的,因為這種情況a的修改并不會影響到b, 它是由編譯器完成的,它有利于節省空間。而一個對象引用變量修改了這個對象的內部狀態,會影響到另一個對象引用變量。

    總結

    棧中用來存放一些原始數據類型的局部變量數據和對象的引用(String,數組.對象等等)但不存放對象內容

    堆中存放使用new關鍵字創建的對象.

    字符串是一個特殊包裝類,其引用是存放在棧里的,而對象內容必須根據創建方式不同定(常量池和堆).有的是編譯期就已經創建好,存放在字符串常 量池中,而有的是運行時才被創建.使用new關鍵字,存放在堆中。



    posted @ 2011-09-01 14:37 GavinMiao 閱讀(282) | 評論 (0)編輯 收藏

    spring2.5reference筆記

        只有注冊用戶登錄后才能閱讀該文。閱讀全文

    posted @ 2011-08-31 13:26 GavinMiao 閱讀(77) | 評論 (0)編輯 收藏

    Jquery取得iframe中元素的幾種方法(轉載)

         摘要: iframe在復合文檔中經常用到,利用jquery操作iframe可以大幅提高效率,這里收集一些基本操作DOM方法:父窗口操作IFRAME:window.frames["iframeSon"].documentIFRAME操作父窗口: window.parent.documentjquery方法:在父窗口中操作 選中IFRAME中的所有輸入框: $(window.frames["iframeSon...  閱讀全文

    posted @ 2011-08-30 16:34 GavinMiao 閱讀(19382) | 評論 (1)編輯 收藏

    spring注解

        只有注冊用戶登錄后才能閱讀該文。閱讀全文

    posted @ 2011-08-30 14:44 GavinMiao 閱讀(71) | 評論 (0)編輯 收藏

    注解參考

        只有注冊用戶登錄后才能閱讀該文。閱讀全文

    posted @ 2011-08-29 18:20 GavinMiao 閱讀(114) | 評論 (0)編輯 收藏

    設置內存大小

    tomcat bin catalina.bat
    在最上面添加這樣一句:
    set JAVA_OPTS=-Xms512m-Xmx1024m
    set CATALINA_OPTS=-Xms512m-Xmx1024m
    加入的位置在rem-----------------------這條語句之后
    eg:
    原語句: 
    set JAVA_OPTS=%JAVA_OPTS%   -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties" 
    修改后語句: 
    set JAVA_OPTS=%JAVA_OPTS% -Xms256m -Xmx512m -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties" 
    添加部分 
    set JAVA_OPTS=-Xms256m -Xmx512m
    在Eclipse中改tomcat JVM 內存, 運行Eclipse中配置的Tomcat. 
    在server配置, tomcat5.x->jdk, 在Java VM arguments 里添加: 
    -Xms256m -Xmx512m 達到一樣的效果. 

        以下為轉載的一篇文章:http://developer.51cto.com/art/201009/228062.htm

    如何設置Tomcat的JVM內存大小

    Tomcat本身不能直接在計算機上運行,需要依賴于硬件基礎之上的操作系統和一個JVM。JAVA程序啟動時JVM都會分配一個初始JVM內存和最大JVM內存給這個應用程序。這個初始內存和最大內存在一定程度都會影響程序的性能。比如說在應用程序用到最大內存的時候,JVM是要先去做垃圾回收的動作,釋放被占用的一些內存。所以想調整Tomcat的啟動時初始內存和最大內存就需要向JVM聲明,一般的JAVA程序在運行都可以通過中-Xms-Xmx來調整應用程序的初始內存和最大內存:

    這兩個值的大小一般根據需要進行設置。初始化堆的大小執行了虛擬機在啟動時向系統申請的內存的大小。一般而言,這個參數不重要。但是有的應用程序在大負載的情況下會急劇地占用更多的內存,此時這個參數就是顯得非常重要,如果虛擬機啟動時設置使用的內存比較小而在這種情況下有許多對象進行初始化,虛擬機就必須重復地增加內存來滿足使用。由于這種原因,我們一般把-Xms和-Xmx設為一樣大,而堆的最大值受限于系統使用的物理內存。一般使用數據量較大的應用程序會使用持久對象,內存使用有可能迅速地增長。當應用程序需要的內存超出堆的最大值時虛擬機就會提示內存溢出,并且導致應用服務崩潰。因此一般建議堆的最大值設置為可用JVM內存的最大值的80%。

    Tomcat默認可以使用的內存為128MB,在較大型的應用項目中,這點內存是不夠的,需要調大。有以下幾種方法可以選用:

    第一種方法:

    Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下設置:

    JAVA_OPTS='-Xms【初始化內存大小】-Xmx【可以使用的最大內存】'

    需要把這個兩個參數值調大。例如:

    JAVA_OPTS='-Xms256m-Xmx512m'

    表示初始化內存為256MB,可以使用的最大內存為512MB。

    第二種方法:環境變量中設

    變量名:JAVA_OPTS

    變量值:-Xms512m-Xmx512m

    第三種方法:前兩種方法針對的是bin目錄下有catalina.bat的情況(比如直接解壓的Tomcat等),但是有些安裝版的Tomcat下沒有catalina.bat,這個時候可以采用如下方法,當然這個方法也是最通用的方法:

    打開tomcatHome/\bin/\tomcat5w.exe,點擊Java選項卡,然后將會發現其中有這么兩項:Initialmemorypool和Maximummemorypool.Initialmemorypool這個就是初始化設置的內存的大小。Maximummemorypool這個是最大JVM內存的大小設置完了就按確定然后再重啟TOMCAT你就會發現tomcat中jvm可用的內存改變了。

    另外需要考慮的是Java提供的垃圾回收機制。虛擬機的堆大小決定了虛擬機花費在收集垃圾上的時間和頻度。收集垃圾可以接受的速度與應用有關,應該通過分析實際的垃圾收集的時間和頻率來調整。如果堆的大小很大,那么完全垃圾收集就會很慢,但是頻度會降低。如果你把堆的大小和內存的需要一致,完全收集就很快,但是會更加頻繁。調整堆大小的的目的是最小化垃圾收集的時間,以在特定的時間內最大化處理客戶的請求。在基準測試的時候,為保證最好的性能,要把堆的大小設大,保證垃圾收集不在整個基準測試的過程中出現。

    如果系統花費很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應該不超過3-5秒。如果垃圾收集成為瓶頸,那么需要指定代的大小,檢查垃圾收集的詳細輸出,研究垃圾收集參數對性能的影響。一般說來,你應該使用物理內存的80%作為堆大小。當增加處理器時,記得增加內存,因為分配可以并行進行,而垃圾收集不是并行的。

    一個要注意的地方:建議把內存的最高值跟最低值的差值縮小,不然會浪費很多內存的,最低值加大,最高值可以隨便設,但是要根據實際的物理內存,如果內存設置太大了,比如設置了512M最大內存,但如果沒有512M可用內存,Tomcat就不能啟動,還有可能存在內存被系統回收,終止進程的情況。

    posted @ 2011-08-29 14:49 GavinMiao 閱讀(3449) | 評論 (0)編輯 收藏

    僅列出標題
    共14頁: First 上一頁 6 7 8 9 10 11 12 13 14 下一頁 
    主站蜘蛛池模板: 国产精品亚洲mnbav网站| 国产成人免费永久播放视频平台| 亚洲线精品一区二区三区| 亚洲a无码综合a国产av中文| 免费毛片在线播放| 亚洲色无码专区一区| 四虎成人免费观看在线网址 | 高清免费久久午夜精品| 免费人妻无码不卡中文字幕18禁| 综合偷自拍亚洲乱中文字幕 | 99re在线精品视频免费| 亚洲沟沟美女亚洲沟沟| 青青草a免费线观a| 国产亚洲精彩视频| 亚洲欧洲精品成人久久曰影片 | 成年网站免费视频A在线双飞| 亚洲视频一区二区三区四区| 2020久久精品国产免费| 亚洲欧美aⅴ在线资源| 四虎免费久久影院| 青青操免费在线观看| 亚洲精品美女在线观看| 成人午夜视频免费| 一级做a爰片久久毛片免费陪 | 自拍偷区亚洲国内自拍| 在线观着免费观看国产黄| 人禽伦免费交视频播放| 亚洲欧洲第一a在线观看| 一本无码人妻在中文字幕免费| 亚洲精品乱码久久久久蜜桃| 国产亚洲精品无码专区| 亚洲美女视频免费| 日韩在线观看免费| 亚洲第一视频网站| 国产一级高清免费观看| 美女视频黄的免费视频网页| 亚洲粉嫩美白在线| 亚洲成AV人片在线观看ww| 免费无码黄网站在线观看| 在线观看人成视频免费无遮挡| 亚洲AV综合色区无码二区偷拍|