日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

JVM系列之深入理解JVM(三)

發(fā)布時(shí)間:2024/1/8 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM系列之深入理解JVM(三) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄:
HotSpot 虛擬機(jī)詳解:
類加載機(jī)制:
JMM Java內(nèi)存模型:
Java運(yùn)行時(shí)數(shù)據(jù)區(qū):
堆的內(nèi)存劃分:
JVM優(yōu)化:
GC垃圾回收:
一 HOTSPOT虛擬機(jī)詳解
1、 Java對(duì)象創(chuàng)建過(guò)程:

(1)虛擬機(jī)遇到一條new指令時(shí),首先檢查這個(gè)指令的參數(shù)能否在常量池中定位到一個(gè)類的符號(hào)引用,并檢查這個(gè)符號(hào)引用代表的類是否已經(jīng)加載、連接和初始化。如果沒有,就執(zhí)行該類的加載過(guò)程。
(2)**為該對(duì)象分配內(nèi)存。**A、假設(shè)Java堆是規(guī)整的,所有用過(guò)的內(nèi)存放在一邊,空閑的內(nèi)存放在另外一邊,中間放著一個(gè)指針作為分界點(diǎn)的指示器。那分配內(nèi)存只是把指針向空閑空間那邊挪動(dòng)與對(duì)象大小相等的距離,這種分配稱為“指針碰撞”
B、假設(shè)Java堆不是規(guī)整的,用過(guò)的內(nèi)存和空閑的內(nèi)存相互交錯(cuò),那就沒辦法進(jìn)行“指針碰撞”。虛擬機(jī)通過(guò)維護(hù)一個(gè)列表,記錄哪些內(nèi)存塊是可用的,在分配的時(shí)候找出一塊足夠大的空間分配給對(duì)象實(shí)例,并更新表上的記錄。這種分配方式稱為“空閑列表“。
C、使用哪種分配方式由Java堆是否規(guī)整決定。Java堆是否規(guī)整由所采用的垃圾收集器是否帶有壓縮整理功能決定。
D、分配對(duì)象保證線程安全的做法:虛擬機(jī)使用CAS失敗重試的方式保證更新操作的原子性。(實(shí)際上還有另外一種方案:每個(gè)線程在Java堆中預(yù)先分配一小塊內(nèi)存,稱為本地線程分配緩沖,TLAB。哪個(gè)線程要分配內(nèi)存,就在哪個(gè)線程的TLAB上分配,只有TLAB用完并分配新的TLAB時(shí),才進(jìn)行同步鎖定。虛擬機(jī)是否使用TLAB,由-XX:+/-UseTLAB參數(shù)決定)
(3)虛擬機(jī)為分配的內(nèi)存空間初始化為零值(默認(rèn)值)(4)虛擬機(jī)對(duì)對(duì)象進(jìn)行必要的設(shè)置,例如這個(gè)對(duì)象是哪個(gè)類的實(shí)例、如何才能找到對(duì)象的元數(shù)據(jù)信息、對(duì)象的Hash碼、對(duì)象的GC分代年齡等信息。這些信息存放在對(duì)象的對(duì)象頭中。(5) 執(zhí)行方法,把對(duì)象按照程序員的意愿進(jìn)行初始化。2、 對(duì)象的定位訪問(wèn)的方式(通過(guò)引用如何去定位到堆上的具體對(duì)象的位置):(1)句柄:使用句柄的方式,Java堆中將會(huì)劃分出一塊內(nèi)存作為作為句柄池,引用中存儲(chǔ)的就是對(duì)象的句柄的地址。而句柄中包含了對(duì)象實(shí)例數(shù)據(jù)和對(duì)象類型數(shù)據(jù)的地址。

(2)直接指針:使用直接指針的方式,引用中存儲(chǔ)的就是對(duì)象的地址。Java堆對(duì)象的布局必須必須考慮如何去訪問(wèn)對(duì)象類型數(shù)據(jù)。

(3)兩種方式各有優(yōu)點(diǎn):A、使用句柄訪問(wèn)的好處是引用中存放的是穩(wěn)定的句柄地址,當(dāng)對(duì)象被移動(dòng)(比如說(shuō)垃圾回收時(shí)移動(dòng)對(duì)象),只會(huì)改變句柄中實(shí)例數(shù)據(jù)指針,而引用本身不會(huì)被修改。B、使用直接指針,節(jié)省了一次指針定位的時(shí)間開銷。3、HotSpot的GC算法實(shí)現(xiàn):(1)HotSpot怎么快速找到GC Root?HotSpot使用一組稱為OopMap的數(shù)據(jù)結(jié)構(gòu)。在類加載完成的時(shí)候,HotSpot就把對(duì)象內(nèi)什么偏移量上是什么類型的數(shù)據(jù)計(jì)算出來(lái),在JIT編譯過(guò)程中,也會(huì)在棧和寄存器中哪些位置是引用。這樣子,在GC掃描的時(shí)候,就可以直接知道哪些是可達(dá)對(duì)象了。(2)安全點(diǎn):A、HotSpot只在特定的位置生成OopMap,這些位置稱為安全點(diǎn)。B、程序執(zhí)行過(guò)程中并非所有地方都可以停下來(lái)開始GC,只有在到達(dá)安全點(diǎn)是才可以暫停。C、安全點(diǎn)的選定基本上以“是否具有讓程序長(zhǎng)時(shí)間執(zhí)行“的特征選定的。比如說(shuō)方法調(diào)用、循環(huán)跳轉(zhuǎn)、異常跳轉(zhuǎn)等。具有這些功能的指令才會(huì)產(chǎn)生Safepoint。(3)中斷方式:

A、搶占式中斷:在GC發(fā)生時(shí),首先把所有線程中斷,如果發(fā)現(xiàn)有線程不在安全點(diǎn)上,就恢復(fù)線程,讓它跑到安全點(diǎn)上。
B、主動(dòng)式中斷:GC需要中斷線程時(shí),不直接對(duì)線程操作,僅僅設(shè)置一個(gè)標(biāo)志,各個(gè)線程執(zhí)行時(shí)主動(dòng)去輪詢這個(gè)標(biāo)志,當(dāng)發(fā)現(xiàn)中斷標(biāo)記為真就自己中斷掛起。輪詢標(biāo)記的地方和安全點(diǎn)是重合的。
(5)安全區(qū)域:一段代碼片段中,對(duì)象的引用關(guān)系不會(huì)發(fā)生變化,在這個(gè)區(qū)域中任何地方開始GC都是安全的。在線程進(jìn)入安全區(qū)域時(shí),它首先標(biāo)志自己已經(jīng)進(jìn)入安全區(qū)域,在這段時(shí)間里,當(dāng)JVM發(fā)起GC時(shí),就不用管進(jìn)入安全區(qū)域的線程了。在線程將要離開安全區(qū)域時(shí),它檢查系統(tǒng)是否完成了GC過(guò)程,如果完成了,它就繼續(xù)前行。否則,它就必須等待直到收到可以離開安全區(qū)域的信號(hào)。4、 GC時(shí)為什么要停頓所有Java線程?因?yàn)镚C先進(jìn)行可達(dá)性分析??蛇_(dá)性分析是判斷GC Root對(duì)象到其他對(duì)象是否可達(dá),假如分析過(guò)程中對(duì)象的引用關(guān)系在不斷變化,分析結(jié)果的準(zhǔn)確性就無(wú)法得到保證。5、 CMS收集器:(1)一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器。(2)一般用于互聯(lián)網(wǎng)站或者B/S系統(tǒng)的服務(wù)端(3)基于標(biāo)記-清除算法的實(shí)現(xiàn),不過(guò)更為復(fù)雜,整個(gè)過(guò)程為4個(gè)步驟:

A、初始標(biāo)記:標(biāo)記GC Root能直接引用的對(duì)象
B、并發(fā)標(biāo)記:利用多線程對(duì)每個(gè)GC Root對(duì)象進(jìn)行tracing搜索,在堆中查找其下所有能關(guān)聯(lián)到的對(duì)象。
C、重新標(biāo)記:為了修正并發(fā)標(biāo)記期間,用戶程序繼續(xù)運(yùn)作而導(dǎo)致標(biāo)志產(chǎn)生變動(dòng)的那一部分對(duì)象的標(biāo)記記錄。
D、并發(fā)清除:利用多個(gè)線程對(duì)標(biāo)記的對(duì)象進(jìn)行清除
(4)由于耗時(shí)最長(zhǎng)的并發(fā)標(biāo)記和并發(fā)清除操作都是用戶線程一起工作,所以總體來(lái)說(shuō),CMS的內(nèi)存回收工作是和用戶線程一起并發(fā)執(zhí)行的。(5)缺點(diǎn):

A、對(duì)CPU資源占用比較多??赡芤?yàn)檎加靡徊糠諧PU資源導(dǎo)致應(yīng)用程序響應(yīng)變慢。
B、CMS無(wú)法處理浮動(dòng)垃圾。在并發(fā)清除階段,用戶程序繼續(xù)運(yùn)行,可能產(chǎn)生新的內(nèi)存垃圾,這一部分垃圾出現(xiàn)在標(biāo)記過(guò)程之后,因此,CMS無(wú)法清除。這部分垃圾稱為“浮動(dòng)垃圾“
C、需要預(yù)留一部分內(nèi)存,在垃圾回收時(shí),給用戶程序使用。
D、基于標(biāo)記-清除算法,容易產(chǎn)生大量?jī)?nèi)存碎片,導(dǎo)致full GC(full GC進(jìn)行內(nèi)存碎片的整理)
6、 對(duì)象頭部分的內(nèi)存布局:HotSpot的對(duì)象頭分為兩部分,第一部分用于存儲(chǔ)對(duì)象自身的運(yùn)行時(shí)數(shù)據(jù),比如哈希碼、GC分代年齡等。另外一部分用于指向方法區(qū)對(duì)象類型數(shù)據(jù)的指針。7、 偏向鎖:偏向鎖偏向于第一個(gè)獲取它的線程,如果在接下來(lái)的執(zhí)行過(guò)程,沒有其他線程獲取該鎖,則持有偏向鎖的線程永遠(yuǎn)不需要同步。(當(dāng)一個(gè)線程獲取偏向鎖,它每次進(jìn)入這個(gè)鎖相關(guān)的同步塊,虛擬機(jī)不在進(jìn)行任何同步操作。當(dāng)有另外一個(gè)線程嘗試獲取這個(gè)鎖時(shí),偏向模式宣告結(jié)束)
二類加載 過(guò)程

2.1、 概念:類加載器把class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中,存放在方法區(qū),然后在堆區(qū)創(chuàng)建一個(gè)java.lang.Class對(duì)象,用來(lái)封裝類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)。類加載的步驟如下:1、加載:查找并加載類的二進(jìn)制數(shù)據(jù)(把class文件里面的信息加載到內(nèi)存里面)2、連接:把內(nèi)存中類的二進(jìn)制數(shù)據(jù)合并到虛擬機(jī)的運(yùn)行時(shí)環(huán)境中(1)驗(yàn)證:確保被加載的類的正確性。包括:

