深入分析java web技術內幕

weixin_34185560發表於2017-06-21

此書時候閒暇時間閱讀,或者尋求技術難題解決方案的時候閱讀。

4914401-20d986902ca22184.png
4914401-577599d929ced95a.png


但是直接I/O有負面影響,如果訪問的資料不在應用程式快取中,那麼每次資料都會直接從磁碟進行載入,這種直接載入會非常緩慢。通常直接I/O與非同步I/O結合使用,會得到比較好的效能。

4914401-b8e08bfb73f60492.png


4914401-161d383f9cce238f.png

java訪問磁碟檔案:

檔案是上層應用程式操作磁碟資料的最小單元。

檔案也是作業系統和磁碟驅動器互動的最小單元。


4914401-82c82de59c6075be.png

java序列化就是想一個物件轉換成一串二進位制的位元組陣列,通過儲存或者轉移這些位元組資料來達到持久化的目的,反序列化則是相反的過程,將這個位元組陣列再重新構造成物件。我們知道反序列化時,必須有原始類作為模板,才能將這個物件還原,從這個過程我們可以猜測,序列化的資料並不像class檔案暗中儲存類的完整的結構資訊,那麼序列化的資料到底都含有那些資訊?




4914401-ae1d9d797bad5554.png


4914401-a268b6f225280fc5.png


4914401-80f3db2eabc7455d.png


4914401-4e47836c1f7f4ae9.png


4914401-883828426bbdd65d.png


4914401-69ca433e2b708dd9.png


4914401-dd18718e8a792af6.png


4914401-bb9f7932743f346c.png


4914401-53d8fcaf6e980d48.png


4914401-190597843b0a9061.png


4914401-a28872fd7ffb4f65.png


4914401-f248b388fcb9d938.png

FileChannel.transferXXX與傳統的訪問檔案的方式相比可以減少資料從核心到使用者控制元件的複製,資料直接在核心空間中移動,在Linux中使用sendfile系統呼叫


4914401-169d7da6294887e9.png

FileChannel.map 將檔案按照一定大小塊對映為記憶體區域,當程式訪問這個記憶體區域時將直接操作這個檔案資料,這種方式省去了資料從核心空間向使用者空間複製的損耗。這種方式適合對大檔案的只讀的操作,如大檔案的MD5校驗。但是這種方法是和作業系統的底層I/O實現相關。

4914401-9c1873c4470500e0.png


4914401-3c3dd43905f73aee.png

IOPS 由磁碟的轉速決定,磁碟的轉速越高,磁碟的IOPS越高。

RAID技術,就是講不通的磁碟組合起來提高I/O的效能


4914401-141e977631dd0ac8.png

通常提升磁碟I/O的效能的方法有:

增加快取,減少磁碟訪問次數

優化磁碟的管理系統,設計最優的磁碟方式策略,以及磁碟的定址策略,這是在底層作業系統層面考慮。

設計合理的磁碟儲存資料塊,以及訪問這些資料塊的策略,這是在應用層面考慮的。例如,我們可以給存放的資料設計索引,通過定址索引加快和減少磁碟的訪問量,還可以採用非同步和非非同步的阻塞的方式加快磁碟的訪問速度。

應用合理的RAID策略提升磁碟的I/O RAID 策略及


4914401-4b6be652a35bc945.png

如果發現大量的TIME-WAIT的話,可以設定tcp_fin_timeout為更小的值來釋放請求。

我們通過另一臺主機用 ab -c 30 -n 1000000 10.232.101.208:8080/   來壓測這臺機器,看看網路的連結情況。


網路io優化

減少網路互動的次數

減少網路傳輸資料量的大小

減少編碼  位元組和字元之間的編碼比較耗時


4914401-b3fcdcb15fcf570c.png


介面卡模式和裝飾器模式的區別:

裝飾器與介面卡模式都有一個別名就是包裝模式wrapper,它們看似都是起到包裝一個類或物件的作用,但是他們使用他們的目的不一樣。介面卡模式的一是一是將一個介面轉換成另一個介面,它的目的是通過改變介面來達到重複使用的目的;而裝飾器decorator模式不是要改變被裝飾介面,而是恰恰要保持原有的介面,但是增強原有物件的功能,或者改變又有物件的處理方法而提升效能。


深入分析java web中的中文編碼問題

