精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

JVM原理與深度調(diào)優(yōu)

云計算 虛擬化
jvm是java虛擬機 運行在用戶態(tài)、通過應(yīng)用程序?qū)崿F(xiàn)java代碼跨平臺、與平臺無關(guān)、實際上是"一次編譯,到處執(zhí)行"。

[[436050]]

 什么是jvm

jvm是java虛擬機 運行在用戶態(tài)、通過應(yīng)用程序?qū)崿F(xiàn)java代碼跨平臺、與平臺無關(guān)、實際上是"一次編譯,到處執(zhí)行"

1.從微觀來說編譯出來的是字節(jié)碼!去到哪個平臺都能用,只要有那個平臺的JDK就可以運行!字碼好比是一個人,平臺好比為國家,JDK好比這個國家的語言!只要這個人(字節(jié)碼)有了這個國家的語言(JDK)就可以在這個國家(平臺)生活下去。

2.JDK 是整個Java的核心,包括了Java運行環(huán)境(Java Runtime Envirnment),一堆Java工具和Java基礎(chǔ)的類庫(rt.jar)。

3.Java虛擬機(JVM)一種用于計算機設(shè)備的規(guī)范,可用不同的方式(軟件或硬件)加以實現(xiàn)。編譯虛擬機的指令集與編譯微處理器的指令集非常類似。Java虛擬機包括一套字節(jié)碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域。

4.java編譯出來的是一種“java字節(jié)碼”,由虛擬機去解釋執(zhí)行。而c和c++則編譯成了二進制,直接交由操作系統(tǒng)執(zhí)行。

5.所謂的一次編譯、到處執(zhí)行,即只需在一個地方編譯,在其他各個平臺下都可以執(zhí)行。

6.與平臺無關(guān)指的是JAVA只運行在自己的JVM上,不需要依賴任何其他的底層類,所以和操作系統(tǒng)沒有任何聯(lián)系,平臺是說運行的系統(tǒng)

內(nèi)存結(jié)構(gòu)圖

JVM原理與深度調(diào)優(yōu)

class文件

class文件徑打破了C或者C++等語言所遵循的傳統(tǒng),使用這些傳統(tǒng)語言寫的程序通常首先被編譯,然后被連接成單獨的、專門支持特定硬件平臺和操作系統(tǒng)的二進制文件。通常情況下,一個平臺上的二進制可執(zhí)行文件不能在其他平臺上工作。而Java class文件是可以運行在任何支持Java虛擬機的硬件平臺和操作系統(tǒng)上的二進制文件。

執(zhí)行過程

執(zhí)行過程簡介

當編譯和連接一個C++程序時,所獲得的可執(zhí)行二進制文件只能在指定的硬件平臺和操作系統(tǒng)上運行,因為這個二進制文件包含了對目標處理器的機器語言。而Java編譯器把Java源文件的指令翻譯成字節(jié)碼,這種字節(jié)碼就是Java虛擬機的“機器語言”。

與普通程序不同的是,Java程序(class文件)并不是本地的可執(zhí)行程序。當運行Java程序時,首先運行JVM(Java虛擬機),然后再把Java class加載到JVM里頭運行,負責加載Java class的這部分就叫做Class Loader。

JVM中的ClassLoader

JVM本身包含了一個ClassLoader稱為Bootstrap ClassLoader,和JVM一樣,BootstrapClassLoader是用本地代碼實現(xiàn)的,它負責加載核心JavaClass(即所有java.*開頭的類)。

另外JVM還會提供兩個ClassLoader,它們都是用Java語言編寫的,由BootstrapClassLoader加載;其中Extension ClassLoader負責加載擴展的Javaclass(例如所有javax.*開頭的類和存放在JRE的ext目錄下的類)ApplicationClassLoader負責加載應(yīng)用程序自身的類。

當運行一個程序的時候,JVM啟動,運行bootstrapclassloader,該ClassLoader加載java核心API(ExtClassLoader和AppClassLoader也在此時被加載),然后調(diào)用ExtClassLoader加載擴展API,最后AppClassLoader加載CLASSPATH目錄下定義的Class,這就是一個程序最基本的加載流程。

第一個Class文件、通過javac編譯成字節(jié)碼、字節(jié)碼之后有個ClassLoader叫類加載器,因為java.class文件到JVM內(nèi)部運行起來需要有個裝載過程、從物理的文件到內(nèi)存的結(jié)構(gòu)、比如加載、連接、初始化。

linux應(yīng)用程序有個進程地址空間,對進程地址空間的解釋:

linux采用虛擬內(nèi)存管理技術(shù),每一個進程都有一個3G大小的獨立的進程地址空間,這個地址空間就是用戶空間。每個進程的用戶空間都是完全獨立、互不相干的。進程訪問內(nèi)核空間的方式:系統(tǒng)調(diào)用和中斷。

創(chuàng)建進程等進程相關(guān)操作都需要分配內(nèi)存給進程。這時進程申請和獲得的不是物理地址,僅僅是虛擬地址。

實際的物理內(nèi)存只有當進程真的去訪問新獲取的虛擬地址時,才會由“請頁機制”產(chǎn)生“缺頁”異常,從而進入分配實際頁框的程序。該異常是虛擬內(nèi)存機制賴以存在的基本保證,它會告訴內(nèi)核去為進程分配物理頁,并建立對應(yīng)的頁表,這之后虛擬地址才實實在在的映射到了物理地址上。

Linux操作系統(tǒng)采用虛擬內(nèi)存技術(shù),所有進程之間以虛擬方式共享內(nèi)存。進程地址空間由每個進程中的線性地址區(qū)組成,而且更為重要的特點是內(nèi)核允許進程使用該空間中的地址。通常情況況下,每個進程都有唯一的地址空間,而且進程地址空間之間彼此互不相干。但是進程之間也可以選擇共享地址空間,這樣的進程就叫做線程。

基本上所有l(wèi)inux應(yīng)用程序都會遵循這個規(guī)泛、有棧、有堆、對于JVM來說、也是遵循這個規(guī)則、只不過在這個規(guī)則上做了一些改進

通過類加載器把Class文件裝載進內(nèi)存空間、裝進來以后只是你的字節(jié)碼,然后你需要去運行、怎么去運行呢 ?圖中類加載器子系統(tǒng)下面都是運行區(qū)

內(nèi)存空間里有:

1.方法區(qū):被裝載的class的信息存儲在Methodarea的內(nèi)存中。當虛擬機裝載某個類型時,它使用類裝載器定位相應(yīng)的class文件,然后讀入這個class文件內(nèi)容并把它傳輸?shù)教摂M機中。