A、類文件的結(jié)構(gòu)檢查:檢查是否滿足Java類文件的固定格式
B、語(yǔ)義檢查:確保類本身符合Java的語(yǔ)法規(guī)范
C、字節(jié)碼驗(yàn)證:確保字節(jié)碼流可以被Java虛擬機(jī)安全的執(zhí)行。字節(jié)碼流是操作碼組成的序列。每一個(gè)操作碼后面都會(huì)跟著一個(gè)或者多個(gè)操作數(shù)。字節(jié)碼檢查這個(gè)步驟會(huì)檢查每一個(gè)操作碼是否合法。
D、二進(jìn)制兼容性驗(yàn)證:確保相互引用的類之間是協(xié)調(diào)一致的。
(2)準(zhǔn)備:為類的靜態(tài)變量分配內(nèi)存,并將其初始化為默認(rèn)值(3)解析:把類中的符號(hào)引用轉(zhuǎn)化為直接引用(比如說(shuō)方法的符號(hào)引用,是有方法名和相關(guān)描述符組成,在解析階段,JVM把符號(hào)引用替換成一個(gè)指針,這個(gè)指針就是直接引用,它指向該類的該方法在方法區(qū)中的內(nèi)存位置)3、初始化:為類的靜態(tài)變量賦予正確的初始值。當(dāng)靜態(tài)變量的等號(hào)右邊的值是一個(gè)常量表達(dá)式時(shí),不會(huì)調(diào)用static代碼塊進(jìn)行初始化。只有等號(hào)右邊的值是一個(gè)運(yùn)行時(shí)運(yùn)算出來(lái)的值,才會(huì)調(diào)用static初始化。
2.2、雙親委派模型:1、當(dāng)一個(gè)類加載器收到類加載請(qǐng)求的時(shí)候,它首先不會(huì)自己去加載這個(gè)類的信息,而是把該請(qǐng)求轉(zhuǎn)發(fā)給父類加載器,依次向上。所以所有的類加載請(qǐng)求都會(huì)被傳遞到父類加載器中,只有當(dāng)父類加載器中無(wú)法加載到所需的類,子類加載器才會(huì)自己嘗試去加載該類。當(dāng)當(dāng)前類加載器和所有父類加載器都無(wú)法加載該類時(shí),拋出ClassNotFindException異常。2、意義:

提高系統(tǒng)的安全性。用戶自定義的類加載器不可能加載應(yīng)該由父加載器加載的可靠類。(比如用戶定義了一個(gè)惡意代碼,自定義的類加載器首先讓系統(tǒng)加載器去加載,系統(tǒng)加載器檢查該代碼不符合規(guī)范,于是就不繼續(xù)加載了)
3、定義類加載器:如果某個(gè)類加載器能夠加載一個(gè)類,那么這個(gè)類加載器就叫做定義類加載器4、初始類加載器:定義類加載器及其所有子加載器都稱作初始類加載器。5、運(yùn)行時(shí)包:(1)由同一個(gè)類加載器加載并且擁有相同包名的類組成運(yùn)行時(shí)包(2)只有屬于同一個(gè)運(yùn)行時(shí)包的類,才能訪問(wèn)包可見(default)的類和類成員。作用是 限制用戶自定義的類冒充核心類庫(kù)的類去訪問(wèn)核心類庫(kù)的包可見成員。6、加載兩份相同的class對(duì)象的情況:A和B不屬于父子類加載器關(guān)系,并且各自都加載了同一個(gè)類。

、特點(diǎn):1、全盤負(fù)責(zé):當(dāng)一個(gè)類加載器加載一個(gè)類時(shí),該類所依賴的其他類也會(huì)被這個(gè)類加載器加載到內(nèi)存中。2、緩存機(jī)制:所有的Class對(duì)象都會(huì)被緩存,當(dāng)程序需要使用某個(gè)Class時(shí),類加載器先從緩存中查找,找不到,才從class文件中讀取數(shù)據(jù),轉(zhuǎn)化成Class對(duì)象,存入緩存中。

、 類加載器:兩種類型的類加載器:1、 JVM自帶的類加載器(3種):(1)根類加載器(Bootstrap):a、C++編寫的,程序員無(wú)法在程序中獲取該類b、負(fù)責(zé)加載虛擬機(jī)的核心庫(kù),比如java.lang.Objectc、沒有繼承ClassLoader類(2)擴(kuò)展類加載器(Extension):a、Java編寫的,從指定目錄中加載類庫(kù)b、父加載器是根類加載器c、是ClassLoader的子類d、如果用戶把創(chuàng)建的jar文件放到指定目錄中,也會(huì)被擴(kuò)展加載器加載。
(3)系統(tǒng)加載器(System)或者應(yīng)用加載器(App):a、Java編寫的
b、父加載器是擴(kuò)展類加載器
c、從環(huán)境變量或者class.path中加載類
d、是用戶自定義類加載的默認(rèn)父加載器e、是ClassLoader的子類
2、用戶自定義的類加載器:(1)Java.lang.ClassLoader類的子類(2)用戶可以定制類的加載方式(3)父類加載器是系統(tǒng)加載器(4)編寫步驟:A、繼承ClassLoaderB、重寫findClass方法。從特定位置加載class文件,得到字節(jié)數(shù)組,然后利用defineClass把字節(jié)數(shù)組轉(zhuǎn)化為Class對(duì)象(5)為什么要自定義類加載器?A、可以從指定位置加載class文件,比如說(shuō)從數(shù)據(jù)庫(kù)、云端加載class文件B、加密:Java代碼可以被輕易的反編譯,因此,如果需要對(duì)代碼進(jìn)行加密,那么加密以后的代碼,就不能使用Java自帶的ClassLoader來(lái)加載這個(gè)類了,需要自定義ClassLoader,對(duì)這個(gè)類進(jìn)行解密,然后加載。

問(wèn)題:Java程序?qū)︻惖膱?zhí)行有幾種方式:1、 主動(dòng)使用(6種情況):JVM必須在每個(gè)類“首次 主動(dòng)使用”的時(shí)候,才會(huì)初始化這些類。(1) 創(chuàng)建類的實(shí)例(2) 讀寫某個(gè)類或者接口的靜態(tài)變量(3) 調(diào)用類的靜態(tài)方法(4) 同過(guò)反射的API(Class.forName())獲取類(5) 初始化一個(gè)類的子類(6) JVM啟動(dòng)的時(shí)候,被標(biāo)明啟動(dòng)類的類(包含Main方法的類)只有當(dāng)程序使用的靜態(tài)變量或者靜態(tài)方法確實(shí)在該類中定義時(shí),該可以認(rèn)為是對(duì)該類或者接口的主動(dòng)使用。2、 被動(dòng)使用:除了主動(dòng)使用的6種情況,其他情況都是被動(dòng)使用,都不會(huì)導(dǎo)致類的初始化。3、 JVM規(guī)范允許類加載器在預(yù)料某個(gè)類將要被使用的時(shí)候,就預(yù)先加載它。如果該class文件缺失或者存在錯(cuò)誤,則在程序“首次 主動(dòng)使用”的時(shí)候,才報(bào)告這個(gè)錯(cuò)誤。(Linkage Error錯(cuò)誤)。如果這個(gè)類一直沒有被程序“主動(dòng)使用”,就不會(huì)報(bào)錯(cuò)。

類加載機(jī)制與接口:1、 當(dāng)Java虛擬機(jī)初始化一個(gè)類時(shí),不會(huì)初始化該類實(shí)現(xiàn)的接口。2、 在初始化一個(gè)接口時(shí),不會(huì)初始化這個(gè)接口父接口。3、 只有當(dāng)程序首次使用該接口的靜態(tài)變量時(shí),才導(dǎo)致該接口的初始化。

ClassLoader:1、 調(diào)用Classloader的loadClass方法去加載一個(gè)類,不是主動(dòng)使用,因此不會(huì)進(jìn)行類的初始化。

類的卸載:1、 有JVM自帶的三種類加載器(根、擴(kuò)展、系統(tǒng))加載的類始終不會(huì)卸載。因?yàn)镴VM始終引用這些類加載器,這些類加載器使用引用他們所加載的類,因此這些Class類對(duì)象始終是可到達(dá)的。2、 由用戶自定義類加載器加載的類,是可以被卸載的。
三 JMM JAVA內(nèi)存模型