一個http請求怎麼控制編碼格式;如何避免出現中文編碼問題

儲存單元 byte 位元組-----8位  從char----byte  必須編碼

ASCII、ISO-8859-1,GB2312,GBK,UTF-8,UTF-16

GB2312,GBK,UTF-8,UTF-16都可以表示漢字

在java中需要編碼的場景

在I/O操作中存在的編碼


4914401-edbee128ceb3953d.png


具體的位元組到字元的編碼實現,委託StreamDecoder

在StreamDecoder編碼的過程中必須由使用者指定charset編碼格式


JAVAWEB  技術內幕第三章

現在大部分基礎的java框架或系統預設的字元編碼都是ISO-8859-1很容易出現亂碼問題


4914401-380230581e328efc.png

GB2312對應的Charset是sun.nio.cs.ext.EUC_CN,對應的CharsetDecoder編碼類是sun.nio.cs.ext.DoubleByte。

GBK的碼錶更長,可以包含的漢字字元更多,相容GB2312

UTF-8對單位元組範圍內的字元仍然用1個位元組表示,對漢字採用3個位元組表示

UTF-8編碼與GBK和GB2312不同,不用查碼錶,所以UTF-8的編碼效率更高。



深入分析classLoader 工作機制

載入類

審查誰載入了類(父有限的等級載入機制)

優點:保證所有的類都能被正確的載入

整個JVM平臺提供三層ClassLoader,這三層ClassLoader可以分為兩種型別,可以理解為接待室服務的接待室為會員服務的接待室兩種。


1、Bootstrap classloader 這個classloader就是接待室服務自身的,她主要載入JVM自身工作需要的類。這個ClassLoader完全是有JVM自己控制的,許可權自己控制,別人無權訪問,所以這個classloader不遵守前面介紹的載入規則,

2、ExtClassLoader,這個類載入器有點特俗,它是JVM自身的一部分,談事它的血統不是很純正,它並不是JVM親自實現的,可以理解為類載入器,服務特定目標System.getProperties("java.ext.dirs")目錄下。

3、AppClassLoader,這個類載入器就是專門為接待會員服務的,它的父類是ExtClassLoader。它服務的目標是廣大普通會員,所在System.getProperty("java.class.path")目錄下的類都可以被這個類載入器載入,這個目錄就是我們經常用到的classpath。

如果我們要實現自己的類載入器,不管你是直接實現抽象類ClassLoader,還是整合URLClassLoader類,或者其他子類,它的父類載入器都是AppClassLoader作為父類載入器。而getSystemClassLoader()方法取到的正式AppClassLoader。



4914401-76d42b90666451a7.png


Bootstrap classloader並不屬於JVM的類等級層次,因為BootStrap classloader並沒有遵守Classloader的載入規則。



4914401-95d6dab58068cfd1.png

JVM載入class檔案到記憶體有兩種方式。

隱式載入:所謂隱式載入就是不通過在程式碼裡呼叫classloader來載入需要的類,而是通過JVM來自動載入需要的類到記憶體的方式。當我們在類中繼承或者引用某個累時,JVM在解析當前的這個類時發現引用的類不在記憶體中,那麼就會自動將這個了載入到記憶體中

顯示載入。。。。。,this.getClassLoader().loadClass(""),Class.forName(),或者我們自己實現ClassLoader的findClass


4914401-0de47f394226054c.png



4914401-07e9163b4ee846df.png


實現類的熱部署

JVM在載入類之前會檢查請求的類是否已經載入過來了,也就是要呼叫findloaderclass方法檢視是否能夠返回類例項。如果類已經載入過來,再呼叫cloadclasshi導致類衝突,但是JVM表示一個類是否是同一個類會有兩個條件。一是看這個類完整的類名是否一樣,這個類名包括類所在的包名。二是看載入的這個類classLoader是否是同一個,這裡所說的同一個是指classloader的例項是否是同一個例項。即使是同一個classloader的類的兩個例項,載入同一個類也會不一樣。所以要實現類的熱部署可以建立不同的classloader的例項物件,然後通過這個不同的例項物件來載入同名的類。


4914401-07ece07f8a6e5a18.png


4914401-ea67b4a018fa340b.png


java應不應該動態載入類

java的優勢就是基於共享物件的機制,叨叨資訊的高度共享,也就是儲存並持有物件的狀態而省去類的資訊的重複建立和回收。

相關文章