2.Heap(堆):一個Java虛擬實例中只存在一個堆空間。

3.JavaStack(java的棧):虛擬機只會直接對棧執(zhí)行兩種操作:以幀為單位的壓棧或出棧,java棧有個核心的數(shù)據(jù)、先進后出

4.Nativemethodstack(本地方法棧):通過字面意思、基本是調(diào)用系統(tǒng)本地的一些方法、一般在底層封裝好了、直接調(diào)用

5.地址、在這里邊是一個指針的概念、比如從變量到對象怎么做引用、就是地址

6.計數(shù)器:主要做字節(jié)碼解析的時候要記住它的位置、可以理解為一個標記

7.執(zhí)行引擎:數(shù)據(jù)、字節(jié)碼做一些業(yè)務(wù)處理、最終達到想要的結(jié)果

8.本地方法接口:基本是底層系統(tǒng)、比如IO網(wǎng)絡(luò)、調(diào)用操作系統(tǒng)本身

9.本地方法庫:為了兼容、實現(xiàn)跨平臺有不同的庫 、兼容平臺性

額外數(shù)據(jù)信息指的是本地方法接口和本地方法庫

JMM

java的內(nèi)存模型

大家可能聽過一個詞、叫線程安全、在寫高并發(fā)的時候就會有線程安全問題、java里邊為什么會出現(xiàn)線程安全問題呢、因為有JMM的存在、它會把內(nèi)存分為兩個區(qū)域(一個主內(nèi)存、一個是工作內(nèi)存)工作內(nèi)存是每個java棧所私有的

因為要運行速度快、需要把主內(nèi)存的數(shù)據(jù)放到本地內(nèi)存中、然后進行計算、計算完以后再把數(shù)據(jù)回顯回去

JVM原理與深度調(diào)優(yōu)

JMM有兩個區(qū)域、主內(nèi)存和棧內(nèi)存、

java線程可能不止一個、可能有多個棧、現(xiàn)在需要三個線程同時做個運算、主內(nèi)存初始值x=0 需要把x=0都要裝載在自己的內(nèi)存里邊去、相當于有一個

副本、現(xiàn)在初始值和三個棧都是x=0

現(xiàn)在需要做運算

  1. x=x+1 
  2.  
  3. x=x-1 
  4.  
  5. x=0 

我們的期望值是x=0,如果是單個線程跑沒問題 、取回x=0、運算x=+1、回顯進來主內(nèi)存就是1 、棧1是1,運算x=-1、回顯進來主內(nèi)存就是0、棧1是0

如果多個線程同時執(zhí)行、結(jié)果是不可預期的、正因為有這種結(jié)構(gòu)的存在、當執(zhí)行x=+1、棧1是x=1 、棧2來不及執(zhí)行、棧1就已經(jīng)把x=1寫到主內(nèi)存了 、棧2跟棧3拿過去之后初始值就不是0、可能就是1了 、這樣程序就寫亂了

所以在java中就出現(xiàn)了很多鎖、來確保線程安全

運行時數(shù)據(jù)區(qū)

PC寄存器----線程私有

PC寄存器也叫程序計數(shù)器(Program Counter Register)是一塊較小的內(nèi)存空間,它的作用可以看做是當前線程所執(zhí)行的字節(jié)碼的信號指示器。

每一條JVM線程都有自己的PC寄存器

在任意時刻,一條JVM線程只會執(zhí)行一個方法的代碼。該方法稱為該線程的當前方法(Current Method)

如果該方法是java方法,那PC寄存器保存JVM正在執(zhí)行的字節(jié)碼指令的地址

如果該方法是native,那PC寄存器的值是undefined。

此內(nèi)存區(qū)域是唯一一個在Java虛擬機規(guī)范中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域。

Java虛擬機棧 ----線程私有

與PC寄存器一樣,java虛擬機棧(Java Virtual Machine Stack)也是線程私有的。每一個JVM線程都有自己的java虛擬機棧,這個棧與線程同時創(chuàng)建,它的生命周期與線程相同。

虛擬機棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法被執(zhí)行的時候都會同時創(chuàng)建一個棧幀(Stack Frame)用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。每一個方法被調(diào)用直至執(zhí)行完成的過程就對應(yīng)著一個棧幀在虛擬機棧中從入棧到出棧的過程。

JVM stack 可以被實現(xiàn)成固定大小,也可以根據(jù)計算動態(tài)擴展。

如果采用固定大小的JVM stack設(shè)計,那么每一條線程的JVM Stack容量應(yīng)該在線程創(chuàng)建時獨立地選定。JVM實現(xiàn)應(yīng)該提供調(diào)節(jié)JVM Stack初始容量的手段。

如果采用動態(tài)擴展和收縮的JVM Stack方式,應(yīng)該提供調(diào)節(jié)最大、最小容量的手段。

JVM Stack 異常情況:

StackOverflowError:當線程請求分配的棧容量超過JVM允許的最大容量時拋出

OutOfMemoryError:如果JVM Stack可以動態(tài)擴展,但是在嘗試擴展時無法申請到足夠的內(nèi)存去完成擴展,或者在建立新的線程時沒有足夠的內(nèi)存去創(chuàng)建對應(yīng)的虛擬機棧時拋出。

本地方法棧----線程私有

Java虛擬機可能會使用到傳統(tǒng)的棧來支持native方法(使用Java語言以外的其它語言編寫的方法)的執(zhí)行,這個棧就是本地方法棧(Native Method Stack)

如果JVM不支持native方法,也不依賴與傳統(tǒng)方法棧的話,可以無需支持本地方法棧。

如果支持本地方法棧,則這個棧一般會在線程創(chuàng)建的時候按線程分配。

異常情況:

StackOverflowError:如果線程請求分配的棧容量超過本地方法棧允許的最大容量時拋出

OutOfMemoryError:如果本地方法棧可以動態(tài)擴展,并且擴展的動作已經(jīng)嘗試過,但是目前無法申請到足夠的內(nèi)存去完成擴展,或者在建立新的線程時沒有足夠的內(nèi)存去創(chuàng)建對應(yīng)的本地方法棧,那Java虛擬機將會拋出一個OutOfMemoryError異常。

Jave堆----線程公用

平時所說的java調(diào)優(yōu)就是它

在JVM中,堆(heap)是可供各條線程共享的運行時內(nèi)存區(qū)域,也是供所有類實例和數(shù)據(jù)對象分配內(nèi)存的區(qū)域。