1、 Java的并發(fā)采用“共享內(nèi)存”模型,線程之間通過(guò)讀寫內(nèi)存的公共狀態(tài)進(jìn)行通訊。多個(gè)線程之間是不能通過(guò)直接傳遞數(shù)據(jù)交互的,它們之間交互只能通過(guò)共享變量實(shí)現(xiàn)。
2、 主要目的是定義程序中各個(gè)變量的訪問(wèn)規(guī)則。
3、 Java內(nèi)存模型規(guī)定所有變量都存儲(chǔ)在主內(nèi)存中,每個(gè)線程還有自己的工作內(nèi)存。
(1) 線程的工作內(nèi)存中保存了被該線程使用到的變量的拷貝(從主內(nèi)存中拷貝過(guò)來(lái)),線程對(duì)變量的所有操作都必須在工作內(nèi)存中執(zhí)行,而不能直接訪問(wèn)主內(nèi)存中的變量。(2) 不同線程之間無(wú)法直接訪問(wèn)對(duì)方工作內(nèi)存的變量,線程間變量值的傳遞都要通過(guò)主內(nèi)存來(lái)完成。
(3) 主內(nèi)存主要對(duì)應(yīng)Java堆中實(shí)例數(shù)據(jù)部分。工作內(nèi)存對(duì)應(yīng)于虛擬機(jī)棧中部分區(qū)域。
4、Java線程之間的通信由內(nèi)存模型JMM(Java Memory Model)控制。
(1)JMM決定一個(gè)線程對(duì)變量的寫入何時(shí)對(duì)另一個(gè)線程可見。
(2)線程之間共享變量存儲(chǔ)在主內(nèi)存中
3)每個(gè)線程有一個(gè)私有的本地內(nèi)存,里面存儲(chǔ)了讀/寫共享變量的副本。
(4)JMM通過(guò)控制每個(gè)線程的本地內(nèi)存之間的交互,來(lái)為程序員提供內(nèi)存可見性保證。5、可見性、有序性:(1)當(dāng)一個(gè)共享變量在多個(gè)本地內(nèi)存中有副本時(shí),如果一個(gè)本地內(nèi)存修改了該變量的副本,其他變量應(yīng)該能夠看到修改后的值,此為可見性。(2)保證線程的有序執(zhí)行,這個(gè)為有序性。(保證線程安全)6、內(nèi)存間交互操作:(1)lock(鎖定):作用于主內(nèi)存的變量,把一個(gè)變量標(biāo)識(shí)為一條線程獨(dú)占狀態(tài)。(2)unlock(解鎖):作用于主內(nèi)存的變量,把一個(gè)處于鎖定狀態(tài)的變量釋放出來(lái),釋放后的變量才可以被其他線程鎖定。(3)read(讀取):作用于主內(nèi)存變量,把主內(nèi)存的一個(gè)變量讀取到工作內(nèi)存中。(4)load(載入):作用于工作內(nèi)存,把read操作讀取到工作內(nèi)存的變量載入到工作內(nèi)存的變量副本中(5)use(使用):作用于工作內(nèi)存的變量,把工作內(nèi)存中的變量值傳遞給一個(gè)執(zhí)行引擎。(6)assign(賦值):作用于工作內(nèi)存的變量。把執(zhí)行引擎接收到的值賦值給工作內(nèi)存的變量。(7)store(存儲(chǔ)):把工作內(nèi)存的變量的值傳遞給主內(nèi)存(8)write(寫入):把store操作的值入到主內(nèi)存的變量中6.1、注意:(1)不允許read、load、store、write操作之一單獨(dú)出現(xiàn)(2)不允許一個(gè)線程丟棄assgin操作(3)不允許一個(gè)線程不經(jīng)過(guò)assgin操作,就把工作內(nèi)存中的值同步到主內(nèi)存中(4)一個(gè)新的變量只能在主內(nèi)存中生成(5)一個(gè)變量同一時(shí)刻只允許一條線程對(duì)其進(jìn)行l(wèi)ock操作。但lock操作可以被同一條線程執(zhí)行多次,只有執(zhí)行相同次數(shù)的unlock操作,變量才會(huì)解鎖(6)如果對(duì)一個(gè)變量進(jìn)行l(wèi)ock操作,將會(huì)清空工作內(nèi)存中此變量的值,在執(zhí)行引擎使用這個(gè)變量前,需要重新執(zhí)行l(wèi)oad或者assgin操作初始化變量的值。(7)如果一個(gè)變量沒有被鎖定,不允許對(duì)其執(zhí)行unlock操作,也不允許unlock一個(gè)被其他線程鎖定的變量(8)對(duì)一個(gè)變量執(zhí)行unlock操作之前,需要將該變量同步回主內(nèi)存中
四Java運(yùn)行時(shí)數(shù)據(jù)區(qū)
Java虛擬機(jī)在執(zhí)行Java程序的過(guò)程中會(huì)將其管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域,這些區(qū)域有各自的用途、創(chuàng)建和銷毀的時(shí)間,有些區(qū)域隨虛擬機(jī)進(jìn)程的啟動(dòng)而存在,有些區(qū)域則是依賴用戶線程的啟動(dòng)和結(jié)束來(lái)建立和銷毀。Java虛擬機(jī)所管理的內(nèi)存包括以下幾個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū)域,如圖:

1、程序計(jì)數(shù)器(指向當(dāng)前字節(jié)碼指令):指向當(dāng)前線程正在執(zhí)行的字節(jié)碼指令。線程私有的。
2、虛擬機(jī)棧(方法的出棧入棧):虛擬機(jī)棧是Java執(zhí)行方法的內(nèi)存模型。每個(gè)方法被執(zhí)行的時(shí)候,都會(huì)創(chuàng)建一個(gè)棧幀,把棧幀壓人棧,當(dāng)方法正常返回或者拋出未捕獲的異常時(shí),棧幀就會(huì)出棧。(1)棧幀:棧幀存儲(chǔ)方法的相關(guān)信息,包含局部變量數(shù)表、返回值、操作數(shù)棧、動(dòng)態(tài)鏈接a、局部變量表:包含了方法執(zhí)行過(guò)程中的所有變量。局部變量數(shù)組所需要的空間在編譯期間完成分配,在方法運(yùn)行期間不會(huì)改變局部變量數(shù)組的大小。b、返回值:如果有返回值的話,壓入調(diào)用者棧幀中的操作數(shù)棧中,并且把PC的值指向 方法調(diào)用指令 后面的一條指令地址。c、操作數(shù)棧:操作變量的內(nèi)存模型。操作數(shù)棧的最大深度在編譯的時(shí)候已經(jīng)確定(寫入方法區(qū)code屬性的max_stacks項(xiàng)中)。操作數(shù)棧的的元素可以是任意Java類型,包括long和double,32位數(shù)據(jù)占用棧空間為1,64位數(shù)據(jù)占用2。方法剛開始執(zhí)行的時(shí)候,棧是空的,當(dāng)方法執(zhí)行過(guò)程中,各種字節(jié)碼指令往棧中存取數(shù)據(jù)。d、動(dòng)態(tài)鏈接:每個(gè)棧幀都持有在運(yùn)行時(shí)常量池中該棧幀所屬方法的引用,持有這個(gè)引用是為了支持方法調(diào)用過(guò)程中的動(dòng)態(tài)鏈接。(2)線程私有
3、本地方法棧:(1)調(diào)用本地native的內(nèi)存模型(2)線程獨(dú)享
4、方法區(qū)(類信息):用于存儲(chǔ)已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯后的代碼等數(shù)據(jù)(1)線程共享的
(2)運(yùn)行時(shí)常量池:
A、是方法區(qū)的一部分
B、存放編譯期生成的各種字面量和符號(hào)引用
C、Class文件中除了存有類的版本、字段、方法、接口等描述信息,還有一項(xiàng)是常量池,存有這個(gè)類的 編譯期生成的各種字面量和符號(hào)引用,這部分內(nèi)容將在類加載后,存放到方法區(qū)的運(yùn)行時(shí)常量池中。
5、堆(Heap):Java對(duì)象存儲(chǔ)的地方(1)Java堆是虛擬機(jī)管理的內(nèi)存中最大的一塊(2)Java堆是所有線程共享的區(qū)域(3)在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建(4)此內(nèi)存區(qū)域的唯一目的就是存放對(duì)象實(shí)例,幾乎所有對(duì)象實(shí)例都在這里分配內(nèi)存。存放new生成的對(duì)象和數(shù)組(5)Java堆是垃圾收集器管理的內(nèi)存區(qū)域,因此很多時(shí)候稱為“GC堆”

Java堆的內(nèi)存劃分如圖所示,分別為年輕代、Old Memory(老年代)、Perm(永久代)。其中在Jdk1.8中,永久代被移除,使用MetaSpace代替。
所以JDK8中是年輕代 老年代 元數(shù)據(jù)區(qū)
1、新生代:(1)使用復(fù)制清除算法(Copinng算法),原因是年輕代每次GC都要回收大部分對(duì)象。新生代里面分成一份較大的Eden空間和兩份較小的Survivor空間。每次只使用Eden和其中一塊Survivor空間,然后垃圾回收的時(shí)候,把存活對(duì)象放到未使用的Survivor(劃分出from、to)空間中,清空Eden和剛才使用過(guò)的Survivor空間。(2)分為Eden、Survivor From、Survivor To,比例默認(rèn)為8:1:1(3)內(nèi)存不足時(shí)發(fā)生Minor GC
2、老年代:(1)采用標(biāo)記-整理算法(mark-compact),原因是老年代每次GC只會(huì)回收少部分對(duì)象。
3 MetaSpace(元空間):元空間的本質(zhì)和永久代類似,都是對(duì)JVM規(guī)范中方法區(qū)的實(shí)現(xiàn)。不過(guò)元空間與永久代之間最大的區(qū)別在于:元空間并不在虛擬機(jī)中,而是使用本地內(nèi)存。4、堆內(nèi)存的劃分在JVM里面的示意圖:

、判斷對(duì)象是否可回收的方法

2.1 引用計(jì)數(shù)法
引用計(jì)數(shù)法的實(shí)現(xiàn)很簡(jiǎn)單,在對(duì)象中添加一個(gè)引用計(jì)數(shù)器,每當(dāng)有一個(gè)地方引用它時(shí),計(jì)數(shù)器值就加一;當(dāng)引用失效時(shí),計(jì)數(shù)器值就減一;任何時(shí)刻計(jì)數(shù)器為零的對(duì)象就是不可能再被使用的。大部分情況下這個(gè)方法是可以發(fā)揮作用的,但是在存在循環(huán)引用的情況下,引用計(jì)數(shù)法就無(wú)能為力了。比如下面這種情況:
public class Student {

public Student friend = null;public static void test() {Student a = new Student();Student b = new Student();a.friend = b;b.friend = a;a = null;b = null;System.gc(); }

}

上述代碼創(chuàng)建了 a 和 b 兩個(gè) Student 實(shí)例,并把它們各自的 friend 字段賦值為對(duì)方,除此之外,這兩個(gè)對(duì)象再無(wú)任何引用,然后將它們都賦值為 null,在這種情況下,這兩個(gè)對(duì)象已經(jīng)不可能再被訪問(wèn),但是它們因?yàn)榛ハ嘁弥鴮?duì)方,導(dǎo)致它們的引用計(jì)數(shù)都不為零,引用計(jì)數(shù)算法也就無(wú)法回收它們。
可達(dá)性分析法

這個(gè)算法的基本思路就是通過(guò)一系列稱為“GC Roots”的根對(duì)象作為起始節(jié)點(diǎn)集 (GC Root Set),從這些節(jié)點(diǎn)開始,根據(jù)引用關(guān)系向下搜索,搜索過(guò)程所走過(guò)的路徑稱為“引用鏈” (Reference Chain),如果某個(gè)對(duì)象到GC Roots間沒有任何引用鏈相連,則說(shuō)明此對(duì)象不再被使用,也就可以被回收了。要進(jìn)行可達(dá)性分析就需要先枚舉根節(jié)點(diǎn) (GC Roots),在枚舉根節(jié)點(diǎn)過(guò)程中,為防止對(duì)象的引用關(guān)系發(fā)生變化,需要暫停所有用戶線程 (垃圾收集之外的線程),這種暫停全部用戶線程的行為被稱為 (Stop The World)??蛇_(dá)性分析法如下圖所示:

