日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

垃圾回收机制之复制算法

發布時間:2024/4/13 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 垃圾回收机制之复制算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我再說一下什么是磁盤碎片化,磁盤碎片化表示刪不干凈,比如我格式化磁盤,肯定效率高一點,而且刪的干凈一點,如果一個一個的刪除的話,容易產生碎片,有一部分沒有被刪除掉,你們可以下去自己做一個例子,有的時候刪不干凈,就會產生碎片化的問題,我們再講一個算法,叫復制算法,復制算法是怎么來的呢,復制算法要講到堆內存的劃分,新生代和老年代,左邊叫新生代,右邊可以理解為老年代,新生代里面存的是什么對象,剛出生不久的對象,老年代是被垃圾回收機制回收很多次已經非常穩定的,經常使用的對象就會存在老年代里面,在新生代里面會分為這幾個區域,第一個區域叫做EDEN區域,S0區和S1區,或者from區和to區,S0區和S1區大小是相等的,為什么相等的,為什么S0區和S1區大小要相等呢,是因為這個原因,叫做復制算法,首先我們來舉一個例子,假如我們創建一個對象叫做user1,第一次要放到什么區里面去,我先做創建了一個user1對象,它是要放在EDEN區,還是S0區還是S1區呢,是EDEN區是吧,user1對象會放在EDEN區里面,這個時候我們來了一個user2對象,user2對象是放在EDEN對象還是S0區,還是S1區,一樣的,他也會存在EDEN區里面,如果我們這個GC線程進行回收的時候,發現你們的user1和user2會被經常使用到,你們覺得這個時候會進入到什么區里面去,就是GC線程發現user1和user2經常被使用的情況下,會存放到什么區里面去,記住不是老年代,閥值必須要達到15次以上,比如這個時候我只是達到7,8次的時候,他一般會到from區或者to區,user1,user2一般先到S0區的,這個時候我再來個對象叫做user3,我來了一個叫做user3對象,他是到哪個區里面去,EDEN區是吧,這個時候user3對象到EDEN區里面去,同樣的道理,如果發現EDEN區的user3經常被使用,那么他就會進入到哪個區里面去,是不是S0區,同樣是到S0區,那么這個時候垃圾回收機制,發現你的user1和user2沒有被經常使用,是一個不可達對象的情況下,這個時候怎么辦,比如user1不可達了,垃圾回收機制發現user1不可達了,就是沒有被經常使用的情況下,但是user2和user3仍然被使用的情況下,怎么辦呢,這個時候就會把user2,user3 copy到S1里面去,copy到S1里面去的時候,然后直接把整個S0區給直接清除掉,記住是清除所有的,然后把user2和user3 copy到S1里面去,清除S0的所有,清除的非常非常干凈,這就叫復制算法,這個時候S0就沒有任何數據的,接著我再來一個對象,叫做user4對象,你們說看一下user4是存放在哪一個區域,EDEN區,這個時候user4對象會存放在eden區里面,如果垃圾回收器發現eden區的user4對象經常被使用,這個時候user4對象會晉升到哪個區里面去,是進入到S0區還是S1區呢,user4會晉升到S1區里面去,S0區是沒有任何數據的,是S1區,有人說user4對象不會放到S0區,偏偏要放到S1區呢,這個時候我就告訴你們,就是能夠做復制,記住一點,S0區和S1區一定有一個為空的,他的目的是什么意思啊,目的是為了存放下一個復制,比如這個時候我進行回收的時候,user2和user3沒有繼續使用的情況下,那這個時候怎么辦,user4對象還是會被繼續使用的,user4對象會被放到S0區里面去,然后清除所有的S1區,目的是為了做下一次的切換,這就叫做復制算法,這種算法有什么優點,優點是能夠解決碎片化的問題,而且快速,清理干凈,缺點是浪費空間,比如我們建一個文件夾S0,然后建立一個文件夾S1,S0和S1的大小是相等的,我在S0區建一個對象,叫做user0,然后這個時候再來一個對象叫做user1,當我進行回收的時候,S1區是空的,我發現user0沒有被經常使用的情況下,user1還是被繼續使用,把它copy到S1區來,然后我直接把S0區的文件全部給刪除掉,這就叫復制算法,這就相當于S0就是空的,S1是不是有數據了他的目的是做刪除的比較快一點,可以解決碎片化的問題,這個時候我再來一個對象叫做user2的話,它是存放在S0區還是S1區呢,肯定是S1區,同樣道理,你們現在去看,垃圾回收機制進行回收的時候,S1區的user1對象沒有被經常使用的情況下,我就把S1區的user2對象復制到S0區來,然后把整個的S1區給清掉,是不是可以解決碎片化的問題,移動其實也相當于剪切一樣的,你們說復制可能更好一點移動其實也算是復制,相當于copy一份,我先把存活對象放在另一個區里面,GC回收將可達的對象復制到下一個區域,然后直接刪除當前的區域,你們覺得復制算法一般用在哪個年代里面呢,是用在新生代還是用在老年代里面呢,是新生代還是老年代,這肯定是新生代里面的,如果你在EDEN區直接不可達,那就直接刪掉了,不會進入到S0或者S1區的,如果在S0或者S1區經歷了15次以上,肯定會到老年代里面去的,有的地方吧S0叫做from區,把S1叫做to區,都是一個意思,to區就是S1區

?

總結

以上是生活随笔為你收集整理的垃圾回收机制之复制算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。