最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
fast-loader(二)設(shè)計(jì)

分析

這是一個(gè)全新的工具,由我們?cè)O(shè)計(jì)的全新工具,所以我們可以來(lái)規(guī)劃它未來(lái)長(zhǎng)什么樣子。
我們?cè)谏弦黄篺ast-loader(一)起源里討論過(guò),它最最最基本需要達(dá)到的目標(biāo)應(yīng)該是對(duì)類的按需裝載,從而節(jié)約資源提升性能和資源利用率。
為了達(dá)到這個(gè)目標(biāo),我們就不能讓JVM自行裝載業(yè)務(wù)程序包,而是JVM裝載fast-loader,由fast-loader對(duì)業(yè)務(wù)程序包進(jìn)行裝載,如上一篇的圖
fast-loader(二)設(shè)計(jì)
因此,對(duì)于JVM而言,它并不清楚業(yè)務(wù)程序包的存在,而fast-loader需要關(guān)心的就是業(yè)務(wù)程序包,相當(dāng)于fast-loader接管了JVM對(duì)業(yè)務(wù)程序運(yùn)行的能力。
屆時(shí),對(duì)業(yè)務(wù)程序的運(yùn)行將變成如下

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到衢江網(wǎng)站設(shè)計(jì)與衢江網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請(qǐng)域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋衢江地區(qū)。

java -jar fast-loader.jar run some-biz-program

所以,fast-loader應(yīng)該具備啟動(dòng)一個(gè)應(yīng)用程序main方法的能力,同時(shí),它還是一個(gè)應(yīng)用程序。
fast-loader為了啟動(dòng)應(yīng)用程序,如果目標(biāo)是jar包的話,需要能將jar裝入內(nèi)存,但如果整體裝入的話,將會(huì)導(dǎo)致內(nèi)存占用,這樣fast-loader就無(wú)法節(jié)約內(nèi)存,因此需要避免jar直接裝入內(nèi)存的情況。
考慮到j(luò)ar包本質(zhì)上是zip格式,同時(shí)參考tomcat對(duì)war包的處理邏輯,fast-loader首次啟動(dòng)時(shí)可以將jar進(jìn)行解壓到文件夾,再按需進(jìn)行讀取文件,這樣雖然首次啟動(dòng)慢了些,但之后運(yùn)行效率將大大提升。
因此,fast-loader的需要能對(duì)jar進(jìn)行解壓縮到文件的能力。
一個(gè)程序不僅僅是一個(gè)jar包,它可能是一堆jar的組成,所以,fast-loader還需要能將這堆jar解壓后管理起來(lái)的能力。
程序運(yùn)行過(guò)程中會(huì)訪問(wèn)各類資源,特別是springboot打包結(jié)構(gòu)里,jar包內(nèi)又包含jar包,考慮到springboot的風(fēng)行程度,fast-loader需要具備對(duì)springboot包格式的兼容能力。
整理到一起

  • 它是一個(gè)應(yīng)用程序,可直接啟動(dòng)
  • 它能啟動(dòng)jar包內(nèi)的main方法
  • 它能夠?qū)ar包解壓到文件夾中
  • 對(duì)于很多的jar包,它能夠?qū)⑦@些解壓縮出來(lái)的文件管理起來(lái)
  • 鑒于springboot的流行程度,需要兼容它的包格式

設(shè)計(jì)

前面定義了fast-loader的能力,我們?cè)龠M(jìn)行一個(gè)簡(jiǎn)單梳理,看看它的調(diào)用應(yīng)該是怎么進(jìn)行的
fast-loader(二)設(shè)計(jì)
所以,從用例的角度來(lái)看的話,它應(yīng)該是這樣的
fast-loader(二)設(shè)計(jì)
再對(duì)它的能力進(jìn)行對(duì)齊和歸類,如下
fast-loader(二)設(shè)計(jì)
各自職責(zé)如下

  • FastLoaderMain:Main方法所在類,負(fù)責(zé)啟動(dòng)業(yè)務(wù)APP并調(diào)用其main方法;
  • FastClassLoader:負(fù)責(zé)轉(zhuǎn)載業(yè)務(wù)類定義到內(nèi)存中;
  • JarUtil:負(fù)責(zé)解壓縮業(yè)務(wù)jar包,如果存在多個(gè)jar包的話,還需要解壓到對(duì)應(yīng)的文件夾中;
  • FileUtil:負(fù)責(zé)對(duì)解壓縮出來(lái)的.class以及資源文件進(jìn)行管理;

轉(zhuǎn)換成類圖
fast-loader(二)設(shè)計(jì)
當(dāng)然,除了這些類之外,肯定還有其它類存在,但這幾個(gè)類為核心。
jar解壓縮至指定的文件夾,考慮到配置的簡(jiǎn)便以及第三方庫(kù)的數(shù)量較多,可以設(shè)計(jì)為
fast-loader(二)設(shè)計(jì)