可達(dá)性分析法
圖中綠色的都是位于 GC Root Set 中的 GC Roots,所有與其有關(guān)聯(lián)的對(duì)象都是可達(dá)的,被標(biāo)記為藍(lán)色,而所有與其沒有任何關(guān)聯(lián)的對(duì)象都是不可達(dá)的,被標(biāo)記為灰色。即使是不可達(dá)對(duì)象,也并非一定會(huì)被回收,如果該對(duì)象同時(shí)滿足以下幾個(gè)條件,那么它仍有“逃生”的可能:
該對(duì)象有重寫的 finalize()方法 (Object 類中的方法);
finalize()方法中將其自身鏈接到了引用鏈上;
JVM 此前沒有調(diào)用過(guò)該對(duì)象的finalize()方法 (因?yàn)?JVM 在收集可回收對(duì)象時(shí)會(huì)調(diào)用且僅調(diào)用一次該對(duì)象的finalize()方法)。
不過(guò)由于finalize()方法的運(yùn)行代價(jià)高昂,不確定性大,且無(wú)法保證各個(gè)對(duì)象的調(diào)用順序,所以并不推薦使用。那么 GC Roots 又是何方神圣呢?在 Java 語(yǔ)言中,固定可作為GC Roots的對(duì)象包括以下幾種:
在虛擬機(jī)棧 (棧幀中的本地變量表) 中引用的對(duì)象,比如各個(gè)線程被調(diào)用的方法堆棧中使用到的參數(shù)、局部變量、臨時(shí)變量等。
在方法區(qū)中類靜態(tài)屬性引用的對(duì)象,比如Java類的引用類型靜態(tài)變量。
在方法區(qū)中常量引用的對(duì)象,比如字符串常量池(String Table)里的引用。
在本地方法棧中JNI (即通常所說(shuō)的Native方法) 引用的對(duì)象。
Java虛擬機(jī)內(nèi)部的引用,如基本數(shù)據(jù)類型對(duì)應(yīng)的Class對(duì)象,一些常駐的異常對(duì)象 (比如
NullPointExcepiton、OutOfMemoryError) 等,還有系統(tǒng)類加載器。
所有被同步鎖 (synchronized關(guān)鍵字) 持有的對(duì)象。
反映Java虛擬機(jī)內(nèi)部情況的 JM XBean、JVM TI 中注冊(cè)的回調(diào)、本地代碼緩存

垃圾收集算法介紹

1 標(biāo)記-清除算法

標(biāo)記-清除算法的思想很簡(jiǎn)單,顧名思義,該算法的過(guò)程分為標(biāo)記和清除兩個(gè)階段:首先標(biāo)記出所有需要回收的對(duì)象,其中標(biāo)記過(guò)程就是使用可達(dá)性分析法判斷對(duì)象是否屬于垃圾的過(guò)程。在標(biāo)記完成后,統(tǒng)一回收掉所有被標(biāo)記的對(duì)象,也可以反過(guò)來(lái),標(biāo)記存活的對(duì)象,統(tǒng)一回收所有未被標(biāo)記的對(duì)象。示意圖如下:

標(biāo)記清除算法
這個(gè)算法雖然很簡(jiǎn)單,但是有兩個(gè)明顯的缺點(diǎn):
執(zhí)行效率不穩(wěn)定。如果 Java 堆中包含大量對(duì)象,而且其中大部分是需要被回收的,這時(shí)必須進(jìn)行大量標(biāo)記和清除的動(dòng)作,導(dǎo)致標(biāo)記和清除兩個(gè)過(guò)程的執(zhí)行效率都隨對(duì)象數(shù)量增長(zhǎng)而降低;
導(dǎo)致內(nèi)存空間碎片化。標(biāo)記、清除之后會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片,空間碎片太多可能會(huì)導(dǎo)致當(dāng)以后在程序運(yùn)行過(guò)程中需要分配較大對(duì)象時(shí)無(wú)法找到足夠的連續(xù)內(nèi)存而不得不提前觸發(fā)另一次垃圾收集動(dòng)作,非常影響程序運(yùn)行效率。

2 標(biāo)記-復(fù)制算法

標(biāo)記-復(fù)制算法常簡(jiǎn)稱復(fù)制算法,這一算法正好解決了標(biāo)記-清除算法在面對(duì)大量可回收對(duì)象時(shí)執(zhí)行效率低下的問(wèn)題。其實(shí)現(xiàn)方法也很易懂:在可用內(nèi)存中劃分出兩塊大小相同的區(qū)域,每次只使用其中一塊,另一塊保持空閑狀態(tài),第一塊用完的時(shí)候,就把存活的對(duì)象全部復(fù)制到第二塊區(qū)域,然后把第一塊全部清空。如下圖所示:

標(biāo)記-復(fù)制算法
這個(gè)算法很適合用于對(duì)象存活率低的情況,因?yàn)樗魂P(guān)注存活對(duì)象而無(wú)需理會(huì)可回收對(duì)象,所以 JVM 中新生代的垃圾收集正是采用的這一算法。但是其缺點(diǎn)也很明顯,每次都要浪費(fèi)一半的內(nèi)存,未免太過(guò)奢侈,不過(guò) JVM 中的新生代有更精細(xì)的內(nèi)存劃分,比較好地解決了這個(gè)問(wèn)題,見下
標(biāo)記-整理算法

這個(gè)算法完美解決了標(biāo)記-清除算法的空間碎片化問(wèn)題,其標(biāo)記過(guò)程與“標(biāo)記-清除”算法一樣,但后續(xù)步驟不是直接對(duì)可回收對(duì)象進(jìn)行清理,而是讓所有存活的對(duì)象都向內(nèi)存空間一端移動(dòng),然后直接清理掉邊界以外的內(nèi)存。

標(biāo)記整理算法
這個(gè)算法雖然可以很好地解決空間碎片化問(wèn)題,但是每次垃圾回收都要移動(dòng)存活的對(duì)象,還要對(duì)引用這些對(duì)象的地方進(jìn)行更新,對(duì)象移動(dòng)的操作也需要全程暫停用戶線程 (Stop The World)。
分代收集算法

與其說(shuō)是算法,不如說(shuō)是理論。如今大多數(shù)虛擬機(jī)的實(shí)現(xiàn)版本都遵循了“分代收集”的理論進(jìn)行設(shè)計(jì),這個(gè)理論可以看作是經(jīng)驗(yàn)之談,因?yàn)殚_發(fā)人員在開發(fā)過(guò)程中發(fā)現(xiàn)了 JVM 中存活對(duì)象的數(shù)量和它們的年齡之間有著某種規(guī)律,如下圖:

根據(jù)這兩個(gè)假說(shuō),可以把 JVM 的堆內(nèi)存大致分為新生代和老年代,新生代對(duì)象大多存活時(shí)間短,每次回收時(shí)只關(guān)注如何保留少量存活而不是去標(biāo)記那些大量將要被回收的對(duì)象,就能以較低代價(jià)回收到大量的空間,所以這一區(qū)域一般采用標(biāo)記-復(fù)制算法進(jìn)行垃圾收集,頻率比較高。而老年代則是一些難以消亡的對(duì)象,可以采用標(biāo)記-清除和標(biāo)記整理算法進(jìn)行垃圾收集,頻率可以低一些。
按照 Hotspot 虛擬機(jī)的實(shí)現(xiàn),針對(duì)新生代和老年代的垃圾收集又分為不同的類型,也有不同的名詞,如下:
部分收集 (Partial GC):指目標(biāo)不是完整收集整個(gè)Java堆的垃圾收集,其中又分為:
新生代收集 (Minor GC / Young GC):指目標(biāo)只是新生代的垃圾收集。
老年代收集 (Major GC / Old GC):指目標(biāo)只是老年代的垃圾收集,目前只有CMS收集器的并發(fā)收集階段是單獨(dú)收集老年代的行為。
混合收集 (Mixed GC):指目標(biāo)是收集整個(gè)新生代以及部分老年代的垃圾收集,目前只有G1收集器會(huì)有這種行為。
整堆收集 (Full GC):收集整個(gè)Java堆和方法區(qū)的垃圾收集。
人們經(jīng)常會(huì)混淆 Major GC 和 Full GC,不過(guò)這也有情可原,因?yàn)檫@兩種 GC 行為都包含了老年代的垃圾收集,而單獨(dú)的老年代收集 (Major GC) 又比較少見,大多數(shù)情況下只要包含老年代收集,就會(huì)是整堆收集 (Full GC),不過(guò)還是分得清楚一點(diǎn)比較好哈。

JVM 的內(nèi)存分配和垃圾收集機(jī)制

經(jīng)過(guò)前面的鋪墊,現(xiàn)在終于可以一窺 JVM 的內(nèi)存分配和垃圾收集機(jī)制的真面目了。

JVM 堆內(nèi)存的劃分

新生代中對(duì)象的分配與回收

大多數(shù)情況下,對(duì)象優(yōu)先在新生代 Eden 區(qū)中分配,當(dāng) Eden 區(qū)沒有足夠空間進(jìn)行分配時(shí),虛擬機(jī)將發(fā)起一次 Minor GC。Eden、From Survivor 和 To Survivor 的比例為 8 : 1 : 1,之所以按這個(gè)比例是因?yàn)榻^大多數(shù)對(duì)象都是朝生夕滅的,垃圾收集時(shí) Eden 存活的對(duì)象數(shù)量不會(huì)太多,Survivor 空間小一點(diǎn)也足以容納,每次新生代中可用內(nèi)存空間為整個(gè)新生代容量的90% (Eden 的 80% 加上 To Survivor 的 10%),只有From Survivor 空間,即 10% 的新生代是會(huì)被“浪費(fèi)”的。不會(huì)像原始的標(biāo)記-復(fù)制算法那樣浪費(fèi)一半的內(nèi)存空間。From Survivor 和 To Survivor 的空間并不是固定的,而是在 S0 和 S1 之間動(dòng)態(tài)轉(zhuǎn)換的,第一次 Minor GC 時(shí)會(huì)選擇 S1 作為 To Survivor,并將 Eden 中存活的對(duì)象復(fù)制到其中,并將對(duì)象的年齡加1,注意新生代使用的垃圾收集算法是標(biāo)記-復(fù)制算法的改良版。下面是示意圖,請(qǐng)注意其中第一步的變色是為了醒目,虛擬機(jī)只做了標(biāo)記存活對(duì)象的操作。
第一次 Minor GC 示意圖
在后續(xù)的 Minor GC 中,S0 和 S1會(huì)交替轉(zhuǎn)化為 From Survivor 和 To Survivor,Eden 和 From Survivor 中的存活對(duì)象會(huì)復(fù)制到 To Survivor 中,并將年齡加 1。
對(duì)象晉升老年代

在以下這些情況下,對(duì)象會(huì)晉升到老年代。
長(zhǎng)期存活對(duì)象將進(jìn)入老年代
對(duì)象在 Survivor 區(qū)中每熬過(guò)一次Minor GC,年齡就增加1歲,當(dāng)它的年齡增加到一定程度 (默認(rèn)為15),就會(huì)被晉升到老年代中。對(duì)象晉升老年代的年齡閾值,可以通過(guò)參數(shù) -XX:MaxTenuringThreshold 設(shè)置,這個(gè)參數(shù)的最大值是15,因?yàn)閷?duì)象年齡信息儲(chǔ)存在對(duì)象頭中,占4個(gè)比特 (bit)的內(nèi)存,所能表示最大數(shù)字就是15。
大對(duì)象可以直接進(jìn)入老年代

對(duì)于大對(duì)象,尤其是很長(zhǎng)的字符串,或者元素?cái)?shù)量很多的數(shù)組,如果分配在 Eden 中,會(huì)很容易過(guò)早占滿 Eden 空間導(dǎo)致 Minor GC,而且大對(duì)象在 Eden 和兩個(gè) Survivor 之間的來(lái)回復(fù)制也還會(huì)有很大的內(nèi)存復(fù)制開銷。所以我們可以通過(guò)設(shè)置 -XX:PretenureSizeThreshold 的虛擬機(jī)參數(shù)讓大對(duì)象直接進(jìn)入老年代。
.動(dòng)態(tài)對(duì)象年齡判斷

