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

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

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

    posts - 110, comments - 101, trackbacks - 0, articles - 7
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    2013年11月26日

    轉(zhuǎn)自:http://blog.csdn.net/jeffreynicole/article/details/46953059 


    一個性能較好的web服務(wù)器jvm參數(shù)配置:


    1. -server //服務(wù)器模式  
    2. -Xmx2g //JVM最大允許分配的堆內(nèi)存,按需分配  
    3. -Xms2g //JVM初始分配的堆內(nèi)存,一般和Xmx配置成一樣以避免每次gc后JVM重新分配內(nèi)存。  
    4. -Xmn256m //年輕代內(nèi)存大小,整個JVM內(nèi)存=年輕代 + 年老代 + 持久代  
    5. -XX:PermSize=128m //持久代內(nèi)存大小  
    6. -Xss256k //設(shè)置每個線程的堆棧大小  
    7. -XX:+DisableExplicitGC //忽略手動調(diào)用GC, System.gc()的調(diào)用就會變成一個空調(diào)用,完全不觸發(fā)GC  
    8. -XX:+UseConcMarkSweepGC //并發(fā)標記清除(CMS)收集器  
    9. -XX:+CMSParallelRemarkEnabled //降低標記停頓  
    10. -XX:+UseCMSCompactAtFullCollection //在FULL GC的時候?qū)δ昀洗膲嚎s  
    11. -XX:LargePageSizeInBytes=128m //內(nèi)存頁的大小  
    12. -XX:+UseFastAccessorMethods //原始類型的快速優(yōu)化  
    13. -XX:+UseCMSInitiatingOccupancyOnly //使用手動定義初始化定義開始CMS收集  
    14. -XX:CMSInitiatingOccupancyFraction=70 //使用cms作為垃圾回收使用70%后開始CMS收集  


    說明:

    -Xmn和-Xmx之比大概是1:9,如果把新生代內(nèi)存設(shè)置得太大會導(dǎo)致young gc時間較長

    一個好的Web系統(tǒng)應(yīng)該是每次http請求申請內(nèi)存都能在young gc回收掉,full gc永不發(fā)生,當然這是最理想的情況

    xmn的值應(yīng)該是保證夠用(夠http并發(fā)請求之用)的前提下設(shè)置得盡量小

    web服務(wù)器和游戲服務(wù)器的配置思路不太一樣,最重要的區(qū)別是對游戲服務(wù)器的xmn即年輕代設(shè)置比較大,和Xmx大概1:3的關(guān)系,因為游戲服務(wù)器一般是長連接,在保持一定的并發(fā)量后需要較大的年輕代堆內(nèi)存,如果設(shè)置得大小了會經(jīng)常引發(fā)young gc


    • 對JVM的簡介


    由上圖可以看出jvm堆內(nèi)存的分類情況,JVM內(nèi)存被分成多個獨立的部分。
    廣泛地說,JVM堆內(nèi)存被分為兩部分——年輕代(Young Generation)和老年代(Old Generation)。


    • 年輕代
    年輕代是所有新對象產(chǎn)生的地方。當年輕代內(nèi)存空間被用完時,就會觸發(fā)垃圾回收。這個垃圾回收叫做Minor GC。年輕代被分為3個部分——Enden區(qū)和兩個Survivor區(qū)。


    年輕代空間的要點:
    大多數(shù)新建的對象都位于Eden區(qū)。
    當Eden區(qū)被對象填滿時,就會執(zhí)行Minor GC。并把所有存活下來的對象轉(zhuǎn)移到其中一個survivor區(qū)。
    Minor GC同樣會檢查存活下來的對象,并把它們轉(zhuǎn)移到另一個survivor區(qū)。這樣在一段時間內(nèi),總會有一個空的survivor區(qū)。
    經(jīng)過多次GC周期后,仍然存活下來的對象會被轉(zhuǎn)移到年老代內(nèi)存空間。通常這是在年輕代有資格提升到年老代前通過設(shè)定年齡閾值來完成的。

    • 年老代
    年老代內(nèi)存里包含了長期存活的對象和經(jīng)過多次Minor GC后依然存活下來的對象。通常會在老年代內(nèi)存被占滿時進行垃圾回收。老年代的垃圾收集叫做Major GC。Major GC會花費更多的時間。


    Stop the World事件
    所有的垃圾收集都是“Stop the World”事件,因為所有的應(yīng)用線程都會停下來直到操作完成(所以叫“Stop the World”)。

    因為年輕代里的對象都是一些臨時(short-lived )對象,執(zhí)行Minor GC非常快,所以應(yīng)用不會受到(“Stop the World”)影響。

    由于Major GC會檢查所有存活的對象,因此會花費更長的時間。應(yīng)該盡量減少Major GC。因為Major GC會在垃圾回收期間讓你的應(yīng)用反應(yīng)遲鈍,所以如果你有一個需要快速響應(yīng)的應(yīng)用發(fā)生多次Major GC,你會看到超時錯誤。

    垃圾回收時間取決于垃圾回收策略。這就是為什么有必要去監(jiān)控垃圾收集和對垃圾收集進行調(diào)優(yōu)。從而避免要求快速響應(yīng)的應(yīng)用出現(xiàn)超時錯誤。


    • 永久代
    永久代或者“Perm Gen”包含了JVM需要的應(yīng)用元數(shù)據(jù),這些元數(shù)據(jù)描述了在應(yīng)用里使用的類和方法。注意,永久代不是Java堆內(nèi)存的一部分。
    永久代存放JVM運行時使用的類。永久代同樣包含了Java SE庫的類和方法。永久代的對象在full GC時進行垃圾收集。


    方法區(qū)
    方法區(qū)是永久代空間的一部分,并用來存儲類型信息(運行時常量和靜態(tài)變量)和方法代碼和構(gòu)造函數(shù)代碼。


    內(nèi)存池
    如果JVM實現(xiàn)支持,JVM內(nèi)存管理會為創(chuàng)建內(nèi)存池,用來為不變對象創(chuàng)建對象池。字符串池就是內(nèi)存池類型的一個很好的例子。內(nèi)存池可以屬于堆或者永久代,這取決于JVM內(nèi)存管理的實現(xiàn)。


    運行時常量池
    運行時常量池是每個類常量池的運行時代表。它包含了類的運行時常量和靜態(tài)方法。運行時常量池是方法區(qū)的一部分。


    Java棧內(nèi)存
    Java棧內(nèi)存用于運行線程。它們包含了方法里的臨時數(shù)據(jù)、堆里其它對象引用的特定數(shù)據(jù)。

    Java垃圾回收
    Java垃圾回收會找出沒用的對象,把它從內(nèi)存中移除并釋放出內(nèi)存給以后創(chuàng)建的對象使用。Java程序語言中的一個最大優(yōu)點是自動垃圾回收,不像其他的程序語言那樣需要手動分配和釋放內(nèi)存,比如C語言。

    垃圾收集器是一個后臺運行程序。它管理著內(nèi)存中的所有對象并找出沒被引用的對象。所有的這些未引用的對象都會被刪除,回收它們的空間并分配給其他對象。

    一個基本的垃圾回收過程涉及三個步驟:
    標記:這是第一步。在這一步,垃圾收集器會找出哪些對象正在使用和哪些對象不在使用。
    正常清除:垃圾收集器清會除不在使用的對象,回收它們的空間分配給其他對象。
    壓縮清除:為了提升性能,壓縮清除會在刪除沒用的對象后,把所有存活的對象移到一起。這樣可以提高分配新對象的效率。


    簡單標記和清除方法存在兩個問題:
    效率很低。因為大多數(shù)新建對象都會成為“沒用對象”。
    經(jīng)過多次垃圾回收周期的對象很有可能在以后的周期也會存活下來。
    上面簡單清除方法的問題在于Java垃圾收集的分代回收的,而且在堆內(nèi)存里有年輕代和年老代兩個區(qū)域。


    • Java垃圾回收類型
    這里有五種可以在應(yīng)用里使用的垃圾回收類型。

    僅需要使用JVM開關(guān)就可以在我們的應(yīng)用里啟用垃圾回收策略。

    Serial GC(-XX:+UseSerialGC):Serial GC使用簡單的標記、清除、壓縮方法對年輕代和年老代進行垃圾回收,即Minor GC和Major GC。Serial GC在client模式(客戶端模式)很有用,比如在簡單的獨立應(yīng)用和CPU配置較低的機器。這個模式對占有內(nèi)存較少的應(yīng)用很管用。
    Parallel GC(-XX:+UseParallelGC):除了會產(chǎn)生N個線程來進行年輕代的垃圾收集外,Parallel GC和Serial GC幾乎一樣。這里的N是系統(tǒng)CPU的核數(shù)。我們可以使用 -XX:ParallelGCThreads=n 這個JVM選項來控制線程數(shù)量。并行垃圾收集器也叫throughput收集器。因為它使用了多CPU加快垃圾回收性能。Parallel GC在進行年老代垃圾收集時使用單線程。
    Parallel Old GC(-XX:+UseParallelOldGC):和Parallel GC一樣。不同之處,Parallel Old GC在年輕代垃圾收集和年老代垃圾回收時都使用多線程收集。
    并發(fā)標記清除(CMS)收集器(-XX:+UseConcMarkSweepGC):CMS收集器也被稱為短暫停頓并發(fā)收集器。它是對年老代進行垃圾收集的。CMS收集器通過多線程并發(fā)進行垃圾回收,盡量減少垃圾收集造成的停頓。CMS收集器對年輕代進行垃圾回收使用的算法和Parallel收集器一樣。這個垃圾收集器適用于不能忍受長時間停頓要求快速響應(yīng)的應(yīng)用。可使用 -XX:ParallelCMSThreads=n JVM選項來限制CMS收集器的線程數(shù)量。
    G1垃圾收集器(-XX:+UseG1GC) G1(Garbage First):垃圾收集器是在Java 7后才可以使用的特性,它的長遠目標時代替CMS收集器。G1收集器是一個并行的、并發(fā)的和增量式壓縮短暫停頓的垃圾收集器。G1收集器和其他的收集器運行方式不一樣,不區(qū)分年輕代和年老代空間。它把堆空間劃分為多個大小相等的區(qū)域。當進行垃圾收集時,它會優(yōu)先收集存活對象較少的區(qū)域,因此叫“Garbage First”。

    posted @ 2015-07-19 22:57 云云 閱讀(1213) | 評論 (0)編輯 收藏

    posted @ 2014-09-28 23:45 云云| 編輯 收藏

         摘要: class文件簡介及加載     Java編譯器編譯好Java文件之后,產(chǎn)生.class 文件在磁盤中。這種class文件是二進制文件,內(nèi)容是只有JVM虛擬機能夠識別的機器碼。JVM虛擬機讀取字節(jié)碼文件,取出二進制數(shù)據(jù),加載到內(nèi)存中,解析.class 文件內(nèi)的信息,生成對應(yīng)的 Class對象:     &nb...  閱讀全文

    posted @ 2014-09-28 23:44 云云| 編輯 收藏

     
    package com.qiyi.appstore.util;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import org.apache.commons.beanutils.BeanUtils;
    import org.apache.commons.lang.StringUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import com.qiyi.appstore.exception.AppStoreException;
    import com.qiyi.cloud.user.ApiCode;
    public class XssUtils {
    private static final Logger logger=LoggerFactory.getLogger(XssUtils.class);
    public static String getSafeStringXSS(String s){
          if (StringUtils.isBlank(s)) {  
              return s;  
          }  
          StringBuilder sb = new StringBuilder(s.length() + 16);  
          for (int i = 0; i < s.length(); i++) {  
              char c = s.charAt(i);  
              switch (c) {  
              case '<':  
                  sb.append("&lt;");  
                  break; 
              case '>':  
                  sb.append("&gt;");  
                  break;  
              case '\'':  
                  sb.append("&prime;");// &acute;");  
                  break;  
              case '′':  
                  sb.append("&prime;");// &acute;");  
                  break;  
              case '\"':  
                  sb.append("&quot;");  
                  break;  
              case '"':  
                  sb.append("&quot;");  
                  break;  
              case '&':  
                  sb.append("&");  
                  break;  
              case '#':  
                  sb.append("#");  
                  break;  
              case '\\':  
                  sb.append('¥');  
                  break; 
              case '=':  
                  sb.append("=");  
                  break;
              default:  
                  sb.append(c);  
                  break;  
              }  
          }  
          return sb.toString(); 
      }
    public static <T> void getXssSaftBean(Class<?> clz,T bean) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
    String classname = clz.getSimpleName();
    logger.info("map target class name is {} .",classname);
    Field[] fields = clz.getDeclaredFields();
    for(Field field : fields){
    Class<?> type = field.getType();
    if(type.equals(String.class)){
    String fieldname = field.getName();
    String value = BeanUtils.getProperty(bean, fieldname);
    if(StringUtils.isNotBlank(value)){
    BeanUtils.setProperty(bean, fieldname, getSafeStringXSS(value));
    }
    }
    }
    }
    }

    posted @ 2014-09-28 13:49 云云 閱讀(734) | 評論 (0)編輯 收藏

    提升tomcat 性能 apr擴展lib
    使用apr類庫 可以讓tomcat的性能提升到3到4倍  
    目前項目中都使用這樣的配置
    <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" URIEncoding="UTF-8"
                   enableLookups="false"
                   acceptCount="300"
                   connectionTimeout="20000"
                   disableUploadTimeout="true" maxThreads="1000" maxSpareThreads="50" minSpareThreads="25"
                   redirectPort="8443" />


    catalia.sh 
    CATALINA_OPTS="$CATALINA_OPTS -Djava.library.path=/usr/local/apr/lib"

    posted @ 2014-01-16 14:50 云云 閱讀(921) | 評論 (0)編輯 收藏

         摘要: public static boolean acquireLock(String lock) {    // 1. 通過SETNX試圖獲取一個lock    boolean success = false;    Jedis jedis = pool.getResource();...  閱讀全文

    posted @ 2014-01-15 19:00 云云 閱讀(13411) | 評論 (1)編輯 收藏

    對eclipse的默認配置很不爽,黑色字體白色底好刺眼,而且字體習(xí)慣用Courier New
    改變背景顏色:
    windows->Preferences->General->Editor->Text Editors
    右邊選擇Appearance color options 
    選Background color 選擇背景顏色
    個人比較舒服的豆沙綠色和黑色背景,但黑色背景還要把其他的字體顏色也改了才好看,而且豆沙綠色跟默認的字體顏色搭配的很好。
    豆沙綠色(色調(diào):85   飽和度:123   亮度:205 )
    據(jù)說這個色調(diào)是眼科專家配的, 因其顏色比較柔和,據(jù)說閱讀的時候用這種顏色做背景有利于保護眼睛, word底色就許多人設(shè)置成豆沙綠色。
    xml的字體調(diào)整: 
    window--preferences--General--appearance--colors and fonts--Basic-- "Text font "  
    然后點change,可以設(shè)置字體,我喜歡Courier New
    Java的字體調(diào)整: 
    window--preferences--General--appearance--colors and fonts--java 

    posted @ 2014-01-09 16:41 云云 閱讀(1816) | 評論 (0)編輯 收藏

    有時候在項目中 會變化路徑 把原有路徑的文件拷到新的路徑下面
    再刪除原來不想的路徑再提交一次 這樣以來 原來的路徑確實不存在了
    但是拷過來的文件帶有原來路徑的svn信息 這樣以來 在提交的時候 就無法提交
    想要文件按照的路徑提交 但始終svn還是再往以前的路徑提交 并提示你路徑不存在
    在網(wǎng)上搜了下 如何刪除文件自帶的svn路徑信息
    按照下面的方式來操作即可

    Windows Registry Editor Version 5.00
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN] 
    @="刪除該目錄下面.svn文件"
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command] 
    @="cmd.exe /c \"TITLE Removing SVN Folders in %1 && COLOR 9A && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \""


    把上面這段文字保存問一個Done.reg文件
    然后執(zhí)行,導(dǎo)入到注冊表
    就會在你右鍵一個文件夾的時候多出來一個菜單"刪除該目錄下面.svn文件"
    執(zhí)行該命令即可

     

    posted @ 2013-12-05 17:17 云云 閱讀(727) | 評論 (0)編輯 收藏

    在ibatis中不需要關(guān)注這些參數(shù) 而轉(zhuǎn)到mybatis后 如果字段值為空 必須設(shè)置jdbcType

    insert into testTable
       (ID,
       NAME,
       DESCRIPTION,
       IMAGEURL,
       LINKURL,
       ISALWAYS,
       ISDISPLAYINDEX,
       DISPLAYWEIGHT,
       STARTTIME,
       ENDTIME,
       CREATOR,
       CREATTIME,
       MODIFYTIME)
      values
       (SEQ_ACTIVITY_TABLE.NEXTVAL,
       #{name},
       #{desc,jdbcType=VARCHAR},
       #{imageUrl,jdbcType=VARCHAR},
       #{linkUrl,jdbcType=VARCHAR},
       #{isAlways,jdbcType=CHAR},
       #{isDisplayIndex,jdbcType=CHAR},
       #{displayWeight,jdbcType=VARCHAR},
       #{startTime,jdbcType=DATE},
       #{endTime,jdbcType=DATE},
       #{creator,jdbcType=VARCHAR},
       sysdate,
       sysdate
       )
     </insert>

    這些設(shè)置之多,太煩了,最讓人煩的是  jdbcType = DATE,類型還必須大寫,不能小寫。
    如下面的例子,將DATE 改成 Date 。結(jié)果讓人很抓狂?。。?!
    insert into testTable
       (ID,
       NAME,
       DESCRIPTION,
       IMAGEURL,
       LINKURL,
       ISALWAYS,
       ISDISPLAYINDEX,
       DISPLAYWEIGHT,
       STARTTIME,
       ENDTIME,
       CREATOR,
       CREATTIME,
       MODIFYTIME)
      values
       (SEQ_ACTIVITY_TABLE.NEXTVAL,
       #{name},
       #{desc,jdbcType=VARCHAR},
       #{imageUrl,jdbcType=VARCHAR},
       #{linkUrl,jdbcType=VARCHAR},
       #{isAlways,jdbcType=CHAR},
       #{isDisplayIndex,jdbcType=CHAR},
       #{displayWeight,jdbcType=VARCHAR},
       #{startTime,jdbcType=Date},
       #{endTime,jdbcType=DATE},
       #{creator,jdbcType=VARCHAR},
       sysdate,
       sysdate
       )
     </insert>
    org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error resolving JdbcType. Cause: java.lang.IllegalArgumentException: No enum const class org.apache.ibatis.type.JdbcType.Date
    	org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75)
    	org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:368)
    更坑爹的在后面,上面insert時的時候用#{endTime,jdbcType=DATE},可以將時間插入成功,且可以精確到時分秒
    但如果在update語句中也這樣使用,那你得到的只會有日期,這夠坑爹的了吧 ,尼瑪  比起ibatis方便之處差遠了
    要想在update語句中 將時間格式化成時分秒 不得不再加一個類型 如下面:
    startTime = #{startTime,javaType=DATE, jdbcType=VARCHAR}













    posted @ 2013-11-26 21:02 云云 閱讀(21436) | 評論 (1)編輯 收藏

    主站蜘蛛池模板: 国产免费资源高清小视频在线观看| 亚洲色偷偷狠狠综合网| 人妻18毛片a级毛片免费看| 亚洲今日精彩视频| 黑人大战亚洲人精品一区| 成年人在线免费看视频| 37pao成人国产永久免费视频| 特黄特色的大片观看免费视频| 色婷五月综激情亚洲综合| 亚洲国产精品久久66| 亚洲男同帅GAY片在线观看| 免费国产小视频在线观看| 天天看免费高清影视| 久久久久国色AV免费看图片| 91人成网站色www免费下载| 国产成人精品无码免费看| 国产免费伦精品一区二区三区| 美女视频黄频a免费大全视频| 亚洲色大成网站www久久九| 亚洲精品美女网站| 亚洲无吗在线视频| 亚洲人成网男女大片在线播放| 亚洲国产中文在线二区三区免 | 人妻无码中文字幕免费视频蜜桃| 精品久久久久久亚洲中文字幕| 亚洲av无码兔费综合| 亚洲日韩一区二区一无码| 亚洲av成人一区二区三区观看在线| 亚洲综合成人婷婷五月网址| 亚洲精品GV天堂无码男同| 亚洲AV无码AV男人的天堂不卡| 美景之屋4在线未删减免费| 一区二区三区AV高清免费波多| 香蕉免费看一区二区三区| 免费在线观影网站| 美女视频黄的全免费视频网站| 成人免费男女视频网站慢动作| 国产精品麻豆免费版| 狠狠色伊人亚洲综合成人| 99久久国产亚洲综合精品| 国产美女视频免费观看的网站|