Golang與Java的區別
時間:2020-11-25 15:21來源:我愛學習網 作者:apple 點擊:
次
語言設計上的區別
- 語言是天然的并發語言,運行在用戶態,處理器之間的上下文切換消耗可以非常低。
- Go語言內部設計MPG模型,具體可以參見之前的文章「簡單概括Goroutine特點」
- Goroutine大小默認是4kb
- Goroutine大小會隨著占用內存多少而動態增加,不會固定大小,這樣也節省了內存的使用
- 多線程語言,需要OS內核參與線程間上下文切換,消耗性能
- 線程大小默認1M,可以通過OSS進行線程大小配置,但是也遠小于Goroutine中默認的4kb。
- Java線程大小設置好是固定的
- 俗稱逃逸分析
- 內存分配存在兩部分:第一部分是動態分配的全局堆,第二部分是運行在Goroutine中的局部棧
- 人為無法通過特殊的途徑讓對象分布在某個區域(比如java中的new關鍵字)
- 編譯時能判斷字段占用內存大小且明確生命周期的變量會分配在「局部?!怪?,其他情況會動態分配在「全局堆」
- 棧分配比較便宜,堆分配比較貴;棧就只是棧內分配和棧內分解,堆需要垃圾回收
- new 關鍵字創建的對象全都分配在堆中,最終通過垃圾回收期進行回收
- 混合寫屏障:避免了對象變更引用時候被當做垃圾進行回收。
- 標記刪除
- 復制刪除
- 標記整理
- CMS
- G1
- 垃圾收集器
- Serial串行收集器,老年代是Serial Old,不會使用
- Parallel Scavenge并行收集器,老年代是 Parallel Old。
- CMS 收集器,運行在老年代;對應的新生代收集器是ParNew
- G1保留分代收集的特點,增加Region區域,根據標記刪除的方式標記需要垃圾回收的Region,進行排序,根據Region由大到小排序 (排序的目的是可以清晰的知道哪些Region占用內存大),再根據垃圾回收所消耗的時間判斷 哪些Region需要優先回收。
- 基于CSP原理,通過通訊來共享內存
- Go中channel關鍵字
- 通過共享內存在通訊
- 多線程之間需要用volatile 保證通向內存的可見性
|
------分隔線----------------------------