為了能更好地適應(yīng)不同程序的內(nèi)存狀況,HotSpot 虛擬機(jī)并不是永遠(yuǎn)要求對(duì)象的年齡必須達(dá)到 -XX:MaxTenuringThreshold 才能晉升老年代,如果在 Survivor 空間中相同年齡所有對(duì)象大小的總和大于 Survivor 空間的一半,年齡大于或等于該年齡的對(duì)象就可以直接進(jìn)入老年代,無(wú)須等到 -XX:MaxTenuringThreshold 中要求的年齡。
空間分配擔(dān)保 (Handle Promotion)

當(dāng) Survivor 空間不足以容納一次 Minor GC 之后存活的對(duì)象時(shí),就需要依賴其他內(nèi)存區(qū)域 (實(shí)際上大多數(shù)情況下就是老年代) 進(jìn)行分配擔(dān)保。在發(fā)生 Minor GC 之前,虛擬機(jī)必須先檢查老年代最大可用的連續(xù)空間是否大于新生代所有對(duì)象總空間,如果這個(gè)條件成立,那這一次 Minor GC 可以確保是安全的。如果不成立,則虛擬機(jī)會(huì)先查看 - XX:HandlePromotionFailure 參數(shù)的設(shè)置值是否允許擔(dān)保失敗 (Handle Promotion Failure);如果允許,那會(huì)繼續(xù)檢查老年代最大可用的連續(xù)空間是否大于歷次晉升到老年代對(duì)象的平均大小,如果大于,將嘗試進(jìn)行一次 Minor GC,盡管這次 Minor GC 是有風(fēng)險(xiǎn)的;如果小于,或者-XX: HandlePromotionFailure設(shè)置不允許冒險(xiǎn),那這時(shí)就要改為進(jìn)行一次 Full GC。
五 JVM優(yōu)化
1、一般來(lái)說(shuō),當(dāng)survivor區(qū)不夠大或者占用量達(dá)到50%,就會(huì)把一些對(duì)象放到老年區(qū)。通過(guò)設(shè)置合理的eden區(qū),survivor區(qū)及使用率,可以將年輕對(duì)象保存在年輕代,從而避免full GC,使用-Xmn設(shè)置年輕代的大小

2、對(duì)于占用內(nèi)存比較多的大對(duì)象,一般會(huì)選擇在老年代分配內(nèi)存。如果在年輕代給大對(duì)象分配內(nèi)存,年輕代內(nèi)存不夠了,就要在eden區(qū)移動(dòng)大量對(duì)象到老年代,然后這些移動(dòng)的對(duì)象可能很快消亡,因此導(dǎo)致full GC。通過(guò)設(shè)置參數(shù):-XX:PetenureSizeThreshold=1000000,單位為B,標(biāo)明對(duì)象大小超過(guò)1M時(shí),在老年代(tenured)分配內(nèi)存空間。

3、一般情況下,年輕對(duì)象放在eden區(qū),當(dāng)?shù)谝淮蜧C后,如果對(duì)象還存活,放到survivor區(qū),此后,每GC一次,年齡增加1,當(dāng)對(duì)象的年齡達(dá)到閾值,就被放到tenured老年區(qū)。這個(gè)閾值可以同構(gòu)-XX:MaxTenuringThreshold設(shè)置。如果想讓對(duì)象留在年輕代,可以設(shè)置比較大的閾值。

4、設(shè)置最小堆和最大堆:-Xmx和-Xms穩(wěn)定的堆大小堆垃圾回收是有利的,獲得一個(gè)穩(wěn)定的堆大小的方法是設(shè)置-Xms和-Xmx的值一樣,即最大堆和最小堆一樣,如果這樣子設(shè)置,系統(tǒng)在運(yùn)行時(shí)堆大小理論上是恒定的,穩(wěn)定的堆空間可以減少GC次數(shù),因此,很多服務(wù)端都會(huì)將這兩個(gè)參數(shù)設(shè)置為一樣的數(shù)值。穩(wěn)定的堆大小雖然減少GC次數(shù),但是增加每次GC的時(shí)間,因?yàn)槊看蜧C要把堆的大小維持在一個(gè)區(qū)間內(nèi)。

5、一個(gè)不穩(wěn)定的堆并非毫無(wú)用處。在系統(tǒng)不需要使用大內(nèi)存的時(shí)候,壓縮堆空間,使得GC每次應(yīng)對(duì)一個(gè)較小的堆空間,加快單次GC次數(shù)?;谶@種考慮,JVM提供兩個(gè)參數(shù),用于壓縮和擴(kuò)展堆空間。(1)-XX:MinHeapFreeRatio 參數(shù)用于設(shè)置堆空間的最小空閑比率。默認(rèn)值是40,當(dāng)堆空間的空閑內(nèi)存比率小于40,JVM便會(huì)擴(kuò)展堆空間(2)-XX:MaxHeapFreeRatio 參數(shù)用于設(shè)置堆空間的最大空閑比率。默認(rèn)值是70, 當(dāng)堆空間的空閑內(nèi)存比率大于70,JVM便會(huì)壓縮堆空間。(3)當(dāng)-Xmx和-Xmx相等時(shí),上面兩個(gè)參數(shù)無(wú)效

6、通過(guò)增大吞吐量提高系統(tǒng)性能,可以通過(guò)設(shè)置并行垃圾回收收集器。(1)-XX:+UseParallelGC:年輕代使用并行垃圾回收收集器。這是一個(gè)關(guān)注吞吐量的收集器,可以盡可能的減少垃圾回收時(shí)間。(2)-XX:+UseParallelOldGC:設(shè)置老年代使用并行垃圾回收收集器。

7、嘗試使用大的內(nèi)存分頁(yè):使用大的內(nèi)存分頁(yè)增加CPU的內(nèi)存尋址能力,從而系統(tǒng)的性能。-XX:+LargePageSizeInBytes 設(shè)置內(nèi)存頁(yè)的大小

8、使用非占用的垃圾收集器。-XX:+UseConcMarkSweepGC老年代使用CMS收集器降低停頓。

9、-XXSurvivorRatio=3,表示年輕代中的分配比率:survivor:eden = 2:3

10、JVM性能調(diào)優(yōu)的工具:(1)jps(Java Process Status):輸出JVM中運(yùn)行的進(jìn)程狀態(tài)信息(現(xiàn)在一般使用jconsole)(2)jstack:查看java進(jìn)程內(nèi)線程的堆棧信息。(3)jmap:用于生成堆轉(zhuǎn)存快照(4)jhat:用于分析jmap生成的堆轉(zhuǎn)存快照(一般不推薦使用,而是使用Ecplise Memory Analyzer)(3)jstat是JVM統(tǒng)計(jì)監(jiān)測(cè)工具??梢杂脕?lái)顯示垃圾回收信息、類加載信息、新生代統(tǒng)計(jì)信息等。(4)VisualVM:故障處理工具
六 GC垃圾回收
一、 判斷對(duì)象是否要回收的方法:可達(dá)性分析法1、 可達(dá)性分析法:通過(guò)一系列“GC Roots”對(duì)象作為起點(diǎn)進(jìn)行搜索,如果在“GC Roots”和一個(gè)對(duì)象之間沒有可達(dá)路徑,則稱該對(duì)象是不可達(dá)的。不可達(dá)對(duì)象不一定會(huì)成為可回收對(duì)象。進(jìn)入DEAD狀態(tài)的線程還可以恢復(fù),GC不會(huì)回收它的內(nèi)存。(把一些對(duì)象當(dāng)做root對(duì)象,JVM認(rèn)為root對(duì)象是不可回收的,并且root對(duì)象引用的對(duì)象也是不可回收的)2、 以下對(duì)象會(huì)被認(rèn)為是root對(duì)象:(1) 虛擬機(jī)棧(棧幀中本地變量表)中引用的對(duì)象(2) 方法區(qū)中靜態(tài)屬性引用的對(duì)象(3) 方法區(qū)中常量引用的對(duì)象(4) 本地方法棧中Native方法引用的對(duì)象3、 對(duì)象被判定可被回收,需要經(jīng)歷兩個(gè)階段:(1) 第一個(gè)階段是可達(dá)性分析,分析該對(duì)象是否可達(dá)(2) 第二個(gè)階段是當(dāng)對(duì)象沒有重寫finalize()方法或者finalize()方法已經(jīng)被調(diào)用過(guò),虛擬機(jī)認(rèn)為該對(duì)象不可以被救活,因此回收該對(duì)象。(finalize()方法在垃圾回收中的作用是,給該對(duì)象一次救活的機(jī)會(huì))4、 方法區(qū)中的垃圾回收:(1) 常量池中一些常量、符號(hào)引用沒有被引用,則會(huì)被清理出常量池(2) 無(wú)用的類:被判定為無(wú)用的類,會(huì)被清理出方法區(qū)。判定方法如下:A、 該類的所有實(shí)例被回收B、 加載該類的ClassLoader被回收C、 該類的Class對(duì)象沒有被引用5、 finalize():(1) GC垃圾回收要回收一個(gè)對(duì)象的時(shí)候,調(diào)用該對(duì)象的finalize()方法。然后在下一次垃圾回收的時(shí)候,才去回收這個(gè)對(duì)象的內(nèi)存。(2) 可以在該方法里面,指定一些對(duì)象在釋放前必須執(zhí)行的操作。
二、 發(fā)現(xiàn)虛擬機(jī)頻繁full GC時(shí)應(yīng)該怎么辦:(full GC指的是清理整個(gè)堆空間,包括年輕代和永久代)(1) 首先用命令查看觸發(fā)GC的原因是什么 jstat –gccause 進(jìn)程id(2) 如果是System.gc(),則看下代碼哪里調(diào)用了這個(gè)方法(3) 如果是heap inspection(內(nèi)存檢查),可能是哪里執(zhí)行jmap –histo[:live]命令(4) 如果是GC locker,可能是程序依賴的JNI庫(kù)的原因
三、常見的垃圾回收算法:1、Mark-Sweep(標(biāo)記-清除算法):(1)思想:標(biāo)記清除算法分為兩個(gè)階段,標(biāo)記階段和清除階段。標(biāo)記階段任務(wù)是標(biāo)記出所有需要回收的對(duì)象,清除階段就是清除被標(biāo)記對(duì)象的空間。(2)優(yōu)缺點(diǎn):實(shí)現(xiàn)簡(jiǎn)單,容易產(chǎn)生內(nèi)存碎片2、Copying(復(fù)制清除算法):(1)思想:將可用內(nèi)存劃分為大小相等的兩塊,每次只使用其中的一塊。當(dāng)進(jìn)行垃圾回收的時(shí)候了,把其中存活對(duì)象全部復(fù)制到另外一塊中,然后把已使用的內(nèi)存空間一次清空掉。(2)優(yōu)缺點(diǎn):不容易產(chǎn)生內(nèi)存碎片;可用內(nèi)存空間少;存活對(duì)象多的話,效率低下。3、Mark-Compact(標(biāo)記-整理算法):(1)思想:先標(biāo)記存活對(duì)象,然后把存活對(duì)象向一邊移動(dòng),然后清理掉端邊界以外的內(nèi)存。(2)優(yōu)缺點(diǎn):不容易產(chǎn)生內(nèi)存碎片;內(nèi)存利用率高;存活對(duì)象多并且分散的時(shí)候,移動(dòng)次數(shù)多,效率低下

