jvm演算法
㈠ 如何計算應該給jvm的堆多少空間
java沒有提供現成的函數去計算對象的內存空間,不過可以用大量產生某個對象然後計算平均值的方法近似獲得該對象佔用的內存。 寫個例子給你: public class Test{ long f1 = Runtime.getRuntime().freeMemory(); for(int i=0;i
㈡ 如何設置JVM參數
設置eclipse jvm參數
打開Eclipse 或者 MyEclipse
打開 Windows -> Preferences -> Java -> Installed JREs
在 Default VM Arguments輸入框內輸入: -Xms512m -Xmx512m
解釋:
-Xms是設置java虛擬機的最小分配內存;-Xmx則是最大分配內存;512m為內存空間
一般-Xmx設置為你電腦物理內存的1/4,而把-Xms和 -Xmx設置為一樣,
其實你可以設置得更大一些,只要系統能分配足夠的內存就可以了,如果設置過大系統會提示你的。
㈢ 以下哪些jvm的垃圾回收方式採用的是復制演算法
System.gc是專門回收不用的對象的語法,當然你也可以自己寫函數來finalization()你的程序。一般JVM會根據虛擬內存佔用率來自動調用gc(garbage collector),有時候即便你調用gc如果內存佔用不多回收處理工作也不會調用的,畢竟調用一次也要佔用資
㈣ java 的JVM虛擬內存是如何管理的啊。
說起垃圾收集(Garbage Collection,下文簡稱GC),大部分人都把這項技術當做Java語言的伴生產物。事實上GC的歷史遠遠比Java來得久遠,在1960年誕生於MIT的Lisp是第一門真正使用內存動態分配和垃圾收集技術的語言。當Lisp還在胚胎時期,人們就在思考GC需要完成的3件事情:哪些內存需要回收?什麼時候回收?怎麼樣回收?
經過半個世紀的發展,目前的內存分配策略與垃圾回收技術已經相當成熟,一切看起來都進入「自動化」的時代,那為什麼我們還要去了解GC和內存分配?答案很簡單:當需要排查各種內存溢出、泄漏問題時,當垃圾收集成為系統達到更高並發量的瓶頸時,我們就需要對這些「自動化」的技術有必要的監控、調節手段。
把時間從1960年撥回現在,回到我們熟悉的Java語言。本文第一章中介紹了Java內存運行時區域的各個部分,其中程序計數器、VM棧、本地方法棧三個區域隨線程而生,隨線程而滅;棧中的幀隨著方法進入、退出而有條不紊的進行著出棧入棧操作;每一個幀中分配多少內存基本上是在Class文件生成時就已知的(可能會由JIT動態晚期編譯進行一些優化,但大體上可以認為是編譯期可知的),因此這幾個區域的內存分配和回收具備很高的確定性,因此在這幾個區域不需要過多考慮回收的問題。而Java堆和方法區(包括運行時常量池)則不一樣,我們必須等到程序實際運行期間才能知道會創建哪些對象,這部分內存的分配和回收都是動態的,我們本文後續討論中的「內存」分配與回收僅僅指這一部分內存。
對象已死?
在堆裡面存放著Java世界中幾乎所有的對象,在回收前首先要確定這些對象之中哪些還在存活,哪些已經「死去」了,即不可能再被任何途徑使用的對象。
引用計數演算法(Reference Counting)
最初的想法,也是很多教科書判斷對象是否存活的演算法是這樣的:給對象中添加一個引用計數器,當有一個地方引用它,計數器加1,當引用失效,計數器減1,任何時刻計數器為0的對象就是不可能再被使用的。
客觀的說,引用計數演算法實現簡單,判定效率很高,在大部分情況下它都是一個不錯的演算法,但引用計數演算法無法解決對象循環引用的問題。舉個簡單的例子:對象A和B分別有欄位b、a,令A.b=B和B.a=A,除此之外這2個對象再無任何引用,那實際上這2個對象已經不可能再被訪問,但是引用計數演算法卻無法回收他們。
根搜索演算法(GC Roots Tracing)
在實際生產的語言中(Java、C#、甚至包括前面提到的Lisp),都是使用根搜索演算法判定對象是否存活。演算法基本思路就是通過一系列的稱為「GC Roots」的點作為起始進行向下搜索,當一個對象到GC Roots沒有任何引用鏈(Reference Chain)相連,則證明此對象是不可用的。在Java語言中,GC Roots包括:
1.在VM棧(幀中的本地變數)中的引用
2.方法區中的靜態引用
3.JNI(即一般說的Native方法)中的引用
㈤ jvm 內存模型,gc回收機制,有哪些演算法
以前有過類似的問題 可以參考下:
http://blog.csdn.net/zhangpengju999/article/details/11773183
㈥ jvm里的Mark-compact到底是標記壓縮演算法還是標記整理演算法
首先是mutator和collector,這兩個名詞經常在垃圾收集演算法中出現,collector指的就是垃圾收集器,而mutator是指除了垃圾收集器之外的部分,比如說我們應用程序本身。mutator的職責一般是NEW(分配內存),READ(從內存中讀取內容),WRITE(將內容寫入內存),而collector則就是回收不再使用的內存來供mutator進行NEW操作的使用。
㈦ jvm垃圾回收演算法有哪些
1.標記–清除演算法
執行步驟:
標記:遍歷內存區域,對需要回收的對象打上標記。
清除:再次遍歷內存,對已經標記過的內存進行回收。
2.復制演算法
將內存劃分為等大的兩塊,每次只使用其中的一塊。當一塊用完了,觸發GC時,將該塊中存活的對象復制到另一塊區域,然後一次性清理掉這塊沒有用的內存。下次觸發GC時將那塊中存活的的又復制到這塊,然後抹掉那塊,循環往復。
3. 標記–整理演算法
因為前面的復制演算法當對象的存活率比較高時,這樣一直復制過來,復制過去,沒啥意義,且浪費時間。所以針對老年代提出了「標記整理」演算法。
執行步驟:
標記:對需要回收的進行標記
整理:讓存活的對象,向內存的一端移動,然後直接清理掉沒有用的內存。
4. 分代收集演算法
當前大多商用虛擬機都採用這種分代收集演算法,這個演算法並沒有新的內容,只是根據對象的存活的時間的長短,將內存分為了新生代和老年代,這樣就可以針對不同的區域,採取對應的演算法。如:
新生代,每次都有大量對象死亡,有老年代作為內存擔保,採取復制演算法。
老年代,對象存活時間長,採用標記整理,或者標記清理演算法都可。
㈧ JVM有哪些垃圾回收演算法
標記-清除,標記-復制,標記-整理
㈨ JVM針對年輕代和老年代的GC演算法有什麼區別
年輕代大多數都是用完就刪的,所以年輕代用的是標記復制,把不刪的標記出來,然後復制,最後清空。而老年代的是已經經過一次gc存活下來的,大多都是要長時間用的,要刪除的少,所以採用的是,標記刪除,把要刪除的標記出來,統一刪除
㈩ jvm新生代串列收集器採用什麼演算法
1.JVM的gc概述 gc即垃圾收集機制是指jvm用於釋放那些不再使用的對象所佔用的內存。java語言並不要求jvm有gc,也沒有規定gc如何工作。不過常用的jvm都有gc,而且大多數gc都使用類似的演算法管理內存和執行收集操作。 在充分理解了垃圾收集演算法和執