1. 緩衝I/O 1.1. 對於文件和套接字,壓縮和字元串編碼的操作,必須適當地對I/O進行緩衝 1.1.1. 兩個流操作的是位元組塊(來自緩衝流)而不是一系列的單位元組(來自ObjectOutputStream),它們會運行得更好 1.2. InputStream.read() 1.3. Output ...
1. 緩衝I/O
1.1. 對於文件和套接字,壓縮和字元串編碼的操作,必須適當地對I/O進行緩衝
1.1.1. 兩個流操作的是位元組塊(來自緩衝流)而不是一系列的單位元組(來自ObjectOutputStream),它們會運行得更好
1.2. InputStream.read()
1.3. OutputStream.write()
1.4. 操作的是單個字元
1.5. FileInputStream.read()
1.6. FileInputStream.write()
1.7. 慢
1.8. 二進位數據的文件I/O
1.8.1. BufferedInputStream或BufferedOutputStream來包裝底層的文件流
1.9. 使用字元(字元串)數據的文件I/O
1.9.1. BufferedReader或BufferedWriter來包裝底層的流
1.10. ByteArrayInputStream類和ByteArrayOutputStream類
1.10.1. 用緩衝過濾流包裝它們,意味著數據會被覆制兩次
1.10.1.1. 被覆制到過濾流的緩衝區
1.10.1.2. 被覆制到ByteArrayInputStream的緩衝區
1.10.1.3. 輸出流也是如此
1.10.2. 在沒有其他流參與的時候,應該避免緩衝I/O
1.11. GZIPOutputStream
1.11.1. 操作數據塊比操作單位元組數據更高效
1.12. ObjectOutputStream
1.12.1. 將單位元組數據發送到下一個流
1.12.2. 下一個流是最終目的地
1.12.2.1. ByteArrayOutputStream,則無須緩衝
1.12.2.2. 中間有另一個過濾流,如GZIPOutputStream,有必要緩衝
2. 隨機數
2.1. java.util.Random
2.1.1. 主要操作(nextGaussian()方法)是同步的
2.1.2. 鎖上都會產生競爭
2.2. java.util.concurrent.ThreadLocalRandom
2.2.1. 當每個線程都有自己的隨機數生成器時,Random類的同步就不再是問題
2.3. 偽隨機演算法
2.3.1. 確定性的
2.3.1.1. 並不能真正做到隨機
2.3.2. 通過特定生成器查看這個數字序列,並最終算出下一個數字會是什麼
2.4. java.security.SecureRandom
2.4.1. 使用一個系統介面來為其隨機數據獲取種子
2.4.2. 提供的數據基於真正的隨機事件(如滑鼠的移動)
2.4.3. 基於熵的隨機性(entropy-based randomness)
2.4.3.1. 更安全
2.4.4. generateSeed()方法花費的時間無法確定,這取決於系統有多少未使用的熵
2.4.4.1. 性能本身變成了隨機
2.4.4.2. 更好的解決方案是設置操作系統,使其提供更多的熵,這可以通過運行rngd守護進程來實現
2.4.5. SecureRandom類的阻塞問題可以通過修改配置來避免,但最好在操作系統層面通過給系統增加熵來解決
3. 類數據共用
3.1. Java 11
3.2. class data sharing,CDS
3.2.1. JVM之間共用類元數據的一種機制
3.2.2. 可以縮短JVM的啟動時間
3.3. 只適用於從模塊或JAR文件載入的類,不能共用(或加速載入)來自文件系統或網路URL的類
3.4. 常規的CDS(共用預設的JDK類)
3.5. 應用程式類數據共用
3.5.1. 可以共用任何一組類
3.6. XX:+DumpLoadedClassList=filename標誌來運行你的應用程式
3.6.1. 將(在filename文件中)生成一個列表,其中包含你的應用程式已經載入的所有類
3.7. 使用這個類列表來生成共用存檔
$ java -Xshare:dump -XX:SharedClassListFile=filename \
-XX:SharedArchiveFile=myclasses.jsa \
……類路徑參數……
3.8. 使用共用存檔來運行應用程式
$ java -Xshare:auto -XX:SharedArchiveFile=myclasses.jsa ……其他參數……