優(yōu)化

一、包沖突的優(yōu)化

對(duì)存在多個(gè)相同版本的包的情況下,考慮到j(luò)ar文件名稱不同(自帶版本號(hào)),將會(huì)釋放到不同文件夾當(dāng)中。
但是,在查找類文件的時(shí)候,由于包沖突原因可能導(dǎo)致查找時(shí)候無(wú)法明確指定那個(gè)版本,因此這里設(shè)定規(guī)則:

但出現(xiàn)同類庫(kù)多個(gè)版本時(shí),直接使用最新版本

為了適配這個(gè)規(guī)則,我們需要對(duì)以上解壓縮的文件夾進(jìn)行調(diào)整,包括

  • jar包解壓縮文件夾名稱不以jar名稱命名,而是以不帶版本號(hào)的包名作為文件夾名稱
  • 解壓縮進(jìn)文件夾時(shí),默認(rèn)在包所在文件夾加入子文件夾,其名稱為版本號(hào);當(dāng)沒(méi)有版本號(hào)時(shí),以“default”命名

變更后的文件夾格式如下
fast-loader(二)設(shè)計(jì)

二、加載速度的優(yōu)化

fast-loader首次加載時(shí)涉及解壓,會(huì)導(dǎo)致啟動(dòng)速度比之前下降,而首次之后因?yàn)榘葱杓虞d,總體性能可以比原先得到提升,但是每次都去讀取磁盤(pán)也是一種比較慢的方式,可以考慮設(shè)計(jì)優(yōu)化。
實(shí)際app執(zhí)行中,多數(shù)情況下,無(wú)論多少次的啟動(dòng),其使用的類都基本相同。
基于這個(gè)理念,我們可以考慮將app第一次啟動(dòng)到關(guān)閉過(guò)程中使用到的類復(fù)制到另外一個(gè)文件夾中,之后app啟動(dòng)時(shí)默認(rèn)裝載此路徑下所有類,這樣就可以類似緩存的作用,一定程度上加快啟動(dòng)速度。
所以,文件夾部分還可以做這樣的優(yōu)化
fast-loader(二)設(shè)計(jì)
其中used文件夾為所有類定義后需要寫(xiě)入的文件夾,也是所有使用過(guò)的類的緩存文件夾。
這里有個(gè)小點(diǎn)需要注意,寫(xiě)入緩存成功與否不影響類定義,所以應(yīng)該采用異步寫(xiě)入以避免堵塞。

三、針對(duì)springboot的適配

springboot有它獨(dú)有的包體結(jié)構(gòu),其定義在MATE-INF/MANIFEST.MF文件中,舉個(gè)案例

Manifest-Version: 1.0
Implementation-Title: demo
Implementation-Version: 0.0.1-SNAPSHOT
Start-Class: me.van.DemoApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.1.6.RELEASE
Created-By: Maven Archiver 3.4.0
Main-Class: org.springframework.boot.loader.JarLauncher

通過(guò)這個(gè)文件,我們需要去適配的包括

  • Spring-Boot-Classes:需要將所有類解壓縮至應(yīng)用包文件夾目錄下;
  • Spring-Boot-Lib:依賴的第三方庫(kù),需要將其解壓縮成jar包后再二次解壓;

四、多個(gè)同名資源文件的優(yōu)化

不同jar包可能存在同名的資源文件,而ClassLoader對(duì)資源文件的獲取是允許多個(gè)同時(shí)獲取到的,而我們調(diào)整了對(duì)資源位置的定義,那么我們也要去重寫(xiě)“如何讀取資源文件”這類方法。
同名文件可能存在兩類

  1. jar:同名一般是相同文件,處理方法
    1. 相同hash值,意味著文件內(nèi)容相同,直接取其一即可;
    2. 不同hash值,需要判斷其MANIFEST.MF文件中Manifest-Version的值,保留新版本的jar;
    3. 沒(méi)有MANIFEST.MF文件或沒(méi)有Manifest-Version鍵,取創(chuàng)建時(shí)間遲的jar;
  2. 其它:統(tǒng)一為資源文件,當(dāng)出現(xiàn)相同時(shí),除第一個(gè)文件外,其它命名后面加入.n(此處n為數(shù)字,有1開(kāi)始順序遞增)。

設(shè)計(jì)完成了,實(shí)現(xiàn)部分我們留到下一篇繼續(xù)分享。

fast-loader系列

  1. fast-loader(一)起源

本文題目:fast-loader(二)設(shè)計(jì)
當(dāng)前網(wǎng)址:http://fisionsoft.com.cn/article/jgcpdo.html