4、分代收集算法:(目前大部分JVM的垃圾收集器所采用的算法):

思想:把堆分成新生代和老年代。(永久代指的是方法區(qū))
(1) 因?yàn)樾律看卫厥斩家厥沾蟛糠謱?duì)象,所以新生代采用Copying算法。新生代里面分成一份較大的Eden空間和兩份較小的Survivor空間。每次只使用Eden和其中一塊Survivor空間,然后垃圾回收的時(shí)候,把存活對(duì)象放到未使用的Survivor(劃分出from、to)空間中,清空Eden和剛才使用過(guò)的Survivor空間。(2) 由于老年代每次只回收少量的對(duì)象,因此采用mark-compact算法。(3) 在堆區(qū)外有一個(gè)永久代。對(duì)永久代的回收主要是無(wú)效的類和常量5、GC使用時(shí)對(duì)程序的影響?垃圾回收會(huì)影響程序的性能,Java虛擬機(jī)必須要追蹤運(yùn)行程序中的有用對(duì)象,然后釋放沒用對(duì)象,這個(gè)過(guò)程消耗處理器時(shí)間6、幾種不同的垃圾回收類型:(1)Minor GC:從年輕代(包括Eden、Survivor區(qū))回收內(nèi)存。

A、當(dāng)JVM無(wú)法為一個(gè)新的對(duì)象分配內(nèi)存的時(shí)候,越容易觸發(fā)Minor GC。所以分配率越高,內(nèi)存越來(lái)越少,越頻繁執(zhí)行Minor GC
B、執(zhí)行Minor GC操作的時(shí)候,不會(huì)影響到永久代(Tenured)。從永久代到年輕代的引用,被當(dāng)成GC Roots,從年輕代到老年代的引用在標(biāo)記階段直接被忽略掉。
(2)Major GC:清理整個(gè)老年代,當(dāng)eden區(qū)內(nèi)存不足時(shí)觸發(fā)。(3)Full GC:清理整個(gè)堆空間,包括年輕代和老年代。當(dāng)老年代內(nèi)存不足時(shí)觸發(fā)

總結(jié)

以上是生活随笔為你收集整理的JVM系列之深入理解JVM(三)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

在线91观看 | 欧美一级特黄高清视频 | 91视频在线播放视频 | 成年人在线观看视频免费 | 正在播放五月婷婷狠狠干 | 免费亚洲黄色 | 国产成人精品免费在线观看 | 久久久国产99久久国产一 | 国内综合精品午夜久久资源 | 美女在线免费视频 | 国产精品一区二区在线免费观看 | 在线观看深夜视频 | 四虎影视成人永久免费观看视频 | 久久综合久久综合九色 | 日韩v在线91成人自拍 | 99亚洲精品| 欧美日韩在线观看视频 | 亚洲国产美女精品久久久久∴ | 麻豆91在线观看 | 国产免费黄视频在线观看 | 国产精品综合久久久 | 狠狠干狠狠色 | 九九九视频精品 | 国产黄色精品在线 | 日韩欧美视频 | 亚洲乱码在线观看 | 美女av电影| 99久久久久成人国产免费 | 国产一级电影 | 黄色毛片一级片 | 欧美一级大片在线观看 | 五月婷婷开心 | 成人av av在线 | adn—256中文在线观看 | 国产亚洲成人网 | 久久成 | 成人一级电影在线观看 | 黄色tv视频| 一区二区不卡视频在线观看 | 日韩精品欧美视频 | 亚洲精品国产精品99久久 | 欧美精品久久久久久久久久丰满 | 亚洲专区路线二 | 国产 视频 高清 免费 | 毛片黄色一级 | 91九色网址| 中文字幕久久精品 | 美女视频黄的免费的 | 婷婷伊人综合亚洲综合网 | 免费看久久 | 亚洲精品成人在线 | 伊人五月在线 | www.国产在线视频 | 97在线观看视频 | 天天弄天天操 | 色综合夜色一区 | 国产精品嫩草影院9 | 不卡的av电影在线观看 | 亚洲精品88欧美一区二区 | 国产视频精品久久 | 九九影视理伦片 | 91在线视频精品 | 欧美激情视频一区二区三区免费 | 黄污网 | 91视频 - 114av| 51久久成人国产精品麻豆 | 色综合天天天天做夜夜夜夜做 | 国产色拍拍拍拍在线精品 | 91福利视频网站 | 久久成人综合视频 | 在线观看视频一区二区 | 91精品国产九九九久久久亚洲 | 国产原创在线视频 | 天天射天天干天天 | 亚洲欧美日韩在线看 | 91精品视频播放 | 成人在线视频论坛 | 五月激情av | 丁香午夜| 超碰在线97国产 | 色天天久久| 999精品视频| 午夜久久美女 | 欧美一区二区三区在线观看 | 日韩精品中文字幕在线 | 国产精品久久电影网 | 中文字幕在线观看的网站 | 中文字幕精品www乱入免费视频 | 丁香婷婷久久久综合精品国产 | 亚洲免费在线看 | 日韩一三区| 免费不卡中文字幕视频 | 日韩免费二区 | a级片久久 | 欧美日韩xx | 欧美成年人在线视频 | 久久一区二区三区日韩 | 视频一区二区三区视频 | 国产又粗又猛又色 | 中文理论片 | 黄色免费观看 | 日韩视频中文字幕 | 久久男人影院 | www色av| 日韩在线观看一区二区三区 | 麻豆视频免费版 | 麻花传媒mv免费观看 | 黄视频色网站 | 亚洲乱码国产乱码精品天美传媒 | 国产精品日韩久久久久 | 日批网站在线观看 | 欧美精品资源 | 久久视频99 | 国产成人精品国内自产拍免费看 | 在线精品播放 | 五月婷婷播播 | 免费成人在线观看 | 人人看人人做人人澡 | 久久久久久久久艹 | a√天堂资源 | 欧美日韩视频一区二区三区 | 97麻豆视频| 久草视频中文在线 | 欧美福利视频一区 | 九九爱免费视频在线观看 | 日韩a级黄色片 | 亚洲电影在线看 | 在线播放 日韩专区 | 黄色软件视频大全免费下载 | 深爱五月网 | 中文字幕一区二区三区四区久久 | 五月天丁香综合 | 成人91在线 | 亚州精品一二三区 | 麻豆传媒一区二区 | 99久久久成人国产精品 | 探花视频免费观看高清视频 | 中文字幕在线成人 | 国产在线国偷精品产拍免费yy | 狠狠伊人 | 国产亚洲欧美精品久久久久久 | 四虎成人精品在永久免费 | 国产亚洲一区二区三区 | 久草在线视频首页 | 国产精品婷婷午夜在线观看 | 五月天综合网站 | 国产69精品久久久久9999apgf | 日韩免费电影一区二区三区 | 免费在线色 | 五月天婷亚洲天综合网精品偷 | 狠狠综合网 | 在线观看免费日韩 | 久久97超碰 | 在线观看网站你懂的 | 免费亚洲片 | 国产一区免费在线观看 | 一区二区三区四区在线 | 丁香五月亚洲综合在线 | av在线免费网站 | 国产清纯在线 | 久久久久久久久久久黄色 | 日韩精品专区 | 18做爰免费视频网站 | 免费网站观看www在线观看 | 亚洲精品国产精品乱码在线观看 | www.夜夜| 久久免费电影网 | 精品视频免费播放 | 成人一级片免费看 | 97人人模人人爽人人少妇 | 亚在线播放中文视频 | 亚洲一区久久久 | 天天插日日插 | 久久精品一区 | 久久久久国产成人免费精品免费 | 日韩一级电影网站 | 成人午夜影院在线观看 | 97超碰人人干 | 麻豆影视在线播放 | 99久在线精品99re8热视频 | 青青河边草观看完整版高清 | 久久久久久久久久久久久影院 | 日本少妇久久久 | 一本一道波多野毛片中文在线 | japanesexxxxfreehd乱熟 | 青春草视频在线播放 | 国产淫片| 亚洲一级电影在线观看 | 狠狠操天天干 | 日韩在线免费电影 | 欧美午夜一区二区福利视频 | 在线观看国产 | 在线观看 亚洲 | 中文字幕日韩在线播放 | 天天操天天干天天摸 | 欧美日韩三级 | 欧美福利在线播放 | 免费观看国产成人 | 久久夜色精品国产欧美一区麻豆 | 国产亚洲精品成人av久久ww | 欧美极品xxxxx | 色婷婷在线播放 | a电影免费看 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 免费无遮挡动漫网站 | 不卡视频一区二区三区 | 国产午夜精品在线 | 欧美日韩一二三四区 | 日韩av在线高清 | 久草视频精品 | 97超碰在线久草超碰在线观看 | 国产在线欧美日韩 | 91自拍91| 欧美一级片免费观看 | 国产精品久久久久久久毛片 | 日韩理论视频 | 在线观看91av | 日本久久久久久久久久 | 人人玩人人爽 | 91高清在线 | 午夜在线免费观看 | 国产自产在线视频 | 日日夜夜精品视频天天综合网 | av在线超碰 | 日韩av影视| 国产精品自拍在线 | 91在线一区二区 | 国产精在线 | 日夜夜精品视频 | 亚洲天堂网在线视频观看 | 视频一区在线免费观看 | 免费三级网 | 麻豆91精品91久久久 | 日本xxxxav| 亚洲电影av在线 | 国产一区二区三区高清播放 | 黄色av电影在线观看 | 国产美女网站在线观看 | 91视频链接 | 欧美调教网站 | 色黄久久久久久 | 69久久夜色精品国产69 | 高清美女视频 | 制服丝袜天堂 | 国产97视频在线 | 97成人资源 | 婷婷六月天在线 | 夜夜躁狠狠躁 | 精品视频免费看 | 欧美黄色成人 | 中文字幕精品一区二区精品 | 天天玩天天操天天射 | 视频高清 | 久久久久观看 | 国产美女视频一区 | 国产日韩欧美中文 | 久久久久久看片 | 97久久久免费福利网址 | 亚洲永久精品在线观看 | 91福利视频网站 | 国产夫妻自拍av | 中文字幕av全部资源www中文字幕在线观看 | 国产精品久久久久久影院 | 五月天综合激情 | 丁香九月激情综合 | 91一区二区三区在线观看 | 在线观看免费一级片 | 在线观看爱爱视频 | 91天天操 | 在线看污网站 | 婷婷六月综合亚洲 | 日韩精品一区二区三区高清免费 | 国产日产精品一区二区三区四区 | 免费黄色a级毛片 | 亚洲最快最全在线视频 | 91精品国产91 | 久久精品国产精品亚洲精品 | 777久久久 | 深爱激情综合 | 久久久久免费网站 | 久久久久久久久网站 | 国产精品一区二区三区久久 | 精品久久久成人 | 国产伦精品一区二区三区照片91 | 激情网在线观看 | a天堂免费 | 97久久精品午夜一区二区 | 国产字幕在线观看 | 国产精品久久久久aaaa | 99在线精品视频 | 九九九热精品免费视频观看网站 | 狠狠网 | 久久99久久久久久 | 国产午夜精品免费一区二区三区视频 | 九九热在线视频 | 久久久国产精品一区二区中文 | 9999精品视频| 91麻豆精品91久久久久同性 | 国产高清日韩欧美 | 操操操操网| 免费看的黄色小视频 | 日韩精品aaa | 日韩1级片 | 久久人人看 | 国产成人精品综合 | 欧亚日韩精品一区二区在线 | 国产v亚洲v | 九九久久久久久久久激情 | 国产又粗又猛又黄又爽的视频 | 亚洲天堂网在线播放 | 99在线视频播放 | 久色婷婷 | 国产精品九九久久久久久久 | 天天操操操操操 | 国产精品乱看 | 免费在线成人av电影 | 精品一二三四视频 | 婷婷国产在线 | 久久99久久99精品免视看婷婷 | 国产日韩欧美视频在线观看 | 中文字幕色综合网 | 天天干.com| 国产高清在线观看av | 亚洲最大在线视频 | 在线a视频 | 免费av大片 | 国内精品久久久久国产 | 九九99 | 欧美日韩精品久久久 | 日韩精品视频免费专区在线播放 | 色综合久久88色综合天天免费 | 国产 在线观看 | 欧美精品一级视频 | 日本3级在线观看 | 精品福利视频在线观看 | 婷婷丁香花五月天 | 欧美一级片在线免费观看 | 草久久精品 | 久久艹在线观看 | 一区二区欧美激情 | 国产亚洲精品无 | 国产一区二区三区在线免费观看 | 国产精品永久免费视频 | 91精品国产91久久久久福利 | 欧美另类一二三四区 | 久久伦理影院 | 国产96视频 | 九色91av | 欧美成人中文字幕 | 国产精品9999久久久久仙踪林 | 欧美精品999 | 亚洲欧美国产精品 | 在线电影日韩 | 日韩av一区二区在线播放 | 中文在线√天堂 | 久草视频在| 黄色在线免费观看网站 | 最新色站 | 91免费看黄色| 日韩伦理片一区二区三区 | 国产aaa免费视频 | 亚洲专区视频在线观看 | 日韩免费一区二区三区 | 免费在线观看不卡av | 久久99久久99精品免观看软件 | 成人三级网站在线观看 | 久久激情视频网 | 欧美日韩一级视频 | 麻豆视频免费入口 | 一区二区丝袜 | 有码中文字幕 | 色婷婷骚婷婷 | 久热免费 | 日本中文一级片 | 国产一区二区高清 | 麻豆视频免费入口 | 成人免费观看完整版电影 | 亚洲精品在线免费看 | 丁香激情网 | 国产高清视频在线播放 | 精品一二三四五区 | 久草在线观看资源 | 人成在线免费视频 | 在线观看日韩专区 | 久久免费视频在线观看30 | 国产韩国日本高清视频 | 午夜av免费| 超碰在线91 | 久久综合九色综合97_ 久久久 | 亚洲乱码在线 | 精品亚洲一区二区三区 | 色综合久久久久综合 | 成人影音在线 | 天天射天天操天天 | 色五月激情五月 | 久久精品女人毛片国产 | 久久婷婷视频 | 国产精品亚州 | 99国产视频在线 | 久草影视在线 | 日本久久久精品视频 | 免费观看的av | 国产色网站 | 国产高清网站 | 24小时日本在线www免费的 | 国产精品中文字幕在线 | 久久综合狠狠 | 日本深夜福利视频 | 日韩免 | 国产精品国产三级国产不产一地 | 日韩中文三级 | 国产精品日韩久久久久 | 国产成人三级一区二区在线观看一 | 操处女逼| 日韩免费观看视频 | 成人黄在线 | 日一日干一干 | 综合婷婷久久 | 在线а√天堂中文官网 | 久久久久亚洲国产精品 | 天天操天天摸天天射 | 91香蕉视频好色先生 | 日本一区二区三区免费观看 | 免费在线观看av网站 | 国产视频欧美视频 | 手机av电影在线观看 | 在线影视 一区 二区 三区 | 国产中文字幕在线看 | 免费在线激情电影 | 在线观看精品视频 | 亚洲精品美女久久 | 亚洲欧美视频网站 | 波多野结衣在线播放视频 | 97视频在线观看成人 | 亚洲专区 国产精品 | 麻豆精品在线视频 | 97超视频在线观看 | 97超碰人人| va视频在线 | 99免费在线视频 | 色婷婷激情五月 | 中文字幕高清av | 在线精品在线 | 欧美日韩高清 | 免费三级网 | 丁香六月天 | 成人免费一区二区三区在线观看 | 国产精品尤物 | 久久亚洲福利视频 | av线上看 | 亚洲激情国产精品 | 在线观看你懂的网站 | 精品国产一二三四区 | 亚洲精品视频在线免费 | 亚洲免费精品视频 | 亚洲理论片在线观看 | 久久男人免费视频 | 婷婷在线资源 | 免费看黄色毛片 | 日韩欧美精品免费 | 亚洲欧美在线观看视频 | 丁香六月伊人 | 国产黄色看片 | 亚洲综合在线观看视频 | 六月色播 | 国产精品你懂的在线观看 | 国产成人精品午夜在线播放 | av不卡网站 | 欧美日韩综合在线观看 | 又黄又爽的视频在线观看网站 | 精品亚洲午夜久久久久91 | 欧美另类一二三四区 | 国产福利一区二区在线 | 亚洲最新在线视频 | 五月黄色 | 日韩av电影中文字幕在线观看 | 美女视频黄免费的 | 一区二区伦理电影 | 久久一区二区三区超碰国产精品 | 日韩免费一区二区三区 | 国产精品第十页 | 一区视频在线 | 精品欧美一区二区三区久久久 | 亚洲国产三级 | 最近2019中文免费高清视频观看www99 | 午夜精品一区二区三区在线观看 | 一区二区三区日韩在线观看 | 久久激情片 | 欧美另类一二三四区 | 国产精品久一 | 成人一级在线观看 | 久久a久久 | 中文字幕在线看 | 婷婷色伊人 | 欧美精品一区二区三区四区在线 | 国产精品av一区二区 | 日韩av中文 | av观看免费在线 | 久草视频99 | 日韩精品免费在线观看 | 99免费看片 | 免费在线一区二区 | 天堂在线成人 | 久久精品99久久久久久 | 精品国产理论片 | 欧美在线free | 国产精品久久久久久久久大全 | 国产精品99久久免费观看 | 色91av| 日韩中文字幕免费电影 | 草久视频在线观看 | 超碰在线观看av.com | 色亚洲激情 | 波多野结衣一区二区三区中文字幕 | 中文在线天堂资源 | 精品爱爱 | 91亚洲狠狠婷婷综合久久久 | 欧美亚洲国产精品久久高清浪潮 | 特级西西444www高清大视频 | 日韩av一区在线观看 | 91麻豆精品国产91久久久无需广告 | 欧美成人aa | 91看片黄色| 娇妻呻吟一区二区三区 | 色婷婷伊人 | 国产无限资源在线观看 | 国产中文在线观看 | 97超碰国产精品 | 91精品免费视频 | 成年人在线免费看片 | 国产亚洲成人网 | 国产麻豆精品免费视频 | 精品福利视频在线 | 精品美女久久 | 国产精品亚洲a | 午夜视频在线观看一区二区三区 | 日韩欧美在线一区二区 | 中文字幕在线观看三区 | 日本三级不卡视频 | 97av在线| 在线免费国产视频 | 国产精品久久久久久一区二区三区 | 色中射| 永久免费av在线播放 | 婷婷激情在线 | 国产真实精品久久二三区 | 日韩在线中文字幕 | 亚洲午夜精品一区二区三区电影院 | 日本中文字幕视频 | 久久99精品波多结衣一区 | 免费三级黄 | 亚洲成a人片在线观看网站口工 | 粉嫩aⅴ一区二区三区 | 精品久久久一区二区 | 六月丁香久久 | 欧美一级性生活片 | 欧美激情精品久久久久 | 久久九九久久精品 | 欧美久久99| 高清中文字幕av | 怡红院av久久久久久久 | 国产一级片免费视频 | 四虎成人精品在永久免费 | 天天爽夜夜爽人人爽一区二区 | 久久久久久国产精品999 | 五月激情片 | 色欧美88888久久久久久影院 | 欧美色婷| 久久艹综合 | 国产成人在线观看免费 | 97色综合 | 丁香久久综合 | 精品免费久久久久久 | 欧美精品一区二区性色 | 亚洲小视频在线观看 | 国产成人综合精品 | 97在线免费视频 | 国产成人亚洲精品自产在线 | 成人一区在线观看 | 国产一区视频免费在线观看 | 六月婷婷色 | 亚洲精品午夜一区人人爽 | 亚洲经典视频在线观看 | 一区二区伦理 | 免费一级日韩欧美性大片 | 国产视频在线观看一区 | 国产电影黄色av | 天天舔夜夜操 | 国产91在| 在线观看你懂的网址 | 精品国内自产拍在线观看视频 | 国产无遮挡猛进猛出免费软件 | 精品视频在线观看 | 中文字幕乱码亚洲精品一区 | 在线看的av网站 | 99久久婷婷国产精品综合 | 女人久久久久 | www.神马久久 | 久久激情视频免费观看 | 一本—道久久a久久精品蜜桃 | 一区二区三区久久 | 亚洲国产偷 | 国产不卡片 | 国产精品av免费在线观看 | 亚洲经典精品 | 三级av小说 | 欧亚日韩精品一区二区在线 | 香蕉视频在线免费看 | 欧美午夜a | 国产精品一区二区在线免费观看 | 国产一区麻豆 | 蜜臀av网站 | 性色大片在线观看 | 欧美 激情 国产 91 在线 | 久久免费福利视频 | 毛片网站免费在线观看 | 久久99热这里只有精品国产 | 亚洲精品视频偷拍 | 99在线观看免费视频精品观看 | 99tvdz@gmail.com| 日韩高清精品免费观看 | www久久 | 久久久精品国产一区二区三区 | 欧美孕交vivoestv另类 | 99热超碰 | 久久 地址| 国产精品正在播放 | 色妞色视频一区二区三区四区 | 亚洲国产欧美一区二区三区丁香婷 | 成人免费视频网站 | 亚洲精品在线二区 | 欧美色图88| 国产精品久久久久久欧美 | 天天拍天天色 | 欧美在线观看小视频 | 欧美人体xx | 免费看的黄网站 | 国产网站av | 欧美一级性生活片 | 91大神在线观看视频 | 五月婷丁香 | 成年人在线免费看视频 | 精品自拍sae8—视频 | av在线播放不卡 | 激情婷婷综合网 | 夜色成人av | 成年人国产视频 | 国产 日韩 欧美 中文 在线播放 | a级国产乱理论片在线观看 特级毛片在线观看 | 激情欧美一区二区三区 | 欧美日韩一区二区在线观看 | 黄视频色网站 | 国产专区视频在线观看 | 日韩成人av在线 | 午夜精品视频一区 | 欧美日本高清视频 | 伊人资源视频在线 | 中文字幕亚洲五码 | 999视频网 | 亚洲午夜精品久久久久久久久久久久 | 九九热av | 麻豆久久一区 | 国产福利免费在线观看 | 中文字幕区 | 精品国产免费看 | a级国产片 | 国产免费视频在线 | 成年人在线观看 | av免费在线播放 | 青青河边草手机免费 | 久久精品99久久 | 精品字幕 | 亚洲欧洲av在线 | 天天干天天想 | 九九久久成人 | 欧美成人亚洲成人 | 欧美日韩视频在线一区 | 国产色妞影院wwwxxx | 九九久久影院 | 日韩高清在线观看 | 97国产精品免费 | 成人av动漫在线观看 | 综合精品在线 | 中文超碰字幕 | 在线岛国av | 国产精品免费观看在线 | 欧洲黄色片 | 亚洲精品小视频 | 久久久久日本精品一区二区三区 | 色av婷婷 | 久久久久福利视频 | 午夜色站 | 国产美女被啪进深处喷白浆视频 | 日韩免费不卡视频 | 欧美日韩午夜爽爽 | 久久av网 | 99精品一级欧美片免费播放 | 精品 一区 在线 | 国产中文字幕91 | av中文天堂在线 | 毛片1000部免费看 | 国产最顶级的黄色片在线免费观看 | 亚洲综合色激情五月 | 国产精品ssss在线亚洲 | 视频在线观看国产 | 日韩网站一区二区 | 奇米四色影狠狠爱7777 | 中文字幕免费在线看 | 一区二区 不卡 | 精品1区2区3区 | 国产一区二区不卡视频 | 久草在线视频资源 | 亚洲精品美女在线 | 久久网站最新地址 | 成人免费视频免费观看 | 日韩av成人在线 | 久草a在线 | 久久综合久久久久88 | 日韩精品在线视频 | 成人欧美在线 | 久九视频 | 欧产日产国产69 | 欧美一区二区三区四区夜夜大片 | 精品国产免费av | 天天草天天插 | 国产高清在线永久 | 国产一区免费在线观看 | 最新av在线播放 | 久久久久久毛片精品免费不卡 | 麻豆视频在线看 | 激情综合色综合久久 | 黄色.com| 91av成人| 在线观看国产日韩欧美 | 99国产精品久久久久久久久久 | 亚洲人成在线观看 | 美女av电影| 精品一区三区 | 中文字幕av有码 | 热久久这里只有精品 | 国产传媒一区在线 | 精精国产xxxx视频在线播放 | 欧美精品在线一区 | 久草在线视频中文 | 亚洲欧美色婷婷 | 精品在线视频播放 | 日韩欧美视频免费在线观看 | 精品国产一区二区三区四区在线观看 | 国产不卡免费av | 国产午夜三级一区二区三桃花影视 | 天堂在线视频免费观看 | 欧美久久久 | 国产一级二级三级在线观看 | 日韩激情久久 | 成人黄色在线电影 | 六月丁香婷 | 久草综合视频 | 色偷偷网站视频 | 97在线观看免费 | 三级av中文字幕 | 国产福利电影网址 | 久久久久久久久久久综合 | 久久精品美女视频网站 | 日韩av影片在线观看 | 人人精品久久 | 免费看片亚洲 | 免费视频久久久 | 欧美色黄 | 97av视频| 深爱激情久久 | 亚洲国产精品久久久久婷婷884 | 亚洲第一区在线播放 | 婷婷五综合 | 免费又黄又爽视频 | av一区二区在线观看中文字幕 | 婷婷六月丁香激情 | 成人18视频 | 国产亚洲成人网 | 黄色毛片大全 | 黄色1级毛片 | 99久久久久久久久久 | 亚洲午夜精 | 成人av在线直播 | 欧美综合在线视频 | 蜜臀av性久久久久av蜜臀妖精 | 久久美女高清视频 | 能在线看的av | 精壮的侍卫呻吟h | 国产人成精品一区二区三 | 精品亚洲欧美无人区乱码 | 国产啊v在线观看 | 久久久国产精品亚洲一区 | 欧美日韩另类在线观看 | 色视频网站在线观看一=区 a视频免费在线观看 | 亚洲黄色成人网 | 国产精品人成电影在线观看 | 狠狠干天天 | 久久少妇av | 91正在播放 | 成人免费观看电影 | 久久亚洲二区 | 欧美性色黄 | av天天草| 久草在线91 | 欧美一二区在线 | 欧美日韩一级在线 | 天天操天天综合网 | 成人国产精品免费观看 | 国产日韩欧美自拍 | 中文电影网 | 天天干夜夜擦 | 亚洲激情在线播放 | 国产精品久久久久久吹潮天美传媒 | 一区二区三区高清在线 | 久久久久久久久久久影视 | 亚洲黄色激情小说 | 亚洲视频分类 | 手机版av在线| 在线观看免费国产小视频 | 久久精品国产99 | 免费看网站在线 | 久久久久国产精品午夜一区 | 亚洲区二区 | 国产成人黄色av | a久久免费视频 | 97国产视频| 中文字幕在线视频网站 | 青青河边草免费观看完整版高清 | 久久精品五月 | 国产色婷婷精品综合在线手机播放 | 久草视频在线免费看 | 天天躁天天狠天天透 | 黄色在线网站噜噜噜 | 亚州天堂 | 国产午夜精品理论片在线 | 国产精品成人一区二区 | 激情欧美国产 | 成人免费在线视频观看 | 国产在线 一区二区三区 | 福利久久久| 国产日韩欧美在线 | 2022久久国产露脸精品国产 | 在线观看不卡视频 | 中文字幕国内精品 | 国产一区二区免费 | 午夜美女wwww | 豆豆色资源网xfplay | 91精品国产福利在线观看 | 久久三级视频 | 天操夜夜操| 亚洲黄网站 | 天天干夜夜 | 久久99国产精品久久99 | 97视频免费观看 | 日韩在线视频不卡 | 玖草在线观看 | 黄色毛片视频免费观看中文 | 麻豆成人精品视频 | 黄网在线免费观看 | 亚洲综合色视频 | 国产一区久久久 | 91九色蝌蚪视频在线 | 一区二区三区电影在线播 | 久草久草久草久草 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 日日日视频| 国产精品久久伊人 | 日韩 国产 | 国产乱视频| 天天操月月操 | 国产91在线观 | 日韩精品一区二区在线视频 | 日韩亚洲国产中文字幕 | 国产免费又黄又爽 | 91人网站 | 国产精品免费看 | 国产原创91 | 国产麻豆剧传媒免费观看 | 五月天综合色 | 亚洲精品在线观看不卡 | 亚洲乱码久久 | 久草香蕉在线 | 久久福利小视频 | av在线免费播放 | 久久综合色婷婷 | 亚洲区精品视频 | 五月激情五月激情 | 国产只有精品 | 国产精品美女久久久久久网站 | 国产精品网红直播 | 成人性生交大片免费观看网站 | 亚洲做受高潮欧美裸体 | 国产精品视频免费观看 | 91色在线观看 | 日韩成人av在线 | 亚洲综合激情网 | 麻豆传媒视频在线 | 亚洲综合色视频在线观看 | 亚洲国产免费 | 超碰97久久 | 亚洲精品白浆高清久久久久久 | 久久精品久久久久 | 日韩电影精品 | 激情婷婷六月 | v片在线看 | 免费观看9x视频网站在线观看 | 久久精彩| 91精品视频在线播放 | 日韩视频免费观看高清完整版在线 | 精品久久久影院 | 91超级碰碰 | 日韩大片在线看 | www蜜桃视频| 国产精品久久久久久一二三四五 | 福利精品在线 | 国产日产在线观看 | 91视频91自拍 | 中文字幕观看在线 | 日韩丝袜在线观看 | 免费在线观看日韩视频 | 国产一区二区在线免费观看 | 91免费高清观看 | 日韩激情久久 | 日韩av资源站 | 午夜 免费 | 精品亚洲网 | 国产精品久久久久久久av电影 | 91网在线看 | av福利在线免费观看 | 天堂在线一区 | 91在线公开视频 | 日韩狠狠操 | 九九久久国产精品 | 日韩高清免费观看 | 国产精品一区二区三区在线免费观看 | 91精品在线免费 | 国产网站av | 久草精品在线播放 | 中文字幕乱码亚洲精品一区 | 婷婷在线免费视频 | 天堂av在线网 | 国产手机在线精品 | 日韩免费视频线观看 | 亚洲天堂毛片 | 午夜精品久久久久久中宇69 | 99re8这里有精品热视频免费 | 免费看一级特黄a大片 | 操操操日日日干干干 | 精精国产xxxx视频在线播放 | 99久久婷婷国产综合精品 | 中文字幕精品一区 | 欧美最新另类人妖 | 国产成人精品亚洲日本在线观看 | 97福利视频 | 日韩欧美高清在线 | av网站在线观看免费 | 国产精品密入口果冻 | 日韩免费电影一区二区三区 | 啪一啪在线 | 最近日本中文字幕a | 国产精品一码二码三码在线 | 九九三级毛片 | 国产在线视频导航 | 欧美另类sm图片 | 中文字幕在线免费观看 | 精品网站999www | 国产精品一区二区三区在线看 | 又爽又黄在线观看 | 国产成人在线观看免费 | 久久高清毛片 | 黄色片软件网站 | 国产精品毛片一区二区 | 精品在线二区 | 国产精品成人一区二区三区吃奶 | 国产精品色婷婷 | 免费看的黄网站 | 99精品久久99久久久久 | 日韩在线大片 | 日韩一级黄色大片 | 日韩亚洲国产中文字幕 | 精品国产一区二区三区久久久蜜臀 | 久草精品视频 | 精品久久久久久久久久久院品网 | 国产理论一区二区三区 | 中文字幕你懂的 | 久久久久久国产精品久久 | 欧美成人h版在线观看 | 日韩精品视频久久 | 亚洲永久精品在线观看 | 中文字幕文字幕一区二区 | 大型av综合网站 | 久久综合中文色婷婷 | 欧美在线视频二区 | 日韩电影在线观看一区二区 | 99久久精品国产一区二区三区 | 久久精品a | 午夜精品一区二区三区在线播放 | 欧美综合在线视频 |