立博APP

<code id="choey"><ol id="choey"><span id="choey"></span></ol></code>
    1. <var id="choey"></var>

        <code id="choey"></code>
      1. <output id="choey"><legend id="choey"></legend></output>

          <label id="choey"><legend id="choey"></legend></label>
        1. <code id="choey"></code>
          <var id="choey"><ol id="choey"><big id="choey"></big></ol></var>
          全國免費咨詢電話: 010-59418061
          關注尚腦
          Java直接內存與非直接內存性能測試-litboy.cn
            什么是直接內存與非直接內存

            根據官方文檔的描述:

            A byte buffer is either direct or non-direct. Given a direct byte buffer, the Java virtual machine will make a best effort to perform native I/O operations directly upon it. That is, it will attempt to avoid copying the buffer's content to (or from) an intermediate buffer before (or after) each invocation of one of the underlying operating system's native I/O operations.

            byte byffer可以是兩種類型,一種是基于直接內存(也就是非堆內存);另一種是非直接內存(也就是堆內存)。

            對于直接內存來說,JVM將會在IO操作上具有更高的性能,因為它直接作用于本地系統的IO操作。而非直接內存,也就是堆內存中的數據,如果要作IO操作,會先復制到直接內存,再利用本地IO處理。

            從數據流的角度,非直接內存是下面這樣的作用鏈:

            本地IO-->直接內存-->非直接內存-->直接內存-->本地IO

            而直接內存是:

            本地IO-->直接內存-->本地IO

            很明顯,再做IO處理時,比如網絡發送大量數據時,直接內存會具有更高的效率。

            A direct byte buffer may be created by invoking the allocateDirect factory method of this class. The buffers returned by this method typically have somewhat higher allocation and deallocation costs than non-direct buffers. The contents of direct buffers may reside outside of the normal garbage-collected heap, and so their impact upon the memory footprint of an application might not be obvious. It is therefore recommended that direct buffers be allocated primarily for large, long-lived buffers that are subject to the underlying system's native I/O operations. In general it is best to allocate direct buffers only when they yield a measureable gain in program performance.

            但是,不要高興的太早。文檔中也說了,直接內存使用allocateDirect創建,但是它比申請普通的堆內存需要耗費更高的性能。不過,這部分的數據是在JVM之外的,因此它不會占用應用的內存。

            所以呢,當你有很大的數據要緩存,并且它的生命周期又很長,那么就比較適合使用直接內存。只是一般來說,如果不是能帶來很明顯的性能提升,還是推薦直接使用堆內存。

            關于直接內存需要注意的,就是上面兩點了,其他的關于視圖啊、作用鏈啊,都是使用上的問題了。如果有興趣,可以參考官方API ( 進去后搜索ByteBuffer,就能看到!),里面有少量的描述!重要的一些用法,還得自己摸索。

            使用場景

            通過上面的官方文檔,與一些資料的搜索??梢钥偨Y下,直接內存的使用場景:

            1 有很大的數據需要存儲,它的生命周期又很長

            2 適合頻繁的IO操作,比如網絡并發場景

            申請分配地址速度比較

            下面用一段簡單的代碼,測試下申請內存空間的速度:

           

          int time = 10000000;

          Date begin = new Date();

          for(int i=0;i

          ByteBuffer buffer = ByteBuffer.allocate(2);

          }

          Date end = new Date();

          System.out.println(end.getTime()-begin.getTime());

          begin = new Date();

          for(int i=0;i

          ByteBuffer buffer = ByteBuffer.allocateDirect(2);

          }

          end = new Date();

          System.out.println(end.getTime()-begin.getTime());

           

            得到的測試結果如下:

           

            在數據量提升時,直接內存相比于非直接內存的申請 有十分十分十分明顯的性能問題!


          ?
          尚腦教育隸屬于(北京尚腦互聯科技有限公司)    版權所有       京ICP備15029150號-2
          友情鏈接: 北京APP開發 | xp純凈版系統下載 | 廣州網站建設 | 廣州拓展訓練 | 數字圖書館系統 | 醫廢監管系統平臺 | 北京網站建設 | 騰訊企業郵箱 | 微信刷粉絲 | 信陽網站建設 | VR外包 | 展會互動 | 深圳網絡營銷 | 微信恢復 |
          罗江| 安乡| 资中| 柘城| 南召| 合江| 绩溪| 保山| 古丈| 林口| 当涂| 大荔| 商南| 神农架| 托勒| 汪清| 德安| 泸水| 五大连池| 麻栗坡| 宜宾县| 白城| 延吉| 洋县| 乌斯太| 赵县| 建水| 察隅| 沂水| 讷河| 岳池| 江西沟| 太湖| 贡嘎| 枣阳| 惠民| 互助| 东港| 茶卡| 托克逊| 麦盖提| 巴雅尔吐胡硕| 长岭| 澧县| 定南| 定远| 庆云| 江门| 清镇| 孝义| 桦南| 夏津| 肃南| 杭锦旗| 西乌珠穆沁旗| 临朐| 楚雄| 稻城| 绥滨| 罗城| 乌兰浩特| 番禺| 沅江| 台江| 洛阳| 赤城| 浦北| 博湖| 长汀| 额敏| 余杭| 鹤庆| 清涧| 玉门镇| 南郑| 宜宾县| 银川| 新龙| 瑞丽| 庐山| 厦门| 黎平| 济南| 南陵| 敦煌| 顺德| 芦山| 资溪| 石拐| 罗江| 温江| 巧家| 怀仁| 长沙| 麻江| 唐县| 酉阳| 丹棱| 万宁| 兴隆| 会东| 锦屏| 曹妃甸| 宁陕| 乌审召| 余杭| 泸水| 泌阳| 庆安| 雅布赖| 奉贤| 阿合奇| 长岭| 托克托| 柳河| 怀集| 金湖| 当阳| 芷江| 崆峒| 郏县| 沙县| 蓝山| 永泰| 当涂| 泌阳| 陈巴尔虎旗| 安吉| 裕民| 岗子| 烟台| 会泽| 哈巴河| 浑源| 潼关| 南部| 察哈尔右翼后旗| 阳曲| 中泉子| 六枝| 宕昌| 汾阳| 河曲| 清涧| 宜宾县| 乐东| 白银| 忻州| 息县| 黄山区| 东宁| 荣县| 饶平| 郁南| 普洱| 临县| 宜都| 达州| 嵊山| 得荣| 公馆| 哈巴河| 武宣| 宝坻| 建水| 襄阳| 新民| 民丰| 清原| 平潭海峡大桥| 长葛| 固镇| 衡阳县| 广昌| 子洲| 通辽钱家店| 临湘| 塔中| 五营| 留坝| 佛坪| 天河| 嵩县| 米泉| 希拉穆仁| 深泽| 民权| 峨边| 中山| 荣成| 乌审召| 岫岩| 铁力| 琼海| 绥中| 长清| 阜阳| 浏阳| 高邮| 扶余| 黟县| 科尔沁右翼中旗| 二连浩特| 临西| 大悟| 乌伊岭| 宾川| 大同| 川沙| 泊头| 娄底| 宁乡| 靖西| 高要| 德阳| 乌审召| 黄平旧洲| 庆安| 青龙山| 宣化| 阿鲁科尔沁旗| 本溪| 芦山| 缙云| 清远| 永定| 炮台| 琼海| 丰宁| 临淄| 安庆| 永济| 修水| 林西| 柳州| 吴川| 徐州农试站| 石拐| 景德镇| 政和| 洛阳| 闻喜| 闵行| 合江| 达日| 湖州| 德安| 宣汉| 河源| 化州| 仁化| 望谟| 丰台| 海东| 启东| 德化| 霍邱| 垣曲| 海渊| 通州| 德宏| 泗县| 南沙岛| 雷州| 白日乌拉| 霞浦| 兴宁| 东丽| 绥中| 崇义| 东阳| 梧州| 高阳| 临沂| 台州| 龙山| 南县| 临清| 长岛| 南溪| 柘荣| 迭部| 伊宁县| 宜春| 邗江| 平鲁| 木兰| 横峰| 永年| 闵行| 焦作| 加格达奇| 平定| 海兴| 麻黄山| 镇安| 永昌| 青铜峡| 德惠| 灵石| 哈尔滨| 天山大西沟| 丰城| 马尔康| 师宗| 吴江| 呼和浩特| 五营| 滑县| 大新| 新巴尔虎右旗| 沅陵| 天全| 台南| 临猗| 钟祥| 厦门| 彭泽| 宁城| 长顺| 丰宁| 寿县| 重庆| 和田| 兴国| 开远| 合肥| 头道湖| 定州| 大埔| 吉县| 抚远| 大武口| 岳西| 合作| 修武| 同德| 海林| 凤凰| 化隆| 山阴| 武城| 密山| 永宁| 吕梁| 南阳| 隆回| 富源| 新平| 奉节| 吐尔尕特| 曲阳| 八里罕| 山丹| 佛爷顶| 盐池| 冠县| 资源| 罗源| 衢州| 宜阳| 东沙岛| 清兰| 涠洲岛| 绿葱坡| 克东| 塔中| 松江| 兰溪| 吉首| 陈巴尔虎旗| 宣恩| 天台| 民乐| 崇明| 西昌| 彭泽| 宝鸡| 马公| 辉县| 汉中| 奉节| 大同| 玉环| 大姚| 巴雅尔吐胡硕| 太原古交区| 萧山| 镇宁| 黄平| 永兴| 平南| 松江| 方城| 东光| 越西| 姜堰| 介休| 成武| 临潭