<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 12, comments - 0, trackbacks - 0, articles - 7
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
    作者blog:http://pengjiaheng.iteye.com/

    數(shù)據(jù)類型:基本類型和引用類型
    基本類型的變量保存原始值,它代表的值就是數(shù)值本身。byte,short,int,long,char,float,double,Boolean,returnAddress
    引用類型代表某個(gè)對(duì)象的引用,存放引用值的地址。類類型,接口類型,數(shù)組

    棧stack 和 堆heap:
    stack是運(yùn)行時(shí)單位,每個(gè)線程都會(huì)有線程棧與之對(duì)應(yīng)。里面存儲(chǔ)的是當(dāng)前線程相關(guān)信息。包括局部變量,程序運(yùn)行狀態(tài),方法返回值等
    heap是存儲(chǔ)數(shù)據(jù)的地方,所有線程共享。存放對(duì)象信息。

    1 從軟件設(shè)計(jì)的角度看,stack代表處理邏輯,heap代表數(shù)據(jù)。
    2 heap的數(shù)據(jù)被多個(gè)線程共享,則多個(gè)線程可以訪問同一對(duì)象。heap的數(shù)據(jù)可以供所有stack訪問,節(jié)省了空間
    3 stack因?yàn)檫\(yùn)行時(shí)的需要,保存系統(tǒng)運(yùn)行的上下文,需要進(jìn)行地址段的劃分。并且只能向上增長,因此限制了stack的存儲(chǔ)能力。而heap中的數(shù)據(jù)可以根據(jù)需要?jiǎng)討B(tài)增長,相應(yīng)stack中只需要記錄heap中的一個(gè)地址即可。
    4 面向?qū)ο缶褪莝tack和heap的完美結(jié)構(gòu)。對(duì)象的屬性就是數(shù)據(jù),存放在heap中。而對(duì)象的方法就是運(yùn)行邏輯,放在stack中。

    在java中,main函數(shù)就是stack的起點(diǎn),也是程序的起點(diǎn)。

    heap中存放的是對(duì)象實(shí)例,stack中是基本數(shù)據(jù)類型和heap中對(duì)象的引用。一個(gè)對(duì)象的大小是不可以估計(jì)的,甚至動(dòng)態(tài)變化的。但是在stack中,一個(gè)對(duì)象只對(duì)應(yīng)了一個(gè)4byte的引用。這就是stack和heap分離的好處。

    因?yàn)榛緮?shù)據(jù)類型占用的空間是1到8個(gè)字節(jié),需要空間比較小,而且不會(huì)出現(xiàn)動(dòng)態(tài)增長的情況,因此stack中存儲(chǔ)就夠了。

    java中參數(shù)傳遞時(shí)傳值還是傳引用?
    程序永遠(yuǎn)在stack中運(yùn)行,因而參數(shù)傳遞的只是基本類型或者對(duì)象的引用。不會(huì)傳遞對(duì)象本身。
    簡單說,java在方法調(diào)用傳遞參數(shù)時(shí),都是進(jìn)行傳值調(diào)用。
    當(dāng)傳遞引用的時(shí)候,程序會(huì)將引用查找到heap中的那個(gè)對(duì)象,這個(gè)時(shí)候進(jìn)行修改,修改的是真實(shí)的對(duì)象,而不是引用本身!!!
    所以傳遞引用也是傳遞的最終值。
    另外,因?yàn)閭鬟f基本類型是傳遞了基本值,所以修改的也是另一個(gè)copy,而無法修改原值。只有傳遞的是對(duì)象引用時(shí)才能修改原對(duì)象。

    stack是程序運(yùn)行最根本的東西。程序運(yùn)行可以沒有heap,但必須有stack。

    java中,stack的大小是通過-Xss來設(shè)置的,當(dāng)stack中數(shù)據(jù)比較多時(shí),需要適當(dāng)調(diào)大這個(gè)值,否則會(huì)出現(xiàn)java.long.StackOverflowError異常


    Java對(duì)象的大小
    一個(gè)空object的大小是8byte,這個(gè)大小只是保存heap中一個(gè)沒有任何屬性的對(duì)象大大小。如:
    Object o = new Object();
    它所占的空間為4byte + 8byte。4byte為stack中保存對(duì)象引用需要的空間,8byte是heap中對(duì)象的信息。
    因?yàn)樗衘ava非基本類型對(duì)象都是集成自O(shè)bject,所以不論什么樣的java對(duì)象,大小都必須大于8byte
    1 
    2 Class NewObject{
    3     int count;
    4     boolean flag;
    5     Object o;
    6 }
    其大小為:對(duì)象大小(8) + int型(4) + boolean(1) + 對(duì)象引用(4) = 17byte
    但是因?yàn)閖ava在內(nèi)存中對(duì)對(duì)象進(jìn)行分配時(shí)都是以8的倍數(shù)來分配,因此會(huì)為NewObject對(duì)象實(shí)例分配 24byte。

    需要注意基本類型的包裝類型的大小。因?yàn)榘b類型已經(jīng)成為對(duì)象了,因此要把包裝類型當(dāng)對(duì)象來看待。如Integer,Float,Double等
    一個(gè)包裝類型最少占用16byte(8的倍數(shù)),它是使用基本類型的N倍,因此盡量少用包裝類。

    對(duì)象引用分為:強(qiáng)引用,軟引用,弱引用和虛引用。
    1 強(qiáng)引用StrongReference:我們一般聲明對(duì)象時(shí)jvm生成的引用,強(qiáng)引用環(huán)境下,垃圾回收需要嚴(yán)格判斷。如果被強(qiáng)引用則不會(huì)被回收
    2 軟引用SoftReference:一般作為緩存來使用。在垃圾回收的時(shí)候,jvm會(huì)根據(jù)當(dāng)前系統(tǒng)的剩余內(nèi)存來決定是否對(duì)軟引用進(jìn)行回收。如果jvm發(fā)生outOfMemory時(shí),肯定是沒有軟引用存在的。
    3 弱引用WeakReference:與軟引用類似,都是作為緩存來使用。不同的是在垃圾回收的時(shí)候,弱引用一定會(huì)被回收。因此其生命周期只存在一個(gè)垃圾回收周期內(nèi)。
    4 虛引用PhantomReference:形同虛設(shè),隨時(shí)會(huì)被垃圾回收。其主要功能是與引用隊(duì)列(ReferenceQueue)聯(lián)合使用。當(dāng)垃圾回收發(fā)現(xiàn)一個(gè)對(duì)象有虛引用時(shí),就會(huì)在回收內(nèi)存之前,將虛引用添加到與之關(guān)聯(lián)的引用隊(duì)列中。程序可以通過判斷引用隊(duì)列中是否有虛引用來了解引用對(duì)象是否將要被回收。從而決定是否采取行動(dòng)。

    系統(tǒng)一般使用強(qiáng)引用。軟引用和弱引用一般是在內(nèi)存大小比較受限的情況下使用。常用在桌面引用系統(tǒng)中。


    垃圾回收基本算法
    1 引用計(jì)數(shù) Reference Counting
    古老的回收算法。對(duì)象多一個(gè)引用,就增加一個(gè)計(jì)數(shù),刪除一個(gè)引用則減少一個(gè)計(jì)數(shù)。垃圾回收時(shí),只收集計(jì)數(shù)為0的對(duì)象。
    該算法最致命的是無法處理循環(huán)引用的問題。
    2 標(biāo)記-清除 Mark-Sweep
    此算法分為兩個(gè)階段。第一階段從引用根節(jié)點(diǎn)開始標(biāo)記所有被引用的對(duì)象,第二階段遍歷整個(gè)heap,把未標(biāo)記的對(duì)象清除。
    此算法需要暫停整個(gè)應(yīng)用。同時(shí)產(chǎn)生內(nèi)存碎片。
    3 復(fù)制 Copying
    此算法把空間劃分為2個(gè)相等的區(qū)域。每次只使用其中一個(gè)區(qū)域。垃圾回收時(shí),遍歷當(dāng)前使用區(qū)域,把正在使用中的對(duì)象復(fù)制到另一個(gè)區(qū)域中。此算法每次只處理正在使用中的對(duì)象,因此復(fù)制成本比較小,同時(shí)復(fù)制過去以后還能進(jìn)行相應(yīng)的內(nèi)存整理,不會(huì)出現(xiàn)碎片。
    此算法的缺點(diǎn)是需要兩倍的內(nèi)存空間。
    4 標(biāo)記-整理 Mark-Compact
    此算法結(jié)合了 Mark_Sweep 和 Copying 兩個(gè)算法的優(yōu)點(diǎn)。
    第一階段從根節(jié)點(diǎn)開始標(biāo)記所有被引用對(duì)象,第二階段遍歷整個(gè)heap,清除未標(biāo)記對(duì)象并且把存活對(duì)象壓縮到heap的其中一塊,按照順序擺放。
    此算法避免了碎片問題,和Copying算法的空間問題。

    5 增量收集 Incremental Collecting 
    實(shí)時(shí)垃圾回收算法,在應(yīng)用進(jìn)行的同時(shí)進(jìn)行垃圾回收,jdk5 沒有使用此算法
    6 分代收集 Generational Collecting
    基于對(duì)對(duì)象生命周期分析后得出的垃圾回收算法。把對(duì)象分為年青代、年老代、持久代,對(duì)不同周期的對(duì)象采用不同的算法(上面算法的一個(gè))進(jìn)行回收。

    7 串行收集
    使用單線程處理所有垃圾回收工作,因?yàn)闊o序多線程交互,更容易實(shí)現(xiàn),而且效率很高。但是無法使用多處理器的優(yōu)勢,所以只適合單處理器的機(jī)器。
    8 并行收集
    使用多線程處理垃圾回收工作速度快,效率高。理論上cpu數(shù)目越多,越能體現(xiàn)并行收集的優(yōu)勢
    9 并發(fā)收集
    前面兩個(gè)在進(jìn)行垃圾回收的時(shí)候,需要暫停整個(gè)運(yùn)行環(huán)境。因此系統(tǒng)會(huì)有明顯的暫停,暫停時(shí)間因?yàn)閔eap越大而越長。


    垃圾回收面臨的問題

    1 如何區(qū)分垃圾?
    因?yàn)橐糜?jì)數(shù)無法解決循環(huán)引用。所有后來的垃圾回收算法都是從程序運(yùn)行的根節(jié)點(diǎn)出發(fā),遍歷整個(gè)對(duì)象引用,查找存活的對(duì)象。因?yàn)閟tack是真正進(jìn)行程序執(zhí)行的地方,所以要知道哪些對(duì)象正在被使用,需要從java stack開始。如果有多個(gè)線程,必須對(duì)這些線程對(duì)應(yīng)的所有stack進(jìn)行檢查。
    除了stack外,還有系統(tǒng)運(yùn)行時(shí)的寄存器,也是存儲(chǔ)程序運(yùn)行時(shí)數(shù)據(jù)的地方。這樣以stack和寄存器中的引用為起點(diǎn),來找到heap中的對(duì)象,又從這些對(duì)象中找到對(duì)heap中其他對(duì)象的引用,這樣逐步擴(kuò)展。最終以null引用或基本類型結(jié)束,這樣就形成了一棵以java stack中引用所對(duì)應(yīng)的對(duì)象為根節(jié)點(diǎn)的一棵對(duì)象數(shù)。如果stack中有多個(gè)引用,則最終形成多棵對(duì)象樹。這些對(duì)象樹上的對(duì)象,都是當(dāng)前系統(tǒng)運(yùn)行所需要的對(duì)象,不能被回收。而其他剩余對(duì)象,視為無法被引用的對(duì)象,可以被回收。
    因此垃圾回收的起點(diǎn)是一些根對(duì)象(java stack,static 變量,寄存器……)。最簡單的java stack就是main函數(shù)。這種回收方式,就是Mark-Sweep。

    2 如何處理碎片?
    因?yàn)椴煌琷ava對(duì)象存活時(shí)間不同,因此程序運(yùn)行一段時(shí)間后,會(huì)出現(xiàn)零散的內(nèi)存碎片。碎片最直接的問題就是導(dǎo)致無法分配大塊的內(nèi)存空間,以及程序運(yùn)行效率降低。Copying和Mark-Compact都可以解決碎片問題

    3 如何解決同時(shí)存在的對(duì)象創(chuàng)建和對(duì)象回收問題
    垃圾回收線程是回收內(nèi)存的,程序運(yùn)行是消耗內(nèi)存的,一個(gè)回收內(nèi)存,一個(gè)分配內(nèi)存,兩者是毛段的。因此,在現(xiàn)有的垃圾回收方式中,在垃圾回收前,一般都需要暫停整個(gè)應(yīng)用(暫停內(nèi)存分配),然后進(jìn)行垃圾回收,回收完成后再繼續(xù)應(yīng)用。
    這樣的弊端是,當(dāng)heap空間持續(xù)增大時(shí),垃圾回收的時(shí)間也將相應(yīng)增長,相應(yīng)的程序暫停時(shí)間也增長。一些對(duì)時(shí)間要求很高的應(yīng)用,比如最大暫停時(shí)間要求是幾百ms,那么當(dāng)heap空間大于幾個(gè)G時(shí),就可能超時(shí)。這種情況下,垃圾回收會(huì)成為系統(tǒng)運(yùn)行的一個(gè)瓶頸。為了解決這個(gè)矛盾,有了并發(fā)垃圾回收算法。使用這個(gè)算法,垃圾回收線程與程序運(yùn)行線程同時(shí)運(yùn)行。沒有暫停,算法復(fù)雜性會(huì)大大增加,系統(tǒng)處理能力也相應(yīng)降低。同時(shí)碎片問題將會(huì)比較難解決。


    分代垃圾回收詳述:
    1 為什么要分代?
    基于這樣一個(gè)事實(shí):不同對(duì)象的生命周期是不一樣的。因此不同生命周期的對(duì)象可以采取不同的收集方式,以便提高回收效率。
    在java運(yùn)行過程中會(huì)產(chǎn)生大量對(duì)象。其中有些對(duì)象是與業(yè)務(wù)信息相關(guān)的。比如http請求中的session對(duì)象、線程、socket連接,這些跟業(yè)務(wù)直接掛鉤,因此生命周期比較長。但是程序運(yùn)行過程中生成的臨時(shí)變量,生命周期會(huì)比較短。比如String對(duì)象等。

    2 如何分代?
    jvm中共劃為三個(gè)代:年輕代(Young Generation)、年老代(Old Generation)、持久代(Permanent Generation)
    持久代主要存放Java類信息,與垃圾回收要收集的java對(duì)象關(guān)系不大。年青代和年老代是對(duì)垃圾收集影響最大的。

    年輕代:
    1 所有新生成的對(duì)象首先都是放在“年輕代"里的。年輕代的目標(biāo)就是盡可能快速的收集那些生命周期短的對(duì)象。
    年輕代分為三個(gè)區(qū):1個(gè)Eden區(qū),2個(gè)Survivor(幸存,殘余)區(qū)
    大部分對(duì)象在Eden區(qū)生成,當(dāng)Eden區(qū)滿時(shí),還存活的對(duì)象將被復(fù)制到Survivor1區(qū),當(dāng)Survivor1區(qū)滿時(shí),此區(qū)的存活對(duì)象將被復(fù)制到Survivor2區(qū),此時(shí),Eden區(qū)滿時(shí)還存活的對(duì)象將復(fù)制到Survivor2中,Survivor1區(qū)會(huì)被清空當(dāng)Survivor2區(qū)也滿時(shí)(包含從1中復(fù)制過來的對(duì)象和從Eden區(qū)過來的對(duì)象),從Survivor1區(qū)復(fù)制過來的并且還存活的對(duì)象,將被復(fù)制到"年老代"的年老區(qū)(Tenured Space)。Survivor2區(qū)中新增加的從Eden區(qū)過來的還存活的對(duì)象,將復(fù)制到Survivor1中,Survivor2被清空。之后,Eden區(qū)滿時(shí)還存活的對(duì)象就會(huì)復(fù)制到Survivor1中。重復(fù)這樣的循環(huán)。
    兩個(gè)Survivor區(qū)是對(duì)稱的,沒有先后順序。所以同一個(gè)區(qū)中可能同時(shí)存在從Eden復(fù)制過來的對(duì)象和另一個(gè)Survivor區(qū)復(fù)制過來的對(duì)象。
    而復(fù)制到年老代的Tenured區(qū)的只有從第一個(gè)Survivor區(qū)過來的對(duì)象,因?yàn)門enured區(qū)存放的是從第一個(gè)Survivor區(qū)過來,依舊存活的對(duì)象。
    兩個(gè)Survivor區(qū)中總有一個(gè)是空的。同時(shí)根據(jù)需要,可以配置多個(gè)Survivor區(qū),延長對(duì)象在年輕代中的存在時(shí)間,減少被放到年老代的可能。
    2 年老代
    在年輕代中經(jīng)歷了N次垃圾回收后仍然存活的對(duì)象,就會(huì)被放到年老代。因此年老代存放的都是生命周期較長的對(duì)象。
    3 持久代
    用于存放靜態(tài)文件,如java類,方法等。
    持久代對(duì)垃圾回收沒有顯著影響,但是有些應(yīng)用可能動(dòng)態(tài)生成或者調(diào)用一些class,例如Hibernate等,在這種時(shí)候需要設(shè)置一個(gè)比較大的持久代空間來存放這些運(yùn)行過程中新增的類。持久代大小通過-XX:MaxPermSize=<N>進(jìn)行設(shè)置。

    什么情況下觸發(fā)垃圾回收?
    由于對(duì)象進(jìn)行了分代處理,因此垃圾回收區(qū)域、時(shí)間也不一樣。
    GC(Garbage Collection)有兩種類型:Scavenge GC 和 Full GC
    1 Scavenge GC 
    一般情況下,當(dāng)新對(duì)象生成,并且在Eden區(qū)申請空間失敗時(shí),就會(huì)觸發(fā)Scavenge GC。對(duì)Eden區(qū)進(jìn)行GC,清除非存活對(duì)象,并且把尚且存活的對(duì)象移動(dòng)到Survivor區(qū)。然后整理Survivor的兩個(gè)區(qū)。這種方式的GC是對(duì)年輕代的Eden區(qū)進(jìn)行,不會(huì)影響到年老代。
    因?yàn)榇蟛糠謱?duì)象都是從Eden區(qū)開始的,同時(shí)Eden區(qū)不會(huì)分配的很大,所以Scavenge GC 會(huì)頻繁進(jìn)行。
    一般這里需要使用速度快,效率高的算法,使Eden區(qū)盡快空閑出來。
    2 Full GC
    對(duì)整個(gè)Heap進(jìn)行整理,包括年輕代,年老代和持久代。Full GC因?yàn)樾枰獙?duì)整個(gè)進(jìn)行回收,所以比Scavenge GC要慢,因此應(yīng)該盡可能減少Full GC的次數(shù)。在對(duì)jvm調(diào)優(yōu)的過程中,很大一部分工作就是對(duì)Full GC的調(diào)節(jié)。導(dǎo)致Full GC是因?yàn)槿缦路椒ǎ?br />
    • 年老代的Tenured區(qū)被寫滿
    • 持久代被寫滿
    • System.gc()被顯式調(diào)用
    • 上一次GC之后Heap的各區(qū)域分配策略動(dòng)態(tài)變化

    選擇合適的垃圾收集算法
    1 串行收集器
    用單線程處理所有垃圾回收工作,因?yàn)闊o需多線程交互,所以效率比較高。但是,無法使用多處理器的優(yōu)勢,所以只適合單處理器機(jī)器。
    也可以用在小數(shù)據(jù)量(100M)情況下的多處理器機(jī)器上。用-XX:+UseSerialGC打開

    2 并行收集器
    對(duì)年輕代進(jìn)行并行垃圾回收,因此可以減少垃圾回收時(shí)間。一般在多線程多處理器上使用。使用-XX:+UseParallelGC打開。
    并行收集器在J2SE5.0更新上引入,在java SE6.0中進(jìn)行了增強(qiáng),可以對(duì)年老代進(jìn)行收集。如果年老代不使用并發(fā)收集的話,默認(rèn)是使用單線程進(jìn)行垃圾回收,因此會(huì)制約擴(kuò)展能力。使用-XX:+UseParallelOldGC打開。
    設(shè)置:
    • 并行垃圾回收的線程數(shù),使用-XX:ParallelGCThreads=<N>。此值可以設(shè)置與機(jī)器處理器數(shù)量相等。
    • 最大垃圾回收暫停,指定垃圾回收時(shí)的最長暫停時(shí)間,通過-XX:MaxGCPauseMillis=<N>指定。N為毫秒,如果指定了此值,heap大小和垃圾回收相關(guān)參數(shù)會(huì)進(jìn)行調(diào)整以達(dá)到指定值。設(shè)定此值會(huì)減少應(yīng)用吞吐量。
    • 吞吐量,為垃圾回收時(shí)間與非垃圾回收時(shí)間的比值,通過-XX:GCTimeRatio=<N>來設(shè)定,公式為1/(1+N)。例如,N=19時(shí),表示5%的時(shí)間用于垃圾回收。默認(rèn)值是99,即用1%的時(shí)間用于垃圾回收。
    3 并發(fā)收集器
    可以保證大部分工作都并發(fā)進(jìn)行(應(yīng)用不停止),垃圾回收只暫停很少的時(shí)間,此收集器適合對(duì)響應(yīng)時(shí)間要求比較高的大中規(guī)模應(yīng)用。
    使用-XX:+UseConcMarkSweepGC打開。
    并發(fā)收集器主要減少年老代的暫停時(shí)間,它在應(yīng)用不停止的情況下使用獨(dú)立的垃圾回收線程,跟蹤可達(dá)對(duì)象。在每個(gè)年老代垃圾回收周期中,在收集出氣并發(fā)收起會(huì)對(duì)整個(gè)應(yīng)用進(jìn)行簡短的暫停,在收集中還會(huì)再暫停一次。第二次暫停時(shí)間比第一次稍長,在此過程中多個(gè)線程同時(shí)進(jìn)行垃圾回收工作。
    并發(fā)收集器使用處理器換來短暫的停頓時(shí)間。
    在一個(gè)N個(gè)處理器的系統(tǒng)上,并發(fā)收集部分使用K/N個(gè)可用處理器進(jìn)行回收,一般情況下1<=K<=N/4。即K小于N的四分之一。
    在只有一個(gè)處理器的主機(jī)上使用并發(fā)收集器,設(shè)置為incremental mode模式也可以獲得較短的停頓時(shí)間。

    浮動(dòng)垃圾(Floating Garbage):
    由于在應(yīng)用運(yùn)行的同時(shí)進(jìn)行垃圾回收,所以有些垃圾可能在垃圾回收進(jìn)行完成時(shí)產(chǎn)生,這樣就造成了“Floating Garbage”,這些垃圾需要在下次垃圾回收周期時(shí)才能回收掉。所有,并發(fā)收集器一般需要預(yù)留20%的空間用于浮動(dòng)垃圾。

    并發(fā)模式失敗(Concurrent Mode Failure):
    并發(fā)收集器在應(yīng)用運(yùn)行時(shí)進(jìn)行收集,所以需要保證heap在垃圾回收的這段時(shí)間有足夠的空間供程序使用,否則,垃圾回收還未完成,heap空間先滿了。這種情況下就會(huì)發(fā)生并發(fā)模式失敗,此時(shí)整個(gè)應(yīng)用會(huì)暫停,進(jìn)行垃圾回收。
    為了保證有足夠內(nèi)存供并發(fā)收集器使用,可以設(shè)置-XX:CMSInitiatingOccupancyFraction=<N>指定剩余多少heap時(shí)開始執(zhí)行并發(fā)收集。

    1 串行serial收集器,適用于數(shù)據(jù)量比較小(100M)的應(yīng)用,或者單處理器下并且對(duì)響應(yīng)時(shí)間無要求的應(yīng)用。
    缺點(diǎn):只能用于小型應(yīng)用
    2 并行parallel收集器,適用于對(duì)吞吐量有高要求,多cpu,對(duì)應(yīng)用相應(yīng)時(shí)間無要求的大中型應(yīng)用。如后臺(tái)處理、科學(xué)計(jì)算。
    缺點(diǎn):垃圾收集過程中應(yīng)用響應(yīng)時(shí)間可能加長
    3 并發(fā)concurrent收集器:適用于對(duì)響應(yīng)時(shí)間有高要求,多cpu的大中型應(yīng)用。如web服務(wù)器、應(yīng)用服務(wù)器、電信交換、集成開發(fā)環(huán)境。



    P26……












    主站蜘蛛池模板: 国产一级淫片免费播放电影| 69精品免费视频| 国产91久久久久久久免费| 亚洲一区精彩视频| 毛片免费全部播放一级| 激情亚洲一区国产精品| 毛片a级毛片免费播放下载| 亚洲日韩国产一区二区三区在线| 成年午夜视频免费观看视频| 亚洲天堂2017无码中文| 国产精品jizz在线观看免费| 美女视频黄频a免费大全视频| 亚洲av无码不卡私人影院| sihu国产精品永久免费| 亚洲人成图片小说网站| 久99久精品免费视频热77| 亚洲卡一卡2卡三卡4麻豆| 好先生在线观看免费播放| 亚洲成a人无码亚洲成www牛牛| 国产免费观看网站| 中文字幕免费视频精品一| 777亚洲精品乱码久久久久久| 免费观看激色视频网站(性色)| 亚洲深深色噜噜狠狠网站| 国产免费观看a大片的网站| 黄床大片免费30分钟国产精品| 国产亚洲婷婷香蕉久久精品 | 在线免费观看毛片网站| 久久亚洲AV成人无码国产电影| 亚洲精品国产精品乱码不卞 | 国产精品免费看久久久香蕉| 亚洲a在线视频视频| 久久笫一福利免费导航| 国产精品亚洲va在线观看| 国产亚洲人成网站在线观看不卡| 亚洲一区在线免费观看| 黄色毛片免费在线观看| 亚洲第一精品在线视频| 日韩特黄特色大片免费视频| 国内精品久久久久影院免费| 亚洲人成网站免费播放|