計算機的組成分爲:數據、指令和控制三部分。一樣JVM在大體上也能夠如此區分爲:
數據:方法區、Heap堆
指令:程序計數器、虛擬機棧、本地方法棧。(能夠經過javap -c -v xxx.class > yyy.txt查看指令)java
程序計數器:指向當前線程正在執行的字節碼指令的地址(行號)算法
虛擬機棧:每一個方法在執行的時候都會建立一個對應的棧幀用於存儲局部變量表、操做棧、動態連接、方法出口等信息。方法是由線程執行的,線程只是一個執行體,因此也會存儲在虛擬機棧中。 stackoutflowerror安全
本地方法棧:虛擬機使用native方法的服務jvm
方法區:用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。(class文件等)線程
堆(heap):java虛擬機中所管理的內存中最大的一塊,全部線程共享的一塊內存區域,在虛擬機啓動時建立。此內存區域的惟一目的是存放對象實例,幾乎全部的對象實例都在這裏分配內存。outofmemorryerror3d
java gc 主要回收的是 方法區 和 堆中的內容對象
在雙端循環,互相引用的時候,容易報錯,目前不多使用這種方式了blog
複製算法在年輕代的時候,進行使用,複製時候有交換內存
優勢:沒有產生內存碎片編譯器
先標記,後清除,缺點是會產生內存碎片,用於老年代多一些
標記清除整理
可是須要付出代價,由於移動對象須要成本