Java堆載虛擬機啟動的時候就被創(chuàng)建,堆中儲存了各種對象,這些對象被自動管理內(nèi)存系統(tǒng)(Automatic Storage Management System,也即是常說的“Garbage Collector(垃圾回收器)”)所管理。這些對象無需、也無法顯示地被銷毀。

Java堆的容量可以是固定大小,也可以隨著需求動態(tài)擴展,并在不需要過多空間時自動收縮。

Java堆所使用的內(nèi)存不需要保證是物理連續(xù)的,只要邏輯上是連續(xù)的即可。

JVM實現(xiàn)應(yīng)當提供給程序員調(diào)節(jié)Java 堆初始容量的手段,對于可動態(tài)擴展和收縮的堆來說,則應(yīng)當提供調(diào)節(jié)其最大和最小容量的手段。

Java 堆異常:

OutOfMemoryError:如果實際所需的堆超過了自動內(nèi)存管理系統(tǒng)能提供的最大容量時拋出。

方法區(qū)----線程公用

方法區(qū)是可供各條線程共享的運行時內(nèi)存區(qū)域。存儲了每一個類的結(jié)構(gòu)信息,例如運行時常量池(Runtime Constant Pool)、字段和方法數(shù)據(jù)、構(gòu)造函數(shù)和普通方法的字節(jié)碼內(nèi)容、還包括一些在類、實例、接口初始化時用到的特殊方法

方法區(qū)在虛擬機啟動的時候創(chuàng)建。

方法區(qū)的容量可以是固定大小的,也可以隨著程序執(zhí)行的需求動態(tài)擴展,并在不需要過多空間時自動收縮。

方法區(qū)在實際內(nèi)存空間中可以是不連續(xù)的。

Java虛擬機實現(xiàn)應(yīng)當提供給程序員或者最終用戶調(diào)節(jié)方法區(qū)初始容量的手段,對于可以動態(tài)擴展和收縮方法區(qū)來說,則應(yīng)當提供調(diào)節(jié)其最大、最小容量的手段。

Java 方法區(qū)異常:

OutOfMemoryError: 如果方法區(qū)的內(nèi)存空間不能滿足內(nèi)存分配請求,那Java虛擬機將拋出一個OutOfMemoryError異常。

JVM內(nèi)存分配

內(nèi)存分配其實真正來講是有三種的、但對于JVM來說只有兩種

  • 棧內(nèi)存分配:

大家在調(diào)優(yōu)的過程中會發(fā)現(xiàn)有個參數(shù)是-Xss 默認是1m,這個內(nèi)存是棧內(nèi)存分配, 在工作中會發(fā)現(xiàn)棧OutOfMemory Error內(nèi)存溢出、就是因為它的內(nèi)存空間不夠了 一般情況下沒有那么大的棧、除非你的一個方法里邊有幾十萬行代碼、一直往那壓、不出,所以導致棧的溢出、棧的內(nèi)存分配直接決定了你的線程數(shù) 、比如說你默認情況下是1m 、系統(tǒng)一共給你512m、那最高可以分配512個線程,再多系統(tǒng)分配不了啦、因為沒有那么多的內(nèi)存 、像tomcat、resin、jboss等、有個最大線程數(shù)、要根據(jù)這個來調(diào)、調(diào)個100萬沒有意義、分配不了那么大、調(diào)太少整個性能發(fā)揮不出來 ,調(diào)這個 、跟你的cpu有關(guān)系、需要找一個折中位置 、根據(jù)應(yīng)用 、是IO密集型的還是CPU密集型的來調(diào)-Xss的值、它這里邊主要保存了一些參數(shù) 、還有局部變量 、就比如說寫代碼、有開始有結(jié)束、這里邊肯定定義了很多變量、比如:int x=1 y=0 只要在這方法內(nèi)的都屬于局部變量 、因為你要做運算、要把這東西存住、只有等程序結(jié)束的時候才能銷毀,對于這種參數(shù)是不會產(chǎn)生線程安全問題、因為線程是私有的

  • 堆內(nèi)存分配:

Java的堆是一個運行時數(shù)據(jù)區(qū),類的(對象從中分配空間。這些對象通過new、newarray、anewarray和multianewarray等指令建立,它們不需要程序代碼來顯式的釋放。堆是由垃圾回收來負責的,堆的優(yōu)勢是可以動態(tài)地分配內(nèi)存大小,生存期也不必事先告訴編譯器,因為它是在運行時動態(tài)分配內(nèi)存的,Java的垃圾收集器會自動收走這些不再使用的數(shù)據(jù)。但缺點是,由于要在運行時動態(tài)分配內(nèi)存,存取速度較慢

JVM原理與深度調(diào)優(yōu)

jvm堆結(jié)構(gòu)

JVM原理與深度調(diào)優(yōu)

(圖一)

1.Young(年輕代)

年輕代分三個區(qū)。一個Eden區(qū),兩個Survivor區(qū)。大部分對象在Eden區(qū)中生成。當Eden區(qū)滿時,還存活的對象將被復制到Survivor區(qū)(兩個中的一個),當這個Survivor區(qū)滿時,此區(qū)的存活對象將被復制到另外一個Survivor區(qū),當這個Survivor區(qū)也滿了的時候,從第一個Survivor區(qū)復制過來的并且此時還存活的對象,將被復制年老區(qū)(Old。需要注意,Survivor的兩個區(qū)是對稱的,沒先后關(guān)系,所以同一個區(qū)中可能同時存在從Eden復制過來對象,和從前一個Survivor復制過來的對象,而復制到年老區(qū)的只有從第一個Survivor區(qū)過來的對象。而且,Survivor區(qū)總有一個是空的。

2.Old(年老代)

年老代存放從年輕代存活的對象。一般來說年老代存放的都是生命期較長的對象。

3.Permanent:(持久代)

也叫方法區(qū)、用于存放靜態(tài)文件,如Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應(yīng)用可能動態(tài)生成或者調(diào)用一些class,例如hibernate等,在這種時候需要設(shè)置一個比較大的持久代空間來存放這些運行過程中新增的類。持久代大小通過-XX:MaxPermSize=進行設(shè)置。

舉個例子:當在程序中生成對象時,正常對象會在年輕代中分配空間,如果是過大的對象也可能會直接在年老代生成(據(jù)觀測在運行某程序時候每次會生成一個十兆的空間用收發(fā)消息,這部分內(nèi)存就會直接在年老代分配)。年輕代在空間被分配完的時候就會發(fā)起內(nèi)存回收,大部分內(nèi)存會被回收,一部分幸存的內(nèi)存會被拷貝至Survivor的from區(qū),經(jīng)過多次回收以后如果from區(qū)內(nèi)存也分配完畢,就會也發(fā)生內(nèi)存回收然后將剩余的對象拷貝至to區(qū)。等到to區(qū)也滿的時候,就會再次發(fā)生內(nèi)存回收然后把幸存的對象拷貝至年老區(qū)。

通常我們說的JVM內(nèi)存回收總是在指堆內(nèi)存回收,確實只有堆中的內(nèi)容是動態(tài)申請分配的,所以以上對象的年輕代和年老代都是指的JVM的Heap空間,而持久代則是值指MethodArea,不屬于Heap。

java堆結(jié)構(gòu)和垃圾回收

JVM原理與深度調(diào)優(yōu)

圖(二)

Direct Momery 嚴格意義來說也算堆,它是一塊物理內(nèi)存、可以分為操作系統(tǒng)內(nèi)存、是比較快的、不會走JVM 在java里邊實現(xiàn)了內(nèi)存映射、這樣速度更快

CodeCache 放一些字節(jié)碼、類的信息會放在里邊

Permanent Generation space 方法區(qū)、嚴格意義來說也屬于堆

Eden Space 區(qū)

Survivor Space區(qū)

Tenured Generation Old區(qū)(年老代)

JVM GC 管理

調(diào)優(yōu)大部分調(diào)優(yōu)的是怎么回收,Minor GC 回收Eden Space和 Survivor Space , Full GC回收所有區(qū)域

不管什么GC,回收過程中會出現(xiàn)暫停、回收過程中用戶線程是不會工作的、這樣就造成程序卡了 這是無法改變不了的事實、避免不了、不過可以優(yōu)化暫停時間的長短

原則上不能出現(xiàn)Full GC 、所有區(qū)域都要跑一遍 、出現(xiàn)Full GC 應(yīng)用就不可用

Jvm 堆配置參數(shù)

1、-Xms初始堆大小

默認物理內(nèi)存的64/1(<1GB),建議小于1G、可根據(jù)應(yīng)用業(yè)務(wù)調(diào)節(jié)

2、-Xmx最大堆大小

默認物理內(nèi)存的4/1(<1GB)、建議小于1G、實際中建議不大于4GB(否則會出現(xiàn)很多問題)

3、一般建議設(shè)置 -Xms= -Xmx

好處是避免每次在gc后、調(diào)整堆的大小、減少系統(tǒng)內(nèi)存分配開銷

4、整個堆大小=年輕代大小+年老代大小+持久代大小(Permanent Generation space區(qū)、也會被Full GC回收)

jvm新生代(young generation

JVM原理與深度調(diào)優(yōu)

圖(三)

1、新生代=1個eden區(qū)和2個Survivor區(qū)

2、-Xmn 年輕代大小

設(shè)置年輕代大小、比如-Xmn=100m那么新生代就是100m,然后共享

3、-XX:NewRatio

年輕代(包括Eden和兩個Survivor區(qū))與年老代的比值(除去持久代)Xms=Xmx并且設(shè)置了Xmn的情況下,該參數(shù)不需要進行設(shè)置。

4、-XX:SurvivorRatio

Eden區(qū)與Survivor區(qū)的大小比值,設(shè)置為8(默認是8) ,則兩個Survivor區(qū)與一個Eden區(qū)的比值為2:8,一個Survivor區(qū)占整個年輕代的1/10

比如新生代=100m,設(shè)置-XX:SurvivorRatio為8,那E =80m S0 =10m S1=10m(1/10)

5、用來存放JVM剛分配的Java對象

java老年代(tenured generation)

JVM原理與深度調(diào)優(yōu)

圖(四)

1、老年代=整個堆-年輕代大小-持久代大小

年輕代就是上面講的-xmn配置的參數(shù)、持久代參數(shù)默認是0

2、年輕代中經(jīng)過垃圾回收沒有回收掉的對象被復制到年老代。

就是這個對象收集完一次、發(fā)現(xiàn)被引用了、某個地方使用了、回收不掉才放進去,一般是多次回收、從E區(qū)回收過程中、先進S0或者S1、S0或者S1再回收一次、回收不掉再放到年老區(qū)

3、老年代存儲對象比年輕代年齡大的多,而且不乏大對象。

對互聯(lián)網(wǎng)企業(yè)來說、最常用的是"緩存"的對象比較多、緩存一般會用弱引用、但弱引用也不會輕易被回收的、除非是在整個堆的內(nèi)存不夠的情況下、防止你的內(nèi)存宕機、強引用是和垃圾回收機制相關(guān)的。一般的,如果一個對象可以通過一系列的強引用引用到,那么就 說明它是不會被垃圾回收機制(Garbage Collection)回收的,

剛才說了緩存對象一般是弱引用、有些數(shù)據(jù)丟了是沒關(guān)系的、只是提高你的系統(tǒng)性能才放到緩存里邊去、但是如果有一天內(nèi)存不夠了 、緩存占了很大一部分對象、你不回收的話、你整個系統(tǒng)都不可用了、整個服務(wù)都不能用了、如果回收掉、我可以從數(shù)據(jù)庫去取、可 能速 度慢點、但是我的服務(wù)可用性不會降低

比如說剛開始分配的對象 、這個對象暫定是OLD區(qū)、剛開始一部分內(nèi)存區(qū)域被緩存占據(jù)了、一般情況下對于一個緩存的設(shè)計都有初始值、對于java來說、比較通用的緩存是可以自動伸縮的、

如圖(四)整個OLD區(qū)50M有45M是被緩存占據(jù)了、不會被回收掉、那整個OLD區(qū)只有5M可以用了 、假如E區(qū)有40M 、S0 分配10M 、S1分配也是10M 、理想情況下、經(jīng)過E區(qū)到S0、S1到老年代的大小不到1M、 那5M就夠了、不會出現(xiàn)FULL GC 、也不會出現(xiàn) 內(nèi)存溢出、一旦你的對象大于5M、比如10M的數(shù)據(jù)、 放不進去了、就會出現(xiàn)FULL gc 、FULL gc會把整個緩存全都收掉、瞬間緩存數(shù)據(jù)就沒了、然后把10M的數(shù)據(jù)放進去、這就是弱引用、可以理解為這是一種服務(wù)降級、如果是強引用那就直接掛了

4、新建的對象也有可能直接進入老年代

4.1、大對象,可通過啟動參數(shù)設(shè)置

-XX:PretenureSizeThreshold=1024(單位為字節(jié),默認為0、也就是說所有的默認都在新生代)來代表超過多大時就不再新生代分配,而是直接在老年代分配

4.2、大的數(shù)組對象,切數(shù)組中無引用外部對象。

5、老年代大小無配置參數(shù)

java持久代(perm generation)

1、持久代=整個堆-年輕代大小-老年代大小

2、-XX:PermSize 最小 -XX:MaxPermSize 最大

設(shè)置持久代的大小,一般情況推薦把-XX:PermSize設(shè)置成 -XX:MaxPermSize的值為相同的值,因為永久代大小的調(diào)整也會導致堆內(nèi)存需要觸發(fā)fgc。

3、存放Class、Method元信息,其大小與項目的規(guī)模、類、方法的數(shù)量有關(guān)。一般設(shè)置為128M就足夠,設(shè)置原則是預留30%的空間

剛開始設(shè)置了128M、隨著程序的運行、java有一個叫l(wèi)ib的地方放了很多類庫、這個類庫并不是所有的都加載的、只有在用的時候或者系統(tǒng)初始化的時候會加載一部分、比如已經(jīng)占了100M了、但是隨著業(yè)務(wù)的運行會動態(tài)去類

庫里加、把一些Class文件通過反射的方式裝進去、這樣你的內(nèi)存不斷增大、達到128M以后就掛了、就會報方法區(qū)溢出、怎么做?調(diào)大到256M、然后監(jiān)控、超過閾值再調(diào)大、簡單方式是調(diào)大、另外JDK里邊有一個GC可以回收

如果能接受停機、就調(diào)大,簡單、快速、已解決問題為主

4、永久代的回收方式

4.1、常量池中的常量,無用的類信息,常量的回收很簡單,沒有引用了就可以被回收

比如一個常量=5 它的意義就是個值、如果回收、發(fā)現(xiàn)它沒被引用就被回收了

4.2、對于無用的類進行回收,必須保證3點:

類跟常量不一樣、一個類里邊可能有好多東西、比如這個類引用那個類、

類的所有實例都已經(jīng)被回收

加載類的ClassLoader已經(jīng)被回收

類對象的Class對象沒有被引用(即沒有通過反射引用該類的地方)

jvm垃圾收集算法

1、引用計數(shù)算法

每個對象有一個引用計數(shù)屬性,新增一個引用時計數(shù)加1,引用釋放時計數(shù)減1,計數(shù)為0時可以回收。此方法簡單,無法解決對象相互循環(huán)引用的問題。還有一個問題是如何解決精準計數(shù)。

這種方法現(xiàn)在已經(jīng)不用了

2、根搜索算法

從GC Roots開始向下搜索,搜索所走過的路徑稱為引用鏈。當一個對象到GC Roots沒有任何引用鏈相連時,則證明此對象是不可用的。不可達對象。

在java語言中,GC Roots包括:

虛擬機棧中引用的對象。

方法區(qū)中類靜態(tài)屬性實體引用的對象。

方法區(qū)中常量引用的對象。

本地方法棧中JNI引用的對象。

jvm垃圾回收算法

1、復制算法(Copying)

JVM原理與深度調(diào)優(yōu)

  • 復制算法采用從根集合掃描,并將存活對象復制到一塊新的,沒有使用過的空間中,這種算法當控件存活的對象比較少時,極為高效,但是帶來的成本是需要一塊內(nèi)存交換空間用于進行對象的移動。
  • 此算法用于新生代內(nèi)存回收,從E區(qū)回收到S0或者S1

從根集合掃描、就是剛才說的GC-Roots 收集算法、從它開始查你的引用、如果沒有被引用、開始執(zhí)行算法、并將存活對象復制到一塊新的、(S0或者S1)

2、標記清除算法

JVM原理與深度調(diào)優(yōu)

標記-清除算法采用從根集合進行掃描,對存活的對象標記,標記完畢后,再掃描整個空間中未被標記的對象,進行回收,如圖所示。

標記-清除算法不需要進行對象的移動,并且僅對不存活的對象進行處理,在存活對象比較多的情況下極為高效,但由于標記-清除算法直接回收不存活的對象,因此會造成內(nèi)存碎片!

適合老生代去回收

JVM原理與深度調(diào)優(yōu)

標記-整理算法采用標記-清除算法一樣的方式進行對象的標記,但在清除時不同,在回收不存活的對象占用的空間后,會將所有的存活對象往左端空閑空間移動,并更新對應(yīng)的指針。

標記-整理算法是在標記清除算法的基礎(chǔ)上,又進行了對象的移動,因此成本更高,但是卻解決了內(nèi)存碎片的問題。

名詞解釋

1、串行回收

gc單線程內(nèi)存回收、會暫停使有用戶線程

2、并行回收

收集是指多個GC線程并行工作,但此時用戶線程是暫停的;所以,Seral是串行的,Paralle收集器是并行的,而CMS收集器是并發(fā)的。

3、并發(fā)回收

是指用戶線程與GC線程同時執(zhí)行(不一定是并行,可能交替,但總體上是在同時執(zhí)行的),不需要停頓用戶線程(其實在CMS中用戶線程還是需要停頓的,只是非常短,GC線程在另一個CPU上執(zhí)行)

串行回收要區(qū)分好并行回收和并發(fā)回收的區(qū)別,這地方非常關(guān)鍵、在選擇GC的過程中根據(jù)應(yīng)用場景來選擇

JVM常見垃圾回收器

JVM原理與深度調(diào)優(yōu)

上圖是HotSpot里的收集器,中間的橫線表示分代,有連線表示可以組合使用。

年輕代區(qū)域有

Serial 串行

ParNew 并發(fā)

Parallel Scavenge 并行

年老代區(qū)域有

CMS

Serial Old

Parallel Old

G1目前還不成熟 、適合年輕代和年老代

Serial 回收器(串行回收器)

 

JVM原理與深度調(diào)優(yōu)

是一個單線程的收集器,只能使用一個CPU或一條線程區(qū)完成垃圾收集;在進行垃圾收集時,必須暫停所有其它工作線程,直到收集完成。

缺點:Stop-The-World

優(yōu)勢:簡單。對于單CPU的情況,由于沒有多線程交互開銷,反而可以更高效。是Client模式下默認的新生代收集器。

新生代Serial回收器

1、通過-XX:+UseSerialGC來開啟

Serial New+Serial Old的收集器組合進行內(nèi)存回收

2、使用復制算法。

3、獨占式的垃圾回收。

一個線程進行GC,串行。其它工作線程暫停。

老年代Serial回收器

1、-XX:UseSerialGC來開啟

Serial New+Serial Old的收集器組合進行內(nèi)存回收

2、使用標記-壓縮算法

3、串行的、獨占式的垃圾回收器。

因為內(nèi)存比較大的原因,回收比新生代慢

ParNew回收器(并行回收器)

 

JVM原理與深度調(diào)優(yōu)

并行回收器也是獨占式的回收器,在收集過程中,應(yīng)用程序會全部暫停。但由于并行回收器使用多線程進行垃圾回收,因此,在并發(fā)能力比較強的CPU上,它產(chǎn)生的停頓時間要短

于串行回收器,而在單CPU或者并發(fā)能力較弱的系統(tǒng)中,并行回收器的效果不會比串行回收器好,由于多線程的壓力,它的實際表現(xiàn)很可能比串行回收器差。

新生代ParNew回收器

1、-XX:+UseParNewGC開啟

新生代使用并行回收收集器,老年代使用串行收集器

2、-XX:ParallelGCThreads 指定線程數(shù)

默認最好與CPU數(shù)理相當,避免過多的線程數(shù)影響垃圾收集性能

3、使用復制算法。

4、并行的、獨占式的垃圾回收器。

新生代Parallel Scavenge回收器

1、吞吐量優(yōu)先回收器

關(guān)注CPU吞吐量,即運行用戶代碼的時間/總時間。比如:JVM運行100分鐘,其中運行用戶代碼99分鐘,垃圾回收1分鐘。則吞吐量是99%,這種收集器能最高效率的利用CPU,適合運行后臺運算

2、-XX:+UseParallelGC開啟

使用Parallel Scavenge+Serial Old收集器組合回收垃圾,這也是Server模式下的默認值

3、-XX:GCTimeRation

來設(shè)置用戶執(zhí)行時間占總時間的比例,默認99,即1%的時間用來進行垃圾回收

4、-XX:MaxGCPauseMillis

設(shè)置GC的最大停頓時間

5、使用復制算法

老生代Parallel Old回收器

1、-XX:+UseParallelOldGC開啟

使用Parallel Scavenge +Parallel Old組合收集器進行收集

2、使用標記整理算法。

3、并行的、獨占式的垃圾回收器。

CMS(并發(fā)標記清除)回收器

JVM原理與深度調(diào)優(yōu)

運作過程分為4個階段:

初始標記(CMS inital mark):值標記GC Roots能直接關(guān)聯(lián)到的對象。

并發(fā)標記(CMS concurrent mark):進行GC RootsTracing的過程。

重新標記(CMS remark):修正并發(fā)標記期間用戶程序繼續(xù)運行而導致標記發(fā)生改變的那一部分對象的標記.

并發(fā)清除(CMS concurrent sweep):

其中標記和重新標記兩個階段仍然需要Stop-The-World,整個過程中耗時最長的并發(fā)標記和并發(fā)清除過程中收集器都可以和用戶線程一起工作

CMS(并發(fā)標記清除)回收器

1、標記-清除算法

同時它又是一個使用多線程并發(fā)回收的垃圾收集器

2、-XX:ParalleCMSThreads

手工設(shè)定CMS的線程數(shù)量,CMS默認啟動的線程數(shù)是(ParallelGCTherads+3)+3/4)

這是它的公式,一般情況下、對于IO密集型的 cpu的核數(shù)乘以2+1 ,CPU密集型的一般CPU的核數(shù)+1

3、-XX+UseConcMarkSweepGC開啟

使用ParNew+CMS+Serial Old的收集器組合進行內(nèi)存回收,Serial Old作為CMS出現(xiàn)“Concurrent Mode Failure” 失敗后的后備收集器使用.

失敗以后就會觸發(fā)Full GC 、位了避免這種情況發(fā)生、就要對它進行配置、觸發(fā)Full GC有兩種情況、promotion failed和concurrent mode failure

對于采用CMS進行老年代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure兩種狀況,當這兩種狀況出現(xiàn)時可能

會觸發(fā)Full GC。

promotion failed是在進行Minor GC時,survivor space放不下、對象只能放入老年代,而此時老年代也放不下造成的;concurrent mode failure是在

執(zhí)行CMS GC的過程中同時有對象要放入老年代,而此時老年代空間不足造成的(有時候“空間不足”是CMS GC時當前的浮動垃圾過多導致暫時性的空間不足觸發(fā)Full GC)。

對應(yīng)措施為:增大survivor space、老年代空間或調(diào)低觸發(fā)并發(fā)GC的比率。

4、

-XX:CMSInitiatingOccupancyFraction

設(shè)置CMS收集器在老年代空間被使用多少后觸發(fā)垃圾回收器,默認值為68%,僅在CMS收集器時有效,

-XX:CMSInitiatingOccupancyFraction=70

(一般情況為70%,設(shè)太高了可能會出現(xiàn)失敗,設(shè)太低了、頻繁, 只能去找一個比值、可以分析GC log、看是否符合你的要求 )

5、-XX:+

UseCMSCompactAtFullCollection

由于CMS收集器會產(chǎn)生碎片,此參數(shù)設(shè)置在垃圾收集器后是否需要一次內(nèi)存碎片整理過程,僅在CMS收集器時有效

6、-XX:+CMSFullGCBeforeCompaction

設(shè)置CMS收集器在進行若干次垃圾收集后再進行一次內(nèi)存碎片整理過程,通常與

UseCMSCompactAtFullCollection參數(shù)一起使用

7、

-XX:CMSInitiatingPermOccupancyFraction

設(shè)置Perm Gen使用到達多少比率時觸發(fā),默認92%

 

責任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2010-09-26 10:53:00

JVM內(nèi)存調(diào)優(yōu)設(shè)置

2012-01-10 14:35:08

JavaJVM

2017-07-21 08:55:13

TomcatJVM容器

2023-11-11 19:07:23

JVMJava

2010-09-26 13:39:46

JVM調(diào)優(yōu)

2012-01-10 15:13:56

JavaJVM

2010-09-26 09:08:17

JVM調(diào)優(yōu)

2010-09-17 14:17:05

JVM內(nèi)存設(shè)置

2021-09-06 11:02:17

JVM架構(gòu)調(diào)優(yōu)

2017-09-22 15:15:23

jvm調(diào)優(yōu)命令

2017-10-17 14:02:30

jvm調(diào)優(yōu)工具

2021-06-03 08:32:18

JVM調(diào)優(yōu)虛擬機

2010-09-27 09:23:42

JVM調(diào)優(yōu)

2024-12-04 15:49:29

2010-09-25 13:05:07

JVM參數(shù)

2010-03-04 10:56:52

JVM參數(shù)

2023-11-10 11:23:20

JVM內(nèi)存

2022-08-31 08:04:08

Ceph配置選項

2023-12-12 08:00:39

2012-01-10 14:18:40

JavaJVM
點贊
收藏

51CTO技術(shù)棧公眾號

日韩高清在线观看一区二区| 欧美熟女一区二区| 青青草综合网| 在线播放一区二区三区| 黄色一级片网址| 亚洲精品综合网| 老鸭窝毛片一区二区三区| 国产亚洲视频在线观看| 久久综合桃花网| 欧美办公室脚交xxxx| 国产精品毛片a∨一区二区三区| 91欧美视频网站| 日本中文字幕网| 成人在线免费小视频| 日韩一区二区免费电影| 欧美日韩一区二区在线免费观看| jizz在线观看中文| 粉嫩欧美一区二区三区高清影视 | 国产精品一区二区你懂得| 亚洲婷婷综合网| 欧美精品国产一区| 亚洲视频在线看| 色综合久久久无码中文字幕波多| 成人自拍视频网| 亚洲国产精品一区二区www| 日韩免费av一区二区三区| 亚洲成熟女性毛茸茸| 精品一区二区三区久久| 日本韩国在线不卡| 国产一级二级毛片| 精品久久久久中文字幕小说| 日韩精品一区二区在线| www.com久久久| 欧美大片免费| 精品人伦一区二区三区蜜桃免费| 热这里只有精品| 超碰97在线免费观看| 91视频免费播放| 成人情视频高清免费观看电影| 成人黄色激情视频| 丝袜美腿成人在线| 亚洲18私人小影院| 国产一级二级三级| 欧美三级免费| 欧美老女人在线视频| 国产精品久久免费观看| 美女毛片一区二区三区四区| 亚洲国产成人久久综合| 国偷自产av一区二区三区麻豆| 国产亚洲高清一区| 欧美色大人视频| 一区二区三区视频网| 韩日精品一区| 欧美三级欧美一级| 九九热精品在线播放| 青青热久免费精品视频在线18| 欧美性黄网官网| 国产日韩一区二区在线观看| 一二三四视频在线中文| 色综合天天综合网天天看片| www.爱色av.com| 久草免费在线视频| 日韩欧美aⅴ综合网站发布| 免费无码不卡视频在线观看| av资源亚洲| 在线精品视频免费播放| 中文字幕av专区| 伊人久久一区| 日韩免费电影一区| 欧美在线一级片| 午夜精品福利影院| 一个色综合导航| h色网站在线观看| 韩国在线视频一区| 777精品视频| 欧美国产一级片| 久久电影国产免费久久电影| 91性高湖久久久久久久久_久久99| 国产人妻精品一区二区三区| 国产99一区视频免费| 精品不卡一区二区三区| 国产一级网站视频在线| 中文字幕色av一区二区三区| 国产精品啪啪啪视频| 97蜜桃久久| 欧美主播一区二区三区| 亚洲女人在线观看| 日韩av影院| 中日韩美女免费视频网站在线观看| 国产又粗又猛又爽又黄的视频小说| 91精品推荐| 91成人精品网站| 亚洲一区二区三区网站| 懂色av一区二区三区蜜臀| 久久青青草综合| 麻豆传媒在线观看| 午夜精品福利一区二区蜜股av | 免费在线欧美视频| 99久热re在线精品996热视频| 日色在线视频| 亚洲老妇xxxxxx| 国产一区二区在线视频播放| 国产伊人久久| 日韩精品视频中文在线观看| 亚洲熟女毛茸茸| 亚洲在线国产日韩欧美| 国产欧美精品一区二区| 神马久久久久久久久久| 国产精品伦理在线| 日本中文字幕网址| 亚洲影视资源| 亚洲色图偷窥自拍| 久久精品99国产精| 久久99蜜桃精品| 精品一区二区三区国产| 怡红院av在线| 欧美视频一区二区在线观看| a天堂视频在线观看| 婷婷综合亚洲| 国产精品福利久久久| 日本波多野结衣在线| 亚洲人成伊人成综合网小说| 国产av无码专区亚洲精品| jizz久久精品永久免费| 精品国偷自产在线| 午夜一级黄色片| 99麻豆久久久国产精品免费| 秋霞在线一区二区| 免费高清视频在线一区| 日韩电影视频免费| 国产污视频在线看| 国产尤物一区二区| 一区二区三区视频| 91欧美精品| 亚洲天堂av高清| 免费av网站在线| 99精品视频中文字幕| 国产av熟女一区二区三区| 成人av在线播放| 日韩中文字幕在线| 在线视频1卡二卡三卡| 久久精品一区四区| 国产在线青青草| 亚洲国产最新| 欧美怡春院一区二区三区| 特黄aaaaaaaaa真人毛片| 亚洲一区精品在线| www.四虎在线| 亚洲福利专区| 国产精品我不卡| 国产不卡123| 日韩h在线观看| 久久免费激情视频| 久久一日本道色综合| 六月丁香婷婷激情| 国产成人手机高清在线观看网站| 欧美综合一区第一页| 久草视频在线看| 欧美午夜视频网站| 午夜精品久久久久99蜜桃最新版| 蜜乳av一区二区| 女女同性女同一区二区三区按摩| 国产精品视频首页| 欧美黑人xxxⅹ高潮交| 亚洲av少妇一区二区在线观看 | av一区二区三区四区| 久久久久99精品成人片| 欧美激情影院| 国产精品ⅴa在线观看h| 天天在线视频色| 日韩一级欧美一级| 毛片视频网站在线观看| 久久免费看少妇高潮| www.精品在线| 欧美精品入口| 免费国产在线精品一区二区三区| 欧美片第1页| 久久精品在线播放| 亚洲国产福利视频| 色综合天天综合网天天看片| 婷婷丁香综合网| 国产a久久麻豆| 国产1区2区在线| 99精品在线观看| 成人av男人的天堂| 午夜日韩成人影院| 超薄丝袜一区二区| 日韩有码电影| 欧美日韩视频在线观看一区二区三区| 久久久久亚洲av片无码| 国产sm精品调教视频网站| 免费黄色特级片| 欧美黄色一级视频| 久久久99爱| 欧美第一在线视频| 日韩av免费看| 午夜小视频在线观看| 亚洲欧美精品在线| www.97超碰| 欧洲色大大久久| 国产一级视频在线播放| 欧美激情在线一区二区三区| 美女流白浆视频| 男女男精品视频| 夫妻免费无码v看片| 91精品一区国产高清在线gif| 麻豆av一区| 在线精品国产亚洲| 国产日韩欧美视频在线| 麻豆免费在线| 欧美大片免费观看在线观看网站推荐| 国产在线三区| 日韩www在线| 国产福利资源在线| 欧美日韩不卡在线| 无码人妻丰满熟妇区五十路| 亚洲五码中文字幕| 极品色av影院| 国产日韩亚洲欧美综合| 国产麻豆xxxvideo实拍| 国产成人亚洲综合色影视| 日韩精品你懂的| 美女尤物久久精品| 国产一区二区三区在线免费| 日韩精品中文字幕第1页| 欧美精品国产精品久久久| 91蜜桃臀久久一区二区| 91亚洲国产精品| 成人午夜在线| 国产精品99久久久久久久久| 亚洲女同志freevdieo| 68精品久久久久久欧美| 视频在线这里都是精品| 另类图片亚洲另类| 黄色成年人视频在线观看| 最近2019中文字幕在线高清| 欧美扣逼视频| 亚洲精品一区久久久久久| 欧美一区二不卡视频| 欧美成人一区二区三区片免费 | 美女精品一区二区| 不卡av免费在线| 日韩精品一二三四| 日本精品久久久久中文字幕| 亚洲综合精品| 99精品视频播放| 天堂va蜜桃一区二区三区漫画版 | 日韩av中字| 日本欧美国产在线| 粉嫩一区二区三区| 国产精品久久久精品| 日本精品在线一区| 国产在线高清精品| 国产午夜精品一区在线观看| 亚洲一区二区中文| 2020最新国产精品| 国产欧美日韩综合精品二区| 国产精品15p| 狠狠综合久久av| 欧美美女在线| 亚洲图片欧洲图片日韩av| 99久久综合| www.日本在线视频| 国产亚洲精品v| 欧美一区日韩一区| 青娱乐国产视频| 国产精品国产精品国产专区不蜜| 亚洲女人久久久| 一区二区三区美女| 国产成人无码精品久在线观看| 天天亚洲美女在线视频| 国产suv精品一区二区33| 欧美日韩精品高清| 朝桐光av在线一区二区三区| 亚洲国产日韩欧美在线99| 国产亚洲依依| 欧美精品亚州精品| 国产污视频在线播放| 国产精品久久久久久中文字| 国产高清日韩| 麻豆91av| 中国成人一区| 成人免费观看毛片| 精品亚洲porn| 中文乱码人妻一区二区三区视频| 国产日韩欧美制服另类| 国产探花在线免费观看| 狠狠色狠狠色综合日日五| 天堂а√在线中文在线新版| 5566中文字幕一区二区电影| 亚洲奶汁xxxx哺乳期| 在线观看免费高清视频97| 国产理论电影在线| 国产精品人人做人人爽| 日韩中文字幕| 日本中文不卡| 91精品久久久久久久蜜月| 欧美日韩在线视频一区二区三区| 国产一区久久久| 国产一二三四五区| 一区二区三区精品| 国产成人a v| 亚洲精品美女在线| av网站网址在线观看| 国产精品久久久精品| 国产一级成人av| 桥本有菜av在线| 久久精品女人天堂| 娇妻高潮浓精白浆xxⅹ| 亚洲欧洲成人自拍| 麻豆成人免费视频| 精品人在线二区三区| 欧美精品电影| 国产精品福利在线观看| 日韩在线黄色| 丰满的少妇愉情hd高清果冻传媒| 蜜桃91丨九色丨蝌蚪91桃色| aa一级黄色片| 亚洲成av人影院| jizz国产视频| 久久精品中文字幕一区| 亚洲成人av观看| 欧美一区二区三区四区夜夜大片 | 凹凸国产熟女精品视频| 丁香六月综合激情| 在线免费日韩av| 7777精品久久久大香线蕉| 91激情在线| 国产精品美女久久久免费| 九一国产精品| 1024av视频| 26uuu久久综合| 91看片在线播放| 亚洲电影免费观看高清| 男女羞羞视频在线观看| 91丝袜脚交足在线播放| 一区二区三区网站| 色婷婷一区二区三区在线观看| 国产精品嫩草影院av蜜臀| 波多野结衣一区二区三区在线| 精品一区二区亚洲| 最新日韩精品| 日本婷婷久久久久久久久一区二区| 另类天堂av| 国产jjizz一区二区三区视频| 色欧美日韩亚洲| 番号集在线观看| 国产精品久久久久久久久男 | 在线看福利67194| 懂色aⅴ精品一区二区三区| 亚洲精品9999| 久久av老司机精品网站导航| 很污很黄的网站| 91精品国产一区二区| 伊人手机在线| av激情久久| 亚洲人成免费| 免费黄色在线视频| 在线一区二区三区做爰视频网站| 国产免费a∨片在线观看不卡| 国产精品入口日韩视频大尺度 | 久久精品99久久久久久久久| 99re8精品视频在线观看| 精品无码av无码免费专区| 不卡视频免费播放| √资源天堂中文在线| 在线日韩第一页| 99久久这里有精品| 国产无限制自拍| 久久久91精品国产一区二区三区| 超碰在线97观看| 欧美成人第一页| 牛牛精品成人免费视频| 爱情岛论坛vip永久入口| 综合av第一页| 天天干在线观看| 国产精品久久久久久久久久ktv| 亚洲精品成人无限看| 久久久久亚洲AV成人无码国产| 日本电影亚洲天堂一区| 嫩草香蕉在线91一二三区| 国产欧美日韩在线播放| 日韩成人一级片| 久久精品免费在线| 一本一本久久a久久精品牛牛影视| japansex久久高清精品| 久草热视频在线观看| 国产精品久久久久9999吃药| 日本韩国免费观看| 国产精品久久久久99| 国产精品av久久久久久麻豆网| 国产精品815.cc红桃| 欧美一区二区三区成人| 国产精品专区免费| 国产性生活免费视频| 国产婷婷一区二区| 亚洲av无码国产综合专区| 国产精品久久久久久中文字| 亚洲人成毛片在线播放女女| 羞羞在线观看视频|