java姑娘_初识java这个小姑娘(二)
正版瘋狂java講義第5版編程教材
76.5元
(需用券)
去購買 >
妙解垃圾回收機制
周一,早高峰!!!
五個字,說盡心中的絕望!!!
一段考驗一個人耐力、智力、開車技術以及脾氣的路。 我把車開進了一個沒有紅綠燈的丁字路口,然后就沒有然后了。
來自三個方向的大車小車開始在不大的一塊空間里開始互相斗智斗勇,但是最終的結果永遠是傷敵一千,自損八百。
這種崩潰的心情應該很多人都體會過,特別是本來不用遲到,但是堵車卻能讓你遲到上好幾個小時。
在所有人都陷入絕望的時候,交警同志終于到達現場,開始疏散車輛。
那些給我貼罰單的“討厭”的人,一下子變成了無比高大的存在。
此時已經是快要九點半了,快要兩個小時的時間,我竟然只挪動了兩米不到。
一剎那間,我終于體會到什么是垃圾回收機制,你能體會嗎?
使用java進行編程,但是從來沒有去思考過這個問題的小伙伴們?
這個巨大的丁字路口,可以理解為內存,可以允許有限的車輛在里面通行。
當車輛不停地始駛入,就像是無數的線程都要放到內存中,需要被處理。
終于,內存爆了。接下來的一幕就是內存溢出,停止工作。
那些已經被不會被使用的垃圾線程依然停留在內存當中,就好像橫在我眼前的這個大卡車。(當然對我來說,除了我之外的所有的車輛都是垃圾,應該被回收掉)
這個時候,內心里有一個聲音:如果有人能把它們帶走就好了。
于是,交警來了,他就是java中的垃圾回收機制。
他以極快的速度把所有停滯在內存當中的廢棄線程快速的清除出去。
于是,終于,一切又開始高速的運轉開來。
在java之前眾多的編程語言,都是通過編程人員自己來清除內存中已經被廢棄掉的無用線程或者對象。
使得程序員的精力過多的消耗在了系統上。
如果系統自身可以完成這部分工作,程序員就能夠更多的去關注業務本身而不是系統效率。
這樣做的好處是解放程序的大腦,但是壞處也是顯而易見的。
那就是系統提供的垃圾回收機制無法做到像人工操作一樣,在第一時間就知道代碼中的對象已經使用完畢,而立即清除。
系統需要固定的時間和固定的方式來做這件事情。
好在通過jdk不斷升級,java語言的維護團隊對效率做了很大的優化。
在開始詳細介紹垃圾回收機制的工作原理之前,有一個小小的思維拓展。
我記得剛開始接觸到java的時候,老師講對象在內存中的存儲時,總是告訴我,引用存儲在棧中,而對象是存儲在堆中。
老實說,即使是幾年之后,如此抽象的講解依然讓我無法理解java的底層工作到底是怎樣的?
而所謂的棧,堆又到底是什么,根本沒有一個解釋能讓人直觀的理解程序在內存中到底是怎樣進行工作的。
那么說一些我自己的理解。
眾所周知,計算機所有的工作原理是建立在二進制上。
所謂二進制,課本告訴我們是由1,0組成的一種進制,而原因是機器只能識別二進制。
好吧,關于二進制其實也是云霧繚繞的存在,我現在特別不理解在課堂上老師怎么能如此官面的解釋二進制。
我們輸入指令,計算機要做的事情有兩個,第一是識別這道指令,第二是執行這道指令。
那么是否可想想象二進制的存儲方式就是一種信息的表達,就是把1,0按照機器能夠識別的記錄順序進行排序,而計算機通過閱讀這一串1,0組成的機器碼,了解了指令的內容。
然后它處理完這道指令之后,又以1,0的方式反饋給我們,這種二進制的信息存儲最終被翻譯成了我們能夠識別的文字,音樂,圖像等等。
說到底,二級制就是一種信息的存儲方式罷了。
那么所謂的棧,是否可以理解為java虛擬機將內存中的某一塊區域指定為棧,這塊區域是通過1,0 的方式存儲指令。
內存就像二元矩陣,而虛擬機劃分了一塊作為棧或者堆。
這種指定本身也不是固定,也許下一次虛擬機指定了另外的地方。
如此是否可以更好地理解所謂的棧和堆呢。
不過是強行劃分的內存區域,并且在這個區域中是按照java虛擬機指定的規則進行數據的存儲和閱讀的。
不知這樣的理解是否正確,還請指正。
下面說說java的回收機制到底是怎么工作的。
1.stop-the-world這幾個字一度讓我覺得這不是代碼,而是詩。
是怎樣的一個詩人,才能給這段程序如此詩意的一個名字。
Stop-the-world意味著 JVM 因為要執行GC而停止了應用程序的執行。
當Stop-the-world發生時,除了GC所需的線程以外,所有線程都處于等待狀態,直到GC任務完成。
GC優化很多時候就是指減少Stop-the-world發生的時間。
2.垃圾回收機制是怎樣辨別哪些對象是需要進行回收的?在此時我們大體梳理一下整個過程。
在Java中,開發人員無法直接在程序代碼中清理內存,而是由垃圾回收器自動尋找不必要的垃圾對象,并且清理掉他們。
垃圾回收器會在下面兩種假設(hypotheses)成立的情況下被創建(稱之為假設不如改為推測(suppositions)或者前提(preconditions))。
大多數對象會很快變得不可達
只有很少的老年對象(創建時間較長的對象)指向新生對象的引用
這些假設我們稱之為弱年代假設(weak generational hypothesis)。
為了強化這一假設,虛擬機將其物理上劃分為兩個–新生代(young generation)和老年代(old generation)。
新生代(Young generation):絕大多數最新被創建的對象會被分配到這里,由于大部分對象在創建后會很快變得不可到達,所以很多對象被創建在新生代,然后消失。對象從這個區域消失的過程我們稱之為”minor GC“。
老年代(Old generation):對象沒有變得不可達,并且從新生代中存活下來,會被拷貝到這里。其所占用的空間要比新生代多。也正由于其相對較大的空間,發生在老年代上的GC要比新生代少得多。對象從老年代中消失的過程,我們稱之為”major GC“(或者”full GC“)
新生代的構成
為了更好地理解GC,我們現在來學習新生代,新生代是用來保存那些第一次被創建的對象,他可以被分為三個空間
一個伊甸園空間(Eden)
兩個幸存者空間(Survivor)
一共有三個空間,其中包含兩個幸存者空間。每個空間的執行順序如下:
絕大多數剛剛被創建的對象會存放在伊甸園空間。
在伊甸園空間執行了第一次GC之后,存活的對象被移動到其中一個幸存者空間。
此后,在伊甸園空間執行GC之后,存活的對象會被堆積在同一個幸存者空間。
當一個幸存者空間飽和,還在存活的對象會被移動到另一個幸存者空間。
之后會清空已經飽和的那個幸存者空間。
在以上的步驟中重復幾次依然存活的對象,就會被移動到老年代。
如果你仔細觀察這些步驟就會發現,其中一個幸存者空間必須保持是空的。
如果兩個幸存者空間都有數據,或者兩個空間都是空的,那一定標志著你的系統出現了某種錯誤。
老年代GC處理機制
老年代空間的GC事件基本上是在空間已滿時發生,執行的過程根據GC類型不同而不同。
到此為止,是否可以更加直觀的理解所謂垃圾回收機制.
這是我對java語言的一些簡單理解,原創作品,歡迎關注同名微信訂閱號:程序員與工匠。
歡迎各位大大掃描下方二維進
行關注。
原文鏈接:http://www.cnblogs.com/zccxy/p/8041974.html
java 11官方入門(第8版)教材
79.84元
包郵
(需用券)
去購買 >
總結
以上是生活随笔為你收集整理的java姑娘_初识java这个小姑娘(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: w7提示无法关闭计算机,win7关不了机
- 下一篇: w ndows7与XP哪个好,windo