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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

认识JVM--第一篇-对象分配&回收算法

發布時間:2023/12/3 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 认识JVM--第一篇-对象分配&回收算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自? ?認識JVM--第一篇-對象分配&回收算法

本來標題黨想寫成《深入JVM》,不過不太敢寫,我想一小篇博客我想還不足以說明JVM,在本文中,會就我所知給大家介紹JVM的很多內部知識,概念會相對較粗,因為太細的內容要寫,這里肯定寫不出來;本文主要偏重理論,沒有什么實踐,中間除一些官方資料外,還有部分自身的理解,所以請大家不要完全信任本文內容;另外本文會有一小部分糾正以前一篇文章對于intern()使用方法的錯誤,本文會在其中說明使用錯誤的原因,大致文章內容有以下幾個部分:

1、JVM虛擬內存組成及操作系統地址表

2、新生成對象在HeapSize是如何變化的

3、虛擬機如何定義回收算法

4、JVM占用的空間除HeapSize還會占用什么,OutOfMemory種類!

5、糾正錯誤:intern()的使用上的錯誤


好,現在開始話題吧:

1、JVM虛擬內存組成及操作系統地址表

?????1.1.虛擬地址大致概念:在OS層面一般是由邏輯地址映射到線性地址,如果線性地址管理,如果啟動了分頁,那么線性地址就會轉換到相應的物理地址上,否則就直接認為是物理地址;程序設計中所用到的地址單元就是邏輯單元,如在C語言中的&表示指定的地址就是邏輯地址;而物理地址也并非我們所認為的RAM,還應該包括網卡、顯存、SWAP等相關內容,也就是由OS所管理所有可以通過頂層邏輯單元映射到的目標地點,不過絕大部分情況下只需要考慮RAM即可,尤其是在服務器上;JVM的虛擬內存地址和操作系統的虛擬內存地址不是一個概念,操作系統的虛擬內存地址相當于在磁盤上劃分的一個SWAP交換區,用于內存,內存與之做page out和page in的操作,這種用于物理內存本身不夠,而地址空間夠用的情況,一旦程序出現page out這些情況的時候,程序將會變得非常緩慢,而JVM的虛擬內存是在有效的空間內分配一個連續的線性地址空間,因為JVM想要自己管理內存,分配的堆內存都是在自己的heapSize內部,因為它要實現一些脫離于存儲器本身對非連續堆處理的管理而導致的復雜性,也就是JVM去初始化的時候就會加載一塊很大的內存單元,然后內部的操作都是內部自己完成的。

????1.2.內存分配:一般C語言分配內存是初始化將相應的基本內容和代碼段進行加載,但是不會加載運行時候的堆棧內存分配,也就是在運行到某個具體的函數時通過malloc、callloc、realloc等方方申請的區域,這些區域必須從操作系統中重新來分配,使用完成后必須進行free,C++中必須使用delete方法來釋放,大家發現沒有,OS的堆在內存不斷申請和釋放的過程中,必然會產生許多的內存碎片,從而導致你在申請一塊大內存的時候,需要進行邏輯連接,導致在申請的速度減小,當然LINUX采用了將內存塊劃分為多個不同大小的板塊,來較好的處理這個問題,不過片段還是存在的,不過這種思想的確是很好的,而JVM是如何完成碎片的處理的呢,后面章節會說到;JVM在初始化的時候就會向OS申請一塊大內存,JVM要求這塊內存在地址空間上是連續的(物理上未必連續),讓所有的程序在這個內部區分配,由自己來管理,所以它內部相當于做了一個小的OS對內存的管理,所以JVM是想讓java程序員不用關心在哪一個平臺上寫代碼,但是你一定要關心java怎么管理內存的;

??? 線性地址隨著實際物理內存的增加,將會導致頁表非常大,甚至于導致多層頁表,如內存達到96G這一類,那么這樣管理起來將會非常麻煩(正常情況下一個頁只有4K,可以自己算一下需要多少個管理地址來指向這個4K,這個管理地址太大的時候,又需要其他的管理地址來管理這個地址,就會導致多層地址,可能到最后,一個大內存有40%都是用于管理內存的,真正使用的可想而知),所以在LINUX高版本中對于內存尋址方面做了改進,就是支持大頁面來支持(其實是通過一個套件完成的,并非OS本身),如一個頁的大小為1M這樣的,但是有一些風險在里面,它要求大頁面內存要么放得下你的內存,但是你不能將你的進程一部分放在大頁面內存中,一部分放在OS管理的小頁面內存中,也就是說要么這塊放得下,要么就放在其他地方,可能會導致兩邊正好都差那么一點點的問題,在OS這邊可以使用SWAP,但是系統會很慢,而且SWAP很多的情況下肯定會宕機掉。

????1.3.內存分配狀態:一個大的進程如果初始化需要分配一塊大的內存空間,內存空間一般會經歷兩個狀態的轉換過程,首先內存必須是free狀態才可以被分配,如果的確是該狀態并且空間是夠用的,那么它首先會占用那么大一個坑,在java的heapSize中,就是-Xmx參數指定的,也就是JVM虛擬機最大的內存空間(注意這里-Xmx并沒有包含PermSize的空間),這個坑是不允許其它進程所占用的,內存的狀態為:reserved的狀態,當需要使用的空間時,內存將會被commited狀態,在JVM初始化時也就是-Xms狀態的內存空間,處于這個狀態的內存如果發現不夠使用(物理內存),此時就會發生swap區域,程序將會變得非常緩慢,但是不會造成宕機,而很多時候在這個時候定位不出原因,所以我們為了讓物理內存不夠用的現象暴露出來可以被發現,至于可以定位不是程序代碼的問題,我們就直接將swap內存禁用掉;有個問題就是既然被reserved的內存就不能被其他進程所占用,為什么要在這兩個狀態之間來回倒騰呢?這不是多一個開銷嗎?JVM在來回倒騰的過程中會導致每個區域的容量發生相應的變化,必然導致的是FullGC的過程,那么JVM一般在服務器端如何設置呢?文章后面逐步細化說明。

????1.4.JVM內存組織:關于JVM內存組織方面,前面在講述Java垃圾回收的時候已經提及到了,但是講得不太細,有些部分可能算是有錯誤的,所以這里根據上述操作系統知識以及官方部分資料繼續深入,不敢說完全正確,不過至少比以前要更加深入得多,首先來看下ORACLE官方給出來的一個JVM內存單元的組織圖形:

其實我看過很多次這個圖看得很暈,因為以前不了內存分配中commited與reserved的區別,以至于我當時認為這副圖是說java的HeapSize是由N多個部分組成的,并且還包含HeapSize的,其實在經過很多資料查閱后,尤其是看到一些監控工具后,才知道看官方資料也有誤區,呵呵,通過簡化,我自己畫的這副圖希望能夠幫助大家理解JVM的大致的內存劃分(這里僅僅提及JVM自己的內存,也就是HeapSize和PermSize的部分,其余的文章后面說明),這里僅僅將上面的圖形立起來畫了,當時看起來要方便理解得很多(個人感覺):

也就是說,你首先需要將JVM的兩個大板塊分開,一個是HeapSize,也就是上圖左側的部分,右邊部分為PermSize的尺寸,HeapSize也劃分為大區域為Young和Old區域,Young區域內部劃分為三個部分,一個是Eden和兩個同樣尺寸大小的survivor區域,注意到的人會發現為什么每個區域內部還有一個virtual區域,這就是我們上面說的沒有經過commited當時已經占用了地址列表,它不能被其他進程所占用,當時操作系統一般的提示會認為這是塊剩余空間,但是實際上是只能被自己使用的,這部分上面已經提及,至于為什么我們后面來解釋,這里再提出一些問題,就是為什么JVM要提出這么多區域劃分來管理呢?如果一個區域可以管理為什么還要搞得那么麻煩呢?這么多區域有什么用處,我們在第二章對象的分配中將詳細說明這部分內容。

2、新生成對象在HeapSize是如何變化的

??? 2.1.java新創建對象的方法有哪些:首先學習過java的人可能沒有人不知道new 這個關鍵字,也就是新創建一個對象的關鍵字,當發生new操作時,jvm為你做了什么?我們先把這個問題放下,對于jvm初始化加載專門處理,這里先說除了new之外還有什么方式,就是通過java.lang.Class.forName進行動態狀態后,獲取一個新的實例,當然方法有重載,也通過通過ClassLoader進行動態狀態,什么是動態裝載?為什么有了new還要有動態裝載?而jvm初始化做了什么?動態裝載和new的區別是什么?這也是我們下面要討論的問題,也是PermSize中內容的一大塊部分。


???2.2.jvm初始化需要做什么?Jvm在向OS請求了一塊地址列表后,然后就需要初始化了,初始化要做什么呢?jvm啟動相當于一個進程,當然它可以再啟動子進程,這里我我們只考慮單個進程,進程啟動必然需要初始化一些內容,C語言或者C++它會將相應的全局變量以及代碼段等內容在內存中進行編譯為相應的指令集;而jvm做了什么呢?jvm它也需要做一些操作;首先每一個進程都必須最少一個引導進程,也就是我們說的main,通過引導進程所關聯,以及關聯的關聯(也就是import),jvm會將這些關聯關系的內容形成一個大的jvm網狀結構用于關系于class之間并保證每一個class有一份自己的私有池,他們放在哪里,他們就是放在PermSize,也就是很多中文翻譯中的永久代,每一個Class都有自己獨立的私有池去管理自身的結構,對一個java程序源文件,編寫的是對于程序的描述信息,生成class也就是描述信息的byte格式(在這個過程中會自動完成一些簡單邏輯合并工作),byte格式是字節碼格式,也就是按照每8個bit位組成的計算機基本格式,只要字符集統一,則為每一個操作系統所認知的格式,JVM需要做的是將這些統一認知的格式信息翻譯為對應操作系統的指令或硬件指令,所以JVM真正的意義就是為每一個操作系統編寫了一個統一的JRE,即:java運行時環境,而編譯環境是所有系統都可以使用的;初始化將class的定義加載到內存中會進行相應的轉換和壓縮,總之會形成原有對類型描述和執行順序,而不會出現混亂,但并不是對應的操作系統指令(對應的操作系統指令是運行時知道的),如描述類型、作用域、訪問權限等等內容,這部分空間大小決定于class的多少,也就是你的工程的大小,PermSize還包含了其他的內容,并且只是在一般情況下不會發生GC,但是有些時候還是會發生GC的,在后面繼續說明;這個加載完成后,他們在池中自然有自己的內存首地址,要尋找他必然要有對應列表,列表的基礎肯定是屬于符號向量了,也就是基于名稱的一個符號向量,那么當發生new時,它會在符號向量中尋找對應的class,找到后將符號地址轉換為對應的class地址,并且這個內容只會被轉載一次,以后可以直接被利用,從中找到了class的定義,在堆中分配內存時將其定義部分的某些組織單元放置與對象的頭部,這些代碼段對于對象來說是彼此獨立,就像你在方法體前面增加synchronize關鍵字,對于非靜態方法來說,不同的對象這個關鍵字是相互不會影響的,也就是說,如果多個線程調用的對象不是同一個,僅僅在方法(非靜態方法)體上面增加synchronized這對于多線程同步是無效的(更多關于多線程的知識,如關鎖方面的Lock、Atomic等方面的知識不是本文的內容,這里不再展開討論);注意,這里還沒有談到申請對象以及動態裝載,動態裝載的class一般是不會JVM初始化的時候轉入Perm的,而是運行時動態裝載進去的,就像JDBC驅動一樣,大家幾乎都用動態裝載來實現動態加載不同數據庫連接的目的;也就是我們上一節提出的問題,動態裝載做什么?它負責的是運行時裝載一些類的定義,而不是初始化,當然,當你通過全名去加載的時候,他們會從符號向量中尋找這個類是否已經加載,如果已經加載則直接使用,否則從相應的包中獲取這個class定義,然后裝載起來,裝載的單位也是以class為單位,并不是以jar包為單位,這里請大家如果不要濫用動態加載,一個是造成Perm的不穩定,另一個是它的效率肯定沒有new高,因為它需要先去通過符號向量尋找是否存在,不存在再加載,然后再通過newInstance實例化一個或多個實例,當然在某些特殊的時候,利用它可以為你的程序帶來極高的靈活性。

?

??2.2.內存申請時的指針與實例:內存申請時上一節已經說到地址空間的和符號引用得到對應數據結構的方法,這里不再提及,這里就將對象作為整體,在堆中;在JVM的初衷中,它希望新申請的內存是連續的,雖然堆的定義是讓內存是隨機分配的,但是對于整個JVM來說,它希望分配的內存是較為連續的,也就是按照較為條帶化的方式進行分配,好處有好幾個,一個是這樣非常的簡單,經過精簡后的情況目前一個new翻譯為機器碼只需要10條左右的指令碼,近乎與C語言,所以在高版本的jdk中,new的開銷不再是java虛擬機慢的一個原因,大家也沒有必要去盡量減少new,但是也不要濫用,業績雖亂定義不必要的對象;其次,另一個好處,當內存較為連續后,內存在分配上就沒有類似的大量碎片的問題,造成運行一段時間后,大量碎片,當需要申請一個大內存的時候,需要尋找非常多的地方才能將其邏輯上組成,而導致分配空間上不必要的浪費;而一個簡單內存分配String?a =?new?String("abc");,這樣一條代碼,會做什么動作呢?a相當于是對象的一個指針一樣的東西,這個空間的大小為一個long的長度,也就是可以支持到可以想象的任何內存大小,它并不是存放在heapSize中的,而是放在stack中的,由OS來調度管理,也就是當a的作用區域完成,這個指針將會斷開,java中的String不再是C或者C++中的一個指針指向的一個字符數組,而是一個被包裝后的對象,也就是java為什么說自己都是對象,因為它把原生態的內容進行了包裝,讓程序編寫更加簡單;這里順便提及一下:在較早期的jdk中,jvm并不是由一個指針直接指向分配堆中的首地址,而是先有一個handle空間,這個空間存放了開始說的一些對象的定義和結構信息,也就是找到該位置,然后由該位置轉換到對應的對象上,但是那個時候的對象頭部信息就沒有現在的那么全,也就是以前是將一部分handle內容放置在獨立的空間上,現在的jdk已經沒有那樣的了。

?

???2.3.內存分配后放在哪里,如何移動

終于回到上面的話題,內存分配后,在堆中的什么位置?就是我們上面說的heapSize中的Young區域的Eden區域中,也就是new的對象絕大部分會放在這里(排除一種非常大的對象的特殊情況),在java設計的看來有一個特別有意思的地方,就是它在新生成的對象中它認為你絕大部分對象都是應該需要被銷毀掉的,就像在做java WEB應用上一樣,一個列表請求過來,可能請求的內容有2K的內容,請求完成后,這個內容一般說來自然就不需要了,也就是在他原始的考慮下它沒有考慮你自己在應用級別去做page cache的操作;好,那么當內存不夠的時候,這里指被commited的空間不夠的情況下,此時java就會做一個動作,就是會對Young空間進行回收,由于新生成的對象,java認為這塊空間不會很大,而且絕大部分應該是被干掉的內容,所以很多時候java會采用單線程的復制算法(當然你也可以設置為多線程),關于算法的核心在第三章中會說到,這里總之先理解找到了活著的對象,將其拷貝到其中一個survivor區域中,當下一次做操作時,就會將Eden中活著的以及前一個surivor活著的一起拷貝到另一個survivor中,這就是為什么要設置兩個survivor區域,而拷貝后,Eden區域為空、另一個survivor也為空,可以完全直接整體清除掉,所以非常快速,而拷貝的目標也會被連續化,新生成的對象又從Eden的初始位置開始分配空間。

????? 當對象每次(活著)被拷貝到一個survivor時,Java虛擬機就會記錄下來對象被移動的次數,當次數達到一定的程度,也就是官方文檔所說的足夠老的情況,這塊內存就認為它不太容易被注銷掉,此時就會被移動到第二個區域Tenured區域,這個次數也可以由自己來控制。

????? 另外在一般默認的情況下當回收后的內存仍然占用實際目前commited內存的70%以上,那么此時虛擬機將會開始擴展這些內存,而當回收后的內存小于40%后,虛擬機將會降低這部分內存,但是其他線程仍然不能使用(當然這個參數也是可配置的,在文章最后有說明),這樣收縮和擴展必然導致一些問題,但是java的初衷是想讓你再沒有使用這塊地址表的時候,回收內存的大小會小一些,因為young區域的一般是使用單線程的回收方式,這個時間段是會被暫停的,所以它認為內存使用較少的時候回收就內存的速度應該加快;但是,和實際相反的是,我們正好需要的是內存使用較大的時候,才希望加快回收的速度,內存使用小的時候,回收都是無所謂的;所以我們在很多時候建議將-Xms和-Xmx設置成一樣的大小,不用這么來回倒騰。

???? 在說明下,以下三種情況對象會被晉升到old區域:

???? 1、在eden和survivor中可以來回被minor gc多次,這個次數超過了-XX:MaxTenuringThreshold

?????2、在發生minor gc時,發現to survivor無法放下這些對象,就會進入old。

???? 3、在新申請對象,大于eden區域的一半大小時直接進入old,也可以專門設置參數-XX:PretenureSizeThreshold這個參數指定當超過這個值就直接進入old。

???? 當上面的對象被移動到了Tenured區域,這個區域一般非常大,占用了HeapSize的絕大部分空間,此時若它發生一次內存回收,就不能像剛才那樣來回拷貝了,那樣代價太大,而且這個區域可以說是經得起考驗的對象才會被移動過來,在概率上是不容易被銷毀掉的對象才會被移動過來;那么,我們很此時想到的就是反過來計算,也就是找到需要銷毀的對象,將其銷毀,關于算法也是下面第三章要說的內容,總之對象會在這里存放著。

???? 為什么java不論在Young中的區域會來回倒騰,而在Tenured區域也會不斷去做壓縮,就是我們前面說的,它希望內存相對較為連續而做的;java在Yong的區域,它認為可以剩下的內容不會很多,所以拷貝的代價并不大,所以它認為來回拷貝是一種合適的方法,而Tenured區域它采用了清除后,一定次數后進行壓縮的方式,當然這個次數你可以自己去設置,在文章的最后是有參數的;而它沒有采用類似操作系統一樣的按照板塊大小等一系列算法來完成,這也是我比較納悶的事情,不過總體說來這種算法還是可行的;希望在劃分區域一些策略上能有更大的靈活性,這樣可以在更多的應用中發揮得更加靈活,這樣就更好了;比較困惑的就是這樣的架構自己如果做頻繁度不高不低的page cache,性能不好估量,也許比不做cache更低,這個要根據具體情況而定了。

????2.3.Perm一般還會存放什么內容?Perm除了存放上面的Class定義外,還一般會存放的內容有靜態代碼段、final static類型的類變量、String常量以及String被intern后的內容,也是最后一章中所要提及以前我自己寫錯的內容;如何應對好常量池,以及常量池是否會被GC,也是我們所需要說明的內容;關于Perm永久代中存放的內容,應當如何配置以至于它可以去回收,在文章的最后有相應的說明,請自行查閱;不過對于Perm的大小,一般還是不建議去做GC的,也就是合理的去使用Perm,在程序運行中占用Perm最多的就是String常量,尤其是如果大量使用intern的時候,就會造成大量Perm膨脹,也是最后一部分需要說明的內容,不過intern也并非一無是處,因為你可以這樣說:如果它沒有用處的話,java沒有必要再把String的常量放在單獨的一個地方,它有很多好處,只要在適當的時候利用好常量池這個區域在必要的時候可以提高性能,具體在最后一章有所講解。


3、虛擬機如何定義回收算法

??? 3.1.首先虛擬的回收算法會分成兩個部分,一個部分是對象的查找算法,一個是真正如何回收的方法。一般對于查找有以下兩種:

??? a)引用計數:本來在本文中我不想提及引用計數,因為這是最原始也是最垃圾的算法,也是較低版本jdk慢得出奇的原因,但是為了說明后面的問題不得不簡單說明一下,引用計數就是通過java虛擬機專門為每個對象記錄它被指針指向的個數,當發生指針指向它或者被賦值,計數器將會被加1,而但指向它的指針=null或者脫離了作用區域,jvm就會將相應的計數器減少1,這樣簡單,但是慢死了,不僅僅操作上出奇的慢,因為要做一個簡單的賦值操作要到多個地方去找一大堆東西;還有一個就會引起很難檢測到的內存泄露,那就是當兩個或者多個對象存在循環交叉引用的時候,此時他們的引用計數將永遠不會等于0(如使用雙向鏈表或使用復雜的集合類后,相互之間的引用),也就是垃圾收集器將永遠不會認為這是垃圾(當然要用復雜的算法可以解決,但是這個算法的確很復雜,可能垃圾回收會更加慢),最后就是這個垃圾回收方式必然導致內存的遍歷操作過程。引用計數的示意圖如下圖所示:

????b)引用樹遍歷:其實是一個圖,只是有根而已,它沿著對象的根句柄向下查找到活著的節點,并標記下來,其余沒有被標記的節點就是死掉的節點,這些對象就是可以被回收的,或者說活著的節點就是可以被拷貝走的,具體要看所在heapSize中的區域以及算法,它的大致示意圖如下圖所示(對象:B、G、D、J、K、L、F都是垃圾對象,雖然他們也有相互指向,但是不是被根節點能遍歷到的,注意這里是指針是單向的):

????3.2.內存回收:上面的方法我們可以找到內存可以被使用的,或者說那些內存是可以回收,更多的時候我們肯定愿意做更少的事情達到同樣的目的,我們會根據一般的情況設置不同的算法來讓系統的性能達到較好的程度,首先來了解下內存回收的算法或者它的經歷有哪些?

????a):標記清除算法,這算是比較原始的算法,也就是通過上面的查找標記后,我們對沒有標記的對象進行空間釋放的過程,這個算法雖然很原始,但是是后來所有算法的基礎,好處的簡單,缺陷是造成和其他語言一樣的內存碎片,要通過更加復雜的算法來解決這些碎片;另一缺陷就是它這個過程如果用于較大的內存將會導致長時間的對外服務停止(當然這個停止也不是傳說中那么長,只是相對計算機來說比較長,至于多長是還和jdk的版本以及廠商有關系,BEA曾經在1G的JVM下面測試,有300M空間屬于可用空間,據測試結果為30ms的停止服務時間,我想這個時間應該可以接受,不過它有自己的測試場景,不能完全說明問題,而一般情況下在單線程引用下,常規的回收起碼會比這個時間要長好幾倍甚至于10倍以上)。

????b):標記清楚壓縮,這個算法是也是較為原始的,它的出現是為了解決上面一種算法中不能壓縮空間的問題,但是并非取代,因為它導致的另一個問題就是更長時間的服務停止,因為壓縮就是空間拷貝到一個較為連續的地方,而并非對數據本身進行壓縮,所以很多時候他們是配合使用的,如多少次清除后進行一次壓縮。

???c)復制回收:也就是在jvm發展的過程中出現的算法,現在基本都只能看到一些思想影子在里面,但是沒有這個方式,也就是將其劃分為2個相同的大小,然后將活著的節點來回拷貝,這樣造成的內存浪費的非常大的,不僅僅是一半的浪費問題,而且每次拷貝的開銷也是非常大的,因為都是涉及到整個jvm活著節點的拷貝過程。

???d)增量回收:這算是現代垃圾回收的一個前身,它做的事情就是為了解決復制回收算法中的一個問題,就是每次復制造成的空間開銷非常大的問題,此時它將內存中切分為逐個板塊,這些板塊,每個內部使用了復制算法,也就是并沒有解決空間浪費的問題,回收的過程中沒有進行細化,雖然回收速度較快速,而且只會造成局部的停止服務,但是對于不同板塊大小、不同生命周期的對象還是沒有劃分開。

???e)分代收集器:分代收集器是增量收集的另一個化身,或者說延續吧,它將板塊按照生命周期劃分為上面所說的板塊,每一個板塊可以采用不同的算法進行回收,這也是和增量回收最大的區別,此時可以讓jvm的回收達到更好的效果,不過由于jvm按照生命周期劃分后都是指定板塊的,所以根據內存大小劃分自定義板塊是不可能的,至少現在好像還沒有,所以在回收過程中如果內存大了回收起來一樣很吃力,尤其是對Old區域的回收,所以并發回收不得不出現了。

???f)并發回收:所謂并發回收是指外部在訪問的同時,java回收器依然在做著回收工作,原早我認為并發回收是不可能的,因為你需要知道內存是需要回收的,就不能讓內存繼續的被申請和釋放,但是SUN的人還是比較天才的,還是有辦法盡量讓他并發去做的;并發回收器其實也會暫停,但是時間非常短,它并不會在從開始回收尋找、標記、清楚、壓縮或拷貝等方式過程完全暫停服務,它發現有幾個時間比較長,一個就是標記,因為這個回收一般面對的是老年代,這個區域一般很大,而一般來說絕大部分對象應該是活著的,所以標記時間很長,還有一個時間是壓縮,但是壓縮并不一定非要每一次做完GC都去壓縮的,而拷貝呢一般不會用在老年代,所以暫時不考慮;所以他們想出來的辦法就是:第一次短暫停機是將所有對象的根指針找到,這個非常容易找到,而且非常快速,找到后,此時GC開始從這些根節點標記活著的節點(這里可以采用并行),然后待標記完成后,此時可能有新的 內存申請以及被拋棄(java本身沒有內存釋放這一概念),此時JVM會記錄下這個過程中的增量信息,而對于老年代來說,必須要經過多次在survivor倒騰后才會進入老年代,所以它在這段時間增量一般來說會非常少,而且它被釋放的概率前面也說并不大(JVM如果不是完全做Cache,自己做pageCache而且發生概率不大不小的pageout和pagein是不適合的);JVM根據這些增量信息快速標記出內部的節點,也是非常快速的,就可以開始回收了,由于需要殺掉的節點并不多,所以這個過程也非常快,壓縮在一定時間后會專門做一次操作,有關暫停時間在Hotspot版本,也就是SUN的jdk中都是可以配置的,當在指定時間范圍內無法回收時,JVM將會對相應尺寸進行調整,如果你不想讓它調整,在設置各個區域的大小時,就使用定量,而不要使用比例來控制;當采用并發回收算法的時候,一般對于老年代區域,不會等待內存小于10%左右的時候才會發起回收,因為并發回收是允許在回收的時候被分配,那樣就有可能來不及了,所以并發回收的時候,JVM可能會在68%左右的時候就開始啟動對老年代GC了。

???d)并行回收:并行回收指利用多個CPU對JVM進行并行垃圾回收的過程,并行度都是可以設置的,可以分別對年輕代和老年代配置是否使用并行回收。

好了,回收算法就說到這里,那么如何利用好回收算法,在看了上面的介紹后,是否對JVM有了一個大致的了解,具體細節,可以慢慢實踐,在文章最后給出一些常用的java虛擬機內存設置參數的說明,不過并不權威,需要根據實際情況而定才可以。

下面說下java虛擬機除了消耗基本內存外還會消耗什么內存?

4、JVM占用的空間除HeapSize還會占用什么?

??? 一般來說,對于很多學了好幾年,甚至于很多年java人來說,一旦看到OutOfMemeory(簡稱OOM),就認為HeapSize不夠,然后瘋狂的增加-Xmx的值,但是HeapSize只是其中一個部分,當你去做一個實驗,也就是java啟動時直接在程序中瘋狂的new 一些線程出來,直到內存溢出,當-Xms -Xmx設置得越大的時候,得到的線程個數會越少,為什么呢?因為OOM并不是HeapSize不夠而導致的,而由很多種情況。

??? 首先看下操作系統如何劃分內存給應用系統,其實在Win 32、Linux 32的系統中,地址總線為32位的理論上應該可以支持4G內存空間,但是當你在Win 32上設置初始化內存如果達到2G,就會報錯,說這個塊空間沒法做,首先默認的Win32系統,會按照50%比例給予給Kernel使用,而另一部分給應用內存,也就是說操作系統內核部分不論是否使用,這一半是不會給你的,而還有2G呢,它在系統擴展的部分,也就是并非Kernel的部分,有很多靜態區域和字典表的內容,所以要劃分一個連續的2G內存給JVM在Win 32上是不可能的,Win 32提出了一種Win 32 3G模式,貌似可以劃分3G空間,其實它只是將內核部分縮小也就是管理部分縮小,也就是將一部分劃分到外部來使用,而且Win 32習慣在內存2G的位置做一些手腳,讓你分配連續2G沒有可能性,一般來說在Win 32平臺上,在物理內存足夠的情況下給JVM劃分的空間一般是1.4~1.5G左右,具體數據沒有測試過;而Linux 32類似于Win 32 3G模式,但是它還是一般情況下分布不凌亂的情況下,一般可以給JVM劃分到2G的大小。Linux 32 Hugemem是一個擴展版本,可以劃分更大的空間,但是需要付出一些其他的代價,理論上可以支持到4G給應用,也就是Kenel是獨立的;Solaris x86-32和AIX 32等系統,也類似于Linux 32平臺一樣。


??為什么還要預留一些空間出來呢?這些空間給誰?

? 當你申請一個線程的時候,它的除了線程內部對象的開銷外,線程本身的開銷,是需要OS來調度完成,一般來說,會在OS的線程與虛擬機內部有都有一個一一對應的,但是會根據操作系統不同有所變化,有些可能只有一個,總之heapSize外的那部分空間是跑不掉的,它放在哪里呢?就是放在Stack中的,所以上文中的-Xss就是設置這個的,在jdk 1.5以后,每個線程的大小被默認設置為1M的stack開銷,我們習慣將這個開銷降低。

?

??好了知道了指針、線程是在heapSize外部的,還有什么呢?

? 當你自己使用native方法,也就是JNI的時候,調用本地其他語言,如C、C++在程序中使用了malloc等類似方法開辟的內存,都不是在heapSize中的,而是在本地OS所掌控的,另外這部分空間如果沒有相應的釋放命令,就需要在對應finalize方法內部調用其他的native方法來完成對相應對象的釋放,否則這部分將成為OS級別的內存泄露,直到JVM進程重啟或者宕機為止(操作系統會記錄下進程和相應線程和堆內存的關聯關系,但是進程再沒有釋放前,OS也是不會回收這部分內存的)。

??另外在使用JavaNIO以及JDBC、流等系列操作時,當形成與終端交互時,會在另一個位置形成一個內存區域,這些內存區域都不在HeapSize中。

? 所以常見的OOM現象有以下幾種:

? 1、heapSize溢出,這個需要設置Java虛擬機的內存情況

? 2、PermSize溢出,需要設置Perm相關參數以及檢查內存中的常量情況。

? 3、OS地址空間不夠,也就是沒有那么多內存分配,這個一般是啟動時報錯。

? 4、Swap空間頻繁交互,進程直接被crash掉,在不同操作系統中會體現不同的情況。

? 5、native Thread溢出,注意線程Stack的大小,以及本身操作系統的限制。

??6、DirectByteBuffer溢出,這一類一般是在做一些NIO操作的時候,或在某種情況下使用ByteBuffer,在分配內存時使用了allocateDirect以及使用一些框架間接調用了類似方法,導致直接內存的分配(如mina中使用IoByte去調用,當參數設置為true的時候就分配為直接內存,所謂直接內存就是又OS定義的內存,而不需要從程序間接拷貝一次再輸出的過程,提高性能,但是如果沒有手動回收是回收不掉的),導致的Buffer問題,如輸出大量的內容,輸入大量的內容,此時需要盡量去嘗試限制它的大小。

使用非常多的工具區檢測Java的內存如:jstat(只能看HeapSize和PermSize)、jmap(很細的東西)、jps(java的ps -ef呵呵)、jdb(這個不是監控工具哈,這個是debug工具)、jprofile(圖形支持,但是可以遠程連接)等等;jconsole(可以看到heapsize、permsize+native mem size(這這里叫做:non-heapsize)等等的使用的趨勢圖)、visualvm(極為推薦的東西,圖形化查看,你可以查看到內存單元分配、交換、回收、移動等等整個過程,非常清晰展現jvm的全局資源)、另外pmap可以展現非常清晰的資料,可以精確到某一個java進程內部的每一個細節,而且可以看到heapsize只是其中很小一部分(在solaris操作系統上看得最齊全,LINUX下有些進程可能看不太懂);也可以在/proc/進程號/maps中查看(這里可以看到內存地址單元的起始地址,包含了reserved的地址范圍和commited的地址范圍),全局資源使用操作系統top命令和free命令看;IBM有一個GCMV免費下載工具也很好;Win32有一個WMMap工具都是很好的工具

使用相應的工具觀察相應的內容,當觀察到內存的使用從無到有,上升,然后處于一個平穩趨勢,那么這個JVM應該是較為穩定的;如果發現它經過一段平滑期后,又出現飆升,這個必然是有問題的,至于什么問題,根據前面的學下和實際情況我們可以去分析;當它開始后,平滑過程,出現緩慢上升的過程,但是始終會上升到極點,那么一個是需要知道物理內存時候可用,另一個就是少量的內存泄露(JVM現代也有內存泄露,只是它的內存泄露并非C、C++中的內存泄露)。

5、糾正錯誤:intern()的使用上的錯誤

???? 最后一章節,我自己糾正一下我自己的錯誤,以前的文章中,也就是關于intern的使用,最近對他做了一些深入研究,因為以前也是和很多同學一樣,聽到別人推薦什么就瘋狂的使用,知道點原理也是點大概,沒有深入研究內部的內容。

???? 我曾經在文章中說到任何系統最多使用的數據類型必然是String,不管做什么,所以在String的處理上很有研究,推薦使用java的朋友在大量使用對比的時候不要用equals,而推薦使用intern(),但是我最近發現我錯了,我這里給大家道歉,因為可能會誤導很多朋友;下面說明下這個東西為什么?

???? 首先我開始自己懷疑自己的時候是想說,如果intern可以做到高效,那么equals是不是在String中就沒有存在的必要了呢,當時對于我理解僅僅為常量池的一個地址對比,好比是兩個數字的compare,僅僅需要CPU的單個指令即可完成;于是我開始做了兩個實驗,一個是最原始,最初級的方法采用單線程循環1000000次調用equals與intern等值對比,并且采用了不同長度的字符串去做比較,發現equals竟然比intern要快,而且隨著字符串長度的增加,equals會明顯快與intern,然后使用多線程測試也是得到一樣的效果,我首先很不敢相信自己堅持的理論被徹底和諧了,后來冷靜下來必須需要面對,通過很多權威資料的閱讀,我發現我對JVM常量池的理解還只是一點點皮毛而已,所以我做了更加深入的研究。

??? 原來intern方法被調用時是在Perm中的String私有化常量池中尋找相應的內容,而尋找雖然可以通過hash定位到某些較小的鏈表中,但是還是需要在鏈表中逐個對比,對比的方法仍然是equals,也就是拋開hash的開銷,intern最少要與里面的0到多個對象進行equals操作,而且如果不存在,還要在常量池開辟一塊空間來記錄,如果存在則返回地址,也就是常量池保證每個String常量是唯一的,這個開銷當然大了,而且如果使用在業務代碼中將會導致Perm區域的不斷增加;

??? 于是,我又反過來想了:既然equals比他效率高,為啥還要用intern呢?而且equals的那個算法對于長字符串逐個字符對比的過程我實在是難以入目;而且也實在是覺得不甘心自己的理論就這么容易被和諧掉,因為自己已經在不少程序中這樣用過,這樣我豈不是犯下大錯了,因為自己參與過的項目的確太多了,而且有類似的代碼我寫入了框架中,最終發現我可能錯了一半,也就是歷史上的記錄可能我有一半類似的代碼是錯誤的;為什么呢?intern還是有用的,我先做了一個測試,那就是,用一個已經intern好的對象,讓他與一個常量做等值,循環次數和上面一樣,結果我預料的結果發生了,那就是比equals快出了N多倍數,隨著長度的增加,會體現出更加明顯的優勢,因為intern對比的始終是地址,和長度無關,于是我想到了如何使用它,就是在程序中返回通過字符串類似于數字一樣的類型判定時,如:做一個sqlparser的時候,經常根據數據類型做不同的動作,這樣如果用equals會在每次循環時付出很多開銷,尤其是很多數據庫的類型非常多,最壞的是從上到下每個字符串匹配一次,當然長度不等開銷很小,長度相等開銷就大了;intern我就將這些schema信息預先intern掉,也就是他們已經指向了常量池,當再真正匹配時,就不需要用intern了,而是直接匹配,也就是將這個開銷放在初始化的過程中,運行時我們不去增加它的開銷。

??? 所以,個人是犯下一個錯誤,并且以前還很張揚的到處宣傳,呵呵,現在覺得有點傻,希望在看到某些推薦用什么新東西的時候,千萬不要在沒有研究明白他就去用它,甚至于濫用它,至少要經過一些簡單的測試,不過對于現代很多復雜的東西,一些簡單的測試已經不足以說明問題,就像Lock與Synchronize的開銷一樣,如果采用簡單的循環的話,你會發現新版本的Lock的開銷將會比Synchronized的開銷更加大,它適合的是并發,讀寫的并發,所以真正要弄清楚還是研究內在。

??? 最后說下,我個人對JVM的期望,JVM做到了很多個板塊之間使用不同的算法,而JVM不希望程序員去關心內存,但是有些特殊的應用需要JVM提供多的支持,當然有些公司對JVM內核進行了改造來適合特殊的應用,但是我們更加希望標準的JVM能夠提供更加靈活的內存管理機制,而不僅局限于配置,因為配置適中是死的,在很多時候會面臨擴展性的限制;如很多時候我們認為可以判定很多的對象本身就是不會被回收或者根本不容易被回收的,就不用到Young的空間和其他的業務套在一起倒騰了;對于經常做page cache的系統,而page cache的命中率不是特別高(95%以上就很高),也不是很低(如80%以下),這個時候,置換到快不慢的,而會導致在老年代的回收的頻繁起來,就我個人希望這些空間都能獨立出來,甚至于可以由程序去控制和指定,當然JVM可以自身去默認;尤其是按照一些特殊的對象等級類型或者說對象的大小,這些細節都可以采用一些相應的默認GC手段來完成,也可以人工的指定,當然也在默認情況下可以按照原有的模式進行架構,這樣JVM的內存調節的靈活將會更加寬松,使得它能在各類場合下只要使用相對應的手段配置和程序調整都是可以打到目的的。


?? 本文包含大量個人見解,如有不是之處,請大家多多指教!本文到此完結,內容粗而不深入,細節問題,細節討論。

?

?常見參數JVM參數配置(java vm Hotspot TM 1.6):

?-Xms為初始化為HeapSize的空間,即被Commited的尺寸。 ?-Xmx為最大的HeapSize空間,有些尚未被Commited,但是已經被進程所Reserved,當現在已經被Commit的空間長期處于(jdk1.1還有一個-mx為包含handler表的空間) ?-Xmn設置Young的空間大小,此時NewSizeMaxNewSize一致,或者分別設置-XX:NewSize=128m ?-XX:PermSize?= 64M-XX:MaxPermSize= 64M為永久代的初始大小和最大大小。 ?-XX:NewRatio= 3?為Tenured:Young的初始尺寸比例(設置了大小就不再設置此值),此時Young占用整個HeapSize的1/4大小。 ?-XX:SurvivorRatio= 6:為Eden:Survivor比例大小,此時一個Survivor占用Young的1/8大小,而Eden占用3/4大小 ?-Xss=256kThreadStack空間大小,jdk?1.5以后默認是1M,在IBMjdk中還有-Xoss參數(此時每個線程占用的stack空間為256K大小) ?-XX:MaxTenuringThreshold=3:一般一個對象在Young經過多少次GC后會被移動到OLD區。
-XX:+UseParNewGC:對Yong區域啟用并行回收算法。
?-XX:+UseParallelGC:一種較老的并行回收算法 ?-XX:+UseParallelOldGC:對Tenured區域使用并行回收算法。 ?-XX:ParallelGCThread=10:并行的個數,一般和CPU個數相對應。 ?-XX:+UseAdaptiveSizepollcy:收集器自動根據實際情況進行一些比例以及回收算法調整。 ?-XX:CMSFullGCsBeforeCompaction= 3:多少次GC后會進行壓縮碎片 ?-XX:+UseCmsFullCompactAtFullCollction:打開老年代壓縮 以下3個參數為永久帶回收參數:
-XX:+UseConcMarkSweepGC?-XX:+CMSClassUnloadingEnabled

-XX:+CMSPermGenSweepingEnabled對永久帶進行相應的回收,在jdk1.6中不需要數:-XX:+CMSPermGenSweepingEnabled -XX:MinHeapFreeRatio這是指剩余空間百分比多少時,開始減小commited的內存; -XX:MaxHeapFreeRatio指剩余空間百分比多少時,開始增加commited的內存,直到-Xmx大小。 -XX:MaxGCPauseMillis指GC最大的暫停時間,當超過這個時間,那么JVM會適當調整內存比例(前提是使用的是基于比例的YONG和設置)。 -XX:+UseConcMarkSweepGC?啟動并發GC,一般針對Tenured區域。 -XX:+CMSIncrementalMode增量GC,將內存切塊,分布在多個局部去GC。 -XX:CMSInitiatingOccupancyFraction在并發GC下,由于一邊使用,一遍GC,就不能在不夠用的時候GC,默認情況下是在使用了68%的時候進行GC,通過該參數可以調整實際的值。
大致的參數設置就這些,但是GC本身的參數還有很多,尤其是和應用或者和具體硬件結合起來的時候,而BEA和IBM也有自己的JDK,這里有些參數他們支持,有些參數不支持,在某些平臺和甚至于硬件上可以支持特殊的參數來控制(如在部分intel系列的多CPU機器上,通過它的NUMA架構,可以設置對應參數支撐,節點和CPU之間可以實現分工負載、常規服務上都是SMP的,而大型機上多半是MPP);類似于上面的并發GC在一般情況下是不會進行compact壓縮的,因為它希望回收的時間短,但是充滿compact的壓縮時間必然不是那么短,所以在部分特殊應用下有些使用定寬度的內存尺寸,回收后不管空余內存,因為每個內存的尺寸都是那么大,這樣來處理,當然這樣必然會導致很多的內存浪費,但是它的好處是可以沒有compact而不存在說要分配的內存分配不到的問題。

總結

以上是生活随笔為你收集整理的认识JVM--第一篇-对象分配&回收算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久草a在线 | 特黄特黄的视频 | 国产精品久久中文字幕 | 中文字幕电影在线 | 久久久麻豆视频 | 最新日韩精品 | 国产 欧美 日本 | 美女视频黄网站 | 天天天操操操 | 91av在线免费观看 | 日日夜夜噜噜噜 | 亚洲一区久久久 | 欧美另类交人妖 | 波多野结衣视频一区二区 | 视频一区二区在线 | 国产精品扒开做爽爽的视频 | www.人人干 | 黄色成人av | 国偷自产视频一区二区久 | 亚洲电影在线看 | 樱空桃av | 国产在线观看免费 | 国产一区二区在线免费 | 中文字幕a∨在线乱码免费看 | 成人黄色av免费在线观看 | 一级a性色生活片久久毛片波多野 | bbbb操bbbb | 91丨精品丨蝌蚪丨白丝jk | 91在线操 | 九九99| 伊在线视频 | www.夜夜操| 91伊人| 香蕉久草 | 色偷偷88欧美精品久久久 | 久久蜜臀av | 日本深夜福利视频 | 国产中文在线视频 | 手机成人免费视频 | 99精品免费久久久久久久久 | 亚洲国产欧洲综合997久久, | 中文国产在线观看 | 久久小视频 | 日韩高清一区二区 | 91麻豆精品国产91久久久更新时间 | 亚洲精品国产综合久久 | 精品夜夜嗨av一区二区三区 | 日韩中文字幕在线观看 | 精品福利在线观看 | av三级av | 黄色毛片观看 | 超级碰碰碰免费视频 | 中文字幕免费观看视频 | 99久久精品免费看国产 | 99热国产在线观看 | 91av观看| 2019中文| 国产精品美女免费看 | 亚洲理论电影 | 国产精品大片 | 伊人国产在线观看 | 日韩久久久久久久久 | 久草视频在线资源 | 久草9视频 | 国产视频一级 | 99精品国产99久久久久久福利 | 欧美日韩国产精品一区二区三区 | 久久午夜免费观看 | www亚洲一区 | 国产h片在线观看 | 伊人久久在线观看 | 一级一片免费看 | 国产成人精品一区二区三区在线 | 久久久一本精品99久久精品 | 欧美日韩一区二区免费在线观看 | 草久中文字幕 | 在线日韩亚洲 | 久久久久国 | 日韩a在线 | www.五月天 | a黄在线观看 | 国产精品日韩精品 | 日韩专区在线播放 | 成人亚洲欧美 | 91av视频在线免费观看 | 丝袜足交在线 | 国产91全国探花系列在线播放 | 国产香蕉视频 | 一级欧美日韩 | 国产一区二区三区高清播放 | 精品国产精品久久一区免费式 | 97av视频| 亚洲午夜精品久久久久久久久 | 91在线欧美 | 美女免费黄网站 | 欧美激情综合网 | 成人欧美一区二区三区在线观看 | 国内精品久久久久久久97牛牛 | 日韩成人在线免费观看 | 91免费在线看片 | 久久不射电影院 | 不卡视频国产 | 国产又粗又猛又色又黄视频 | 国产精品久久久久永久免费观看 | 99一区二区三区 | 丁香婷婷综合五月 | 成人在线视频观看 | 日日夜夜草 | 日韩电影一区二区在线观看 | 999热视频 | av丝袜在线 | 成人资源站| av成人免费在线看 | 国产精品久久影院 | 久久高清 | 91九色蝌蚪在线 | 99亚洲精品视频 | 91网址在线看 | 99久久精品久久久久久动态片 | 国产免费黄视频在线观看 | 久久毛片网 | 日韩在线视频看看 | 精品91视频 | 国产精品成人一区二区 | 久久国产精品第一页 | 一区在线观看视频 | 五月婷久久 | 四虎影视国产精品免费久久 | 午夜在线观看 | 欧美午夜激情网 | 亚洲综合在线五月 | 国内一级片在线观看 | 久久精品久久99 | 亚洲深爱激情 | 视频国产在线 | 又黄又刺激 | av国产网站| 91最新地址永久入口 | 久久精品第一页 | 中文字幕永久 | 天天操夜夜逼 | 免费av观看 | 亚洲乱码在线 | 久久综合色天天久久综合图片 | 亚洲视频网站在线观看 | 免费黄a大片 | 深爱激情五月网 | 欧美精品久久久久久久久久久 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 久草在线观看资源 | 手机在线黄色网址 | 免费精品国产va自在自线 | 97在线视频免费播放 | 免费在线观看av电影 | 天天曰天天爽 | 97色狠狠 | 国产精品精品久久久 | 蜜桃av人人夜夜澡人人爽 | 精品三级av| 日韩亚洲精品电影 | 久久久久久久久国产 | 最新精品视频在线 | 国产高清在线a视频大全 | 亚洲综合成人在线 | 毛片网在线 | 黄色在线观看污 | 日日夜夜狠狠操 | 天天色天天色天天色 | 精品毛片一区二区免费看 | 日本不卡一区二区 | 久久人视频 | 亚洲成av人片在线观看 | 国产精品手机在线播放 | 六月色| 亚洲男男gⅴgay双龙 | 国产视频一区二区三区在线 | 麻豆va一区二区三区久久浪 | 日日夜夜草 | 99久久婷婷国产综合亚洲 | 丁香六月在线观看 | 天天操天天操天天操天天 | 亚洲毛片久久 | 亚洲国产精品va在线 | 综合久久久 | 日韩免费在线播放 | 欧美三级在线播放 | 国产高清网站 | 国产欧美在线一区二区三区 | 黄色免费电影网站 | 亚洲精品激情 | www.久久成人 | 日本精品一区二区在线观看 | 日韩一区二区三区高清免费看看 | 三级av免费观看 | 日韩精品黄 | av最新资源| 日韩久久精品一区二区三区 | 精品免费观看视频 | 在线一二区| 国产精品嫩草影视久久久 | 欧美日韩久久 | 久久成人资源 | 狠狠狠色丁香婷婷综合久久88 | 久久99在线视频 | 日韩午夜av | 六月丁香在线视频 | 99在线视频免费观看 | 久久精品国产一区二区电影 | 在线免费视频 你懂得 | 日韩成人在线一区二区 | 久久九九国产视频 | 免费在线精品视频 | 一级黄色在线免费观看 | 国产欧美精品一区二区三区 | 日韩av在线不卡 | 一区二区三区三区在线 | 伊人黄 | 天天曰天天射 | 日本视频久久久 | 91免费在线视频 | 成年人视频在线 | 成人a视频| 亚洲第一中文字幕 | 日韩电影中文 | 亚洲综合爱 | 日韩久久久久久久久久 | 久久久久女人精品毛片 | 久久视频在线看 | 日本成址在线观看 | 久久精品在线免费观看 | 亚洲欧洲中文日韩久久av乱码 | 国产精品99精品久久免费 | 久久夜视频 | 91黄站| 天天干天天做天天爱 | 免费一级特黄毛大片 | 欧美性大战久久久久 | 在线观看亚洲电影 | 操操操人人人 | 日韩有色 | 亚洲91精品 | 国产在线播放一区二区 | 亚洲精品视频第一页 | 在线视频精品播放 | 中文字幕高清视频 | 久草精品电影 | 麻豆成人精品 | 国产精品久久一区二区三区不卡 | 波多野结衣视频一区 | 日韩免费在线观看视频 | 久久精品视频中文字幕 | 国产精品成人自产拍在线观看 | 国产va精品免费观看 | 91黄色在线看 | 国产色影院 | 日韩av网站在线播放 | 高清中文字幕 | 久久国产精品免费视频 | 久久天堂网站 | 国产高清精品在线 | www.久久久.com| 色综合久久五月天 | 日韩最新理论电影 | 国产一区二区在线观看视频 | av在线精品 | 国产精品少妇 | 伊人国产女 | 亚洲高清av在线 | 永久免费精品视频网站 | 日韩一区二区三区免费电影 | 午夜视频在线观看一区二区三区 | 国产精品一二三 | 国产网红在线观看 | 亚洲永久国产精品 | 99r在线精品| 91人人插| 在线观看av国产 | 亚洲免费黄色 | 色99色 | 久久免费公开视频 | 色婷婷综合久色 | 免费亚洲精品视频 | 免费又黄又爽 | 天堂av在线网站 | 黄色91免费观看 | 黄色成人91| 欧美少妇xxxxxx| 亚洲aⅴ在线观看 | 天天做天天看 | 国产午夜精品一区二区三区嫩草 | 欧美成人性网 | 人人爱在线视频 | 91黄色小网站 | 欧美激情精品久久久久久免费 | 亚洲人毛片 | 国产精品二区在线观看 | 日韩大片免费观看 | 国产视频在线观看免费 | 国产手机视频在线观看 | 亚洲欧美成人在线 | 国产精品成人a免费观看 | 国产精品久久久久av免费 | 久久综合色影院 | 日本性久久 | 成人动漫一区二区三区 | 国产中文字幕在线视频 | 久久视频一区二区 | 久99久精品 | 久久综合色影院 | 免费视频你懂得 | 成人毛片一区二区三区 | 一区二区三区电影 | 狠狠躁夜夜av | 亚洲aⅴ在线 | 亚洲欧美国产精品va在线观看 | 免费福利在线视频 | 天天操天天操天天操天天操天天操 | 欧美性粗大hdvideo | 欧美一区二区三区在线播放 | 69av久久 | 不卡的av片 | 亚洲国产精彩中文乱码av | 波多野结衣在线观看一区二区三区 | 国产成人黄色 | 97成人在线免费视频 | 欧美 国产 视频 | 国产国产人免费人成免费视频 | 国产精品久久久久久久久岛 | 国产三级在线播放 | 欧美日韩中文另类 | 一区二区三区在线看 | 97韩国电影 | 狠狠色噜噜狠狠狠狠 | 天天干天天想 | 狠狠操精品 | 97在线免费观看视频 | 国产精品免费一区二区三区在线观看 | 国产色综合天天综合网 | 免费在线观看午夜视频 | 亚洲精品在线观看av | 国产成人精品一区二区三区福利 | 日韩v欧美v日本v亚洲v国产v | 日本久久中文 | 免费a视频在线观看 | 欧美网址在线观看 | 久久国产精品免费一区 | 亚洲欧美国内爽妇网 | 91亚·色| 福利一区视频 | 日韩在线免费不卡 | 黄色av一区二区 | 日韩欧美视频免费看 | 99超碰在线观看 | 视频一区二区在线 | 91在线视频观看 | 色婷婷国产精品 | 91系列在线 | 麻豆观看| 日产乱码一二三区别在线 | 99操视频 | 日日夜夜免费精品视频 | 美女国产在线 | 亚洲视频axxx| av成人在线电影 | 99热在线精品观看 | 99热国产精品 | 97人人爽人人 | 国产高清免费在线播放 | 免费看的国产视频网站 | 麻豆一精品传二传媒短视频 | 午夜精品久久久久久久99 | 亚洲久草视频 | 天天躁日日躁狠狠 | 国产亚洲一区 | 久草精品视频 | 国产一区在线观看视频 | 亚洲国产免费看 | 不卡的av在线播放 | 99视频久久 | 91私密视频| www狠狠操 | 日韩欧美在线观看一区 | 欧美日韩高清在线一区 | 国内综合精品午夜久久资源 | 中文字幕乱码一区二区 | 91最新在线| 超碰97人人在线 | 日韩精品一区二区在线观看视频 | 国产精品久久久久久久久久免费看 | 日日精品| 激情av资源| 色婷婷成人网 | 国产偷在线 | 国产色视频 | 丰满少妇一级 | 美女网站视频免费黄 | 激情av在线播放 | 精品在线观看免费 | 五月婷婷丁香色 | 午夜999| 日b视频国产 | 99精品热| 国产精品videossex国产高清 | 91麻豆精品国产91久久久无限制版 | 在线看国产日韩 | 免费日韩 精品中文字幕视频在线 | 欧美调教网站 | 菠萝菠萝在线精品视频 | 亚洲黄色片在线 | 综合色站导航 | 久久免费看a级毛毛片 | 日日夜夜精品视频天天综合网 | 看v片| 日本女人在线观看 | 久久久久久网站 | 国产999久久久 | 日本在线观看视频一区 | 久青草视频在线观看 | av电影 一区二区 | 一级特黄av | 亚洲人成在线观看 | 国产色拍| .国产精品成人自产拍在线观看6 | 国产91在线观看 | sesese图片 | 日韩精品专区在线影院重磅 | 欧美日韩一区久久 | 精品国产一区二区三区久久 | 国产一区黄色 | 精品美女在线视频 | 韩日电影在线免费看 | 有码中文字幕在线观看 | 黄色.com| 天天操天天爱天天干 | 国产精品久久久久久久久久久久午 | 欧美日韩伦理一区 | 亚洲精品成人 | 激情久久一区二区三区 | 亚洲视频,欧洲视频 | 久久99久久久久 | 成年人视频在线免费观看 | 国产亚洲人成网站在线观看 | 免费a v观看 | 欧美日韩国产精品一区二区三区 | 欧美性生交大片免网 | 一区 二区电影免费在线观看 | 日韩免费三区 | 久久久久久久久久久电影 | 亚洲精品一区二区三区在线观看 | 人人爽久久涩噜噜噜网站 | 免费观看9x视频网站在线观看 | 国产伦理久久精品久久久久_ | 亚洲午夜久久久久久久久电影网 | 国产精品日韩欧美一区二区 | 色婷婷电影网 | 米奇四色影视 | 4438全国亚洲精品观看视频 | 婷婷色在线观看 | 午夜黄色大片 | 99久久精品久久久久久动态片 | 亚洲天堂自拍视频 | 国产精品一区二区av影院萌芽 | 色婷婷九月 | 精品免费在线视频 | 97人人网| 亚洲成人高清在线 | 中文字幕国产精品 | 国产在线观看91 | 久久久在线免费观看 | www.黄色片网站 | 91丨九色丨勾搭 | 久久综合九色综合欧美狠狠 | 国产黄色在线看 | 一区二区精品视频 | 国产不卡网站 | 91精品国产成人 | 99国产在线视频 | 99精品视频一区 | 国产精品国产自产拍高清av | 亚洲天堂精品 | 色资源网在线观看 | 日韩高清精品免费观看 | 亚洲爽爽网 | 免费一级片在线观看 | 亚洲日本中文字幕在线观看 | 国产一区视频免费在线观看 | 久久国产福利 | 精品国产亚洲一区二区麻豆 | 亚洲视频精品在线 | 亚洲a网 | 日韩最新理论电影 | 国产二区视频在线观看 | www.黄色在线 | 久久久蜜桃| 91视频在线国产 | 成人在线免费av | 四虎影视国产精品免费久久 | 亚洲国产视频在线 | 精品伦理一区二区三区 | 国产在线视频一区二区三区 | 国产精品9999久久久久仙踪林 | 91超碰免费在线 | 天天色天天草天天射 | 99精品成人 | 五月综合婷 | 国产1区2区 | 免费黄色在线播放 | 日韩在线免费小视频 | 日韩精品首页 | 日韩欧美视频 | 天天干天天色2020 | 99久久婷婷国产一区二区三区 | 欧美极品在线播放 | 国产高清av在线播放 | 亚洲黄色一级大片 | av成人在线观看 | 精品久久亚洲 | 国产日韩在线播放 | 日本公乱妇视频 | 精品国产成人av | 日本高清免费中文字幕 | 夜又临在线观看 | 人人狠狠综合久久亚洲婷 | 激情丁香 | 色播亚洲婷婷 | 精品一区二区日韩 | 日韩aa视频| 在线精品视频在线观看高清 | 一区二区三区免费在线 | av手机版 | 亚洲午夜精品在线观看 | 国产美女免费观看 | 亚洲伦理一区二区 | 久久97久久 | 综合影视| 成片免费 | 丰满少妇在线观看资源站 | 超碰人人国产 | 国产精品成人一区二区 | 国产精品自产拍在线观看中文 | 国产精品欧美久久久久天天影视 | 伊人干综合| 久草精品在线播放 | 成人av片免费观看app下载 | 久久午夜国产 | 日韩午夜电影 | 免费欧美高清视频 | 亚洲视频免费在线观看 | 中文字幕资源站 | 久久这里有精品 | 99精品视频在线播放观看 | 十八岁以下禁止观看的1000个网站 | 色资源在线 | 日韩欧美一区二区在线播放 | 天天天天天天干 | 久草视频在线新免费 | 五月丁色 | 99久高清在线观看视频99精品热在线观看视频 | 成人黄色在线视频 | 亚洲国产日韩欧美 | 9i看片成人免费看片 | 一区二区视频在线免费观看 | 国产成人一区二区三区久久精品 | 免费网站在线观看成人 | 九九九毛片 | 久久综合九色 | 人人爽人人插 | 五月婷婷综 | 在线观看久久久久久 | 国产视频不卡 | 国产精品久久久久久久久大全 | 精品国产乱码久久久久久三级人 | 九九热视频在线播放 | 国产精品v欧美精品v日韩 | 免费色网站 | 亚洲黄色免费电影 | 深夜精品福利 | 日韩精品专区 | 少妇自拍av | 午夜精品久久久久久99热明星 | 欧美性生活免费看 | 免费在线国产精品 | 国产精品mm | 久久色视频 | 久久婷亚洲五月一区天天躁 | 亚洲婷婷在线视频 | 亚洲国产福利视频 | 国产破处视频在线播放 | 不卡电影免费在线播放一区 | av天天干 | 中文字幕资源在线 | 91亚洲国产成人 | 久久久久久国产精品 | 99在线热播精品免费99热 | www.天天操 | 日本69hd| 丁香高清视频在线看看 | 97久久精品午夜一区二区 | 少妇bbbb搡bbbb桶 | 在线观看一级片 | 国产精品中文字幕在线播放 | 欧美激情视频一区二区三区 | 九色精品免费永久在线 | 人人干,人人爽 | 欧美伦理一区 | 欧美少妇18p | 免费看的国产视频网站 | 国产麻豆传媒 | 在线国产日韩 | 国产精彩视频一区二区 | 亚洲成aⅴ人在线观看 | 免费在线精品视频 | 久久黄色免费观看 | 久久久久久国产精品亚洲78 | 99热这里只有精品国产首页 | 四虎5151久久欧美毛片 | 91视频三区| 免费a视频| 午夜视频99| 日韩欧美在线一区二区 | 国产成人精品电影久久久 | 91九色自拍 | 成人在线观看免费 | 国产成人精品一区二区三区福利 | 五月天色婷婷丁香 | 国产91综合一区在线观看 | 亚洲一级片在线观看 | 激情深爱五月 | 欧美少妇bbwhd | 日韩av片无码一区二区不卡电影 | 久久艹艹 | 日韩精品久久久免费观看夜色 | 国产欧美精品xxxx另类 | 91热爆在线观看 | 四虎影视成人永久免费观看视频 | 808电影| 美女精品久久久 | av免费观看高清 | 精品1区2区 | 久艹视频在线观看 | 久久久五月天 | 欧美夫妻性生活电影 | 日韩av免费观看网站 | 在线成人中文字幕 | 91av短视频| 欧美日韩性视频在线 | 91亚洲精品久久久蜜桃 | 日韩欧美大片免费观看 | 色播五月激情综合网 | 久久 在线 | 一区二区不卡在线观看 | 天天久久夜夜 | 999在线视频| 天天操夜夜操国产精品 | 久久久久久久久久久久久9999 | 久久国产精品第一页 | 亚洲国产精品久久久 | 欧美久久久久久久久久久 | 91经典在线 | 97av免费视频 | 中文在线资源 | 国产成人亚洲在线电影 | 国产日韩精品一区二区在线观看播放 | 精品国产一区二区三区久久 | 亚洲国产中文在线观看 | 国产精品成人一区二区三区 | 久久伊人五月天 | 国产精品一区专区欧美日韩 | 欧美视频在线二区 | 亚洲一区二区黄色 | 天天干天天插伊人网 | 国产最顶级的黄色片在线免费观看 | 韩日电影在线观看 | 亚洲黄色免费网站 | 欧美一级性生活视频 | 精品国产乱码久久久久 | av成人免费网站 | 一区二区激情 | 9久久精品| 欧美 日韩 久久 | 国产美女被啪进深处喷白浆视频 | 91传媒视频在线观看 | 九九电影在线 | 超碰在线观看97 | 黄色av成人在线 | 欧美日韩免费网站 | 免费色网| www.久久久.com | 精品久久久一区二区 | 黄色高清视频在线观看 | 久久国产热 | 人人澡人人草 | 日本高清免费中文字幕 | 国产视频亚洲精品 | 国产a精品| 国产精品亚洲人在线观看 | 国产精品www | 欧美日韩高清一区二区 | 精品久久久久一区二区国产 | 在线免费色 | 国产精品一区二区三区四区在线观看 | 中文字幕欧美日韩va免费视频 | 久草在线播放视频 | 国产大尺度视频 | 久久九九国产视频 | 国产精品乱码高清在线看 | 国产成人区 | 国产精品久久久 | 日韩精品一区二区三区在线播放 | 91福利社在线观看 | 色黄www小说 | 中文字幕a在线 | av久久久 | 九九欧美 | 久久久婷| 欧美亚洲国产一卡 | 国产香蕉视频在线观看 | 一区二区三区 中文字幕 | 日韩精品中文字幕有码 | 国产98色在线 | 日韩 | 成人午夜精品福利免费 | 亚洲一区在线看 | 天天操狠狠操 | 中文字幕在线观看日本 | 久久一区二区三区超碰国产精品 | 久久免费看毛片 | 99久久精品午夜一区二区小说 | a黄色片在线观看 | 欧美一区日韩一区 | 亚洲国产精品成人精品 | 日日爽天天操 | 黄色精品网站 | 国产亚洲精品综合一区91 | 超级碰碰免费视频 | 久久久99精品免费观看乱色 | 在线观看免费91 | 日韩精品一区二区久久 | 91丨九色丨高潮 | 色婷婷天天干 | 99久久精品久久久久久动态片 | 久久99最新地址 | 中文字幕在 | 国产一区在线免费观看视频 | 久久高清免费 | 黄色av三级在线 | 久99久精品| 黄色网址a | 久久综合视频网 | 激情视频综合网 | 久久只精品99品免费久23小说 | 亚洲国产视频a | 探花视频在线版播放免费观看 | 色无五月 | 国产精品久久久久国产精品日日 | 99夜色 | 综合色影院 | 午夜免费在线观看 | 国产精品亚洲片夜色在线 | 午夜av免费在线观看 | 久草免费在线观看 | 丁香久久久 | 久草在线欧美 | 中文字幕电影一区 | 久久久国产一区二区三区四区小说 | 亚洲一级片免费观看 | 日韩欧美一二三 | 一区二区三区四区久久 | 亚洲精品视频免费看 | 日韩在线一区二区免费 | 免费的黄色av | 97免费中文视频在线观看 | 欧洲亚洲精品 | 日韩美视频 | 男女激情网址 | 欧美黑人性爽 | 97超碰免费在线 | 亚洲一级片在线看 | 亚洲精品视频二区 | 精品视频在线播放 | 在线观看视频亚洲 | 在线免费观看黄色大片 | 日韩欧美成人网 | 亚洲视频 在线观看 | 亚洲精品黄色片 | 天天操天天操一操 | av在线一二三区 | 丁香综合五月 | 97视频在线观看成人 | 在线观看中文字幕 | 91成人欧美| 国产欧美精品在线观看 | 日韩一区二区三区在线观看 | 欧美激情精品久久久久久 | 色av男人的天堂免费在线 | 91亚洲视频在线观看 | 亚洲精品婷婷 | 免费毛片一区二区三区久久久 | 麻豆av一区二区三区在线观看 | 成人视屏免费看 | h视频日本| 波多野结衣在线中文字幕 | 97视频免费在线观看 | 四虎永久免费网站 | 国产免费黄色 | 在线一区观看 | 97视频总站| 人人搞人人爽 | 五月开心色 | 人人网av | 69国产精品成人在线播放 | 国产一区二区视频在线 | 国内综合精品午夜久久资源 | 99re久久资源最新地址 | 久久久久久久久久久影视 | 精品国产aⅴ麻豆 | 丁香六月五月婷婷 | 国产亚洲成av人片在线观看桃 | 国产精品一区二区在线免费观看 | 国模一区二区三区四区 | 97色婷婷人人爽人人 | 91久久精品日日躁夜夜躁国产 | 亚洲精品成人网 | 久久综合婷婷综合 | av专区在线 | 国产亚洲在线观看 | 九九久久精品视频 | 综合网成人| 精品免费在线视频 | 天天操夜夜拍 | 亚洲精区二区三区四区麻豆 | 四川妇女搡bbbb搡bbbb搡 | 国内久久精品 | 超碰免费久久 | 婷婷六月天在线 | 日韩欧美国产激情在线播放 | 天天在线视频色 | 国内精品美女在线观看 | 97在线观看免费高清完整版在线观看 | 亚洲欧美国产日韩在线观看 | 国产高清不卡在线 | 亚洲影视九九影院在线观看 | 婷婷亚洲综合五月天小说 | 久久久久久毛片精品免费不卡 | 一区二区三区免费在线观看视频 | 91福利社在线观看 | 91少妇精拍在线播放 | 人人玩人人添人人 | 国产三级av在线 | 91精选在线 | 99视频网站 | 国产无遮挡又黄又爽在线观看 | 99热最新在线 | 操碰av| 手机在线看片日韩 | 在线播放 日韩专区 | 色视频在线看 | 在线播放一区二区三区 | 91丨九色丨丝袜 | 国产成人精品一区二区三区福利 | 91爱爱中文字幕 | 亚洲 欧美 91 | sesese图片| 视频一区亚洲 | 五月激情丁香 | 丁香六月婷婷激情 | 天天摸天天干天天操天天射 | 91视频在线观看免费 | 首页中文字幕 | 国产资源在线免费观看 | 日韩精品视频第一页 | 深爱激情综合 | 九九热精品视频在线观看 | 在线观看网站黄 | 亚洲精品动漫成人3d无尽在线 | 国产成人av片| 国产精品一区二区三区电影 | 欧美在线视频第一页 | 日韩欧美高清不卡 | 亚洲精品在线网站 | 天堂久久电影网 | 中文字幕 在线看 | 女女av在线 | 亚洲欧洲一级 | 国产精品久久久久久久久岛 | 成人aaa毛片| 欧美小视频在线 | 久久av网址| 欧美性色网站 | 久久理论片 | 国产一线在线 | 综合色狠狠 | 国产第页 | 国产一区精品在线 | 午夜美女网站 | 91在线www | 九色激情网 | 国产精品嫩草在线 | 成人在线电影观看 | 日韩网站在线免费观看 | 在线亚洲播放 | 亚洲人成网站精品片在线观看 | 久久五月情影视 | 亚洲欧美精品一区二区 | 精品国产欧美一区二区三区不卡 | 美女视频黄免费的 | 日韩午夜电影院 | 99久久久久久久久久 | 亚洲中字幕 | 国产精品成人a免费观看 | 狠狠狠狠狠狠狠狠干 | 91精品国产一区 | 99视频99| 久草免费电影 | 久章草在线 | 天天操天 | 99视频在线看 | 免费aa大片 | 久久久高清一区二区三区 | 成人资源在线观看 | 亚洲成人在线免费 | 久久综合九色 | 国产99久| 国产免费视频在线 | 中文字幕在线国产 | 久久综合精品一区 | 夜夜操网 | 欧美色图视频一区 | 久久精品国产第一区二区三区 | 99高清视频有精品视频 | 国产精品久久久久久一二三四五 | 亚洲视频免费在线看 | 91x色 | 国产日本亚洲高清 | 国产黄色精品在线 | 久久久久国产精品午夜一区 | 久久99精品久久久久久三级 | 日韩一级片网址 | 国偷自产视频一区二区久 | 国内精品99| 国产不卡视频在线播放 | 精品久久久久久亚洲综合网 | 99精品久久久久 | 欧美激情精品久久久久久免费 | 久久久免费在线观看 | 五月婷婷激情六月 | 在线中文字母电影观看 | 欧美国产在线看 | 天天爱综合 | 国产精品国内免费一区二区三区 | 国产精品久久久久久久久久久久久久 | 91久久精品日日躁夜夜躁国产 | 一区二区三高清 | 在线观看av网 | 日韩一区二区三区高清免费看看 | 免费看网站在线 | 精品日韩在线 | 国产在线精品播放 | 99热亚洲精品| 精品国产一区二区三区四区vr | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 狠狠色香婷婷久久亚洲精品 | 色狠狠综合天天综合综合 | 天堂av在线中文在线 | 毛片网站免费在线观看 | 国产免费久久久久 | 97在线精品 | 亚洲乱码中文字幕综合 | 国产最新视频在线观看 | 97av超碰| 日本中文字幕电影在线免费观看 | 亚洲第一区在线播放 | 91亚洲狠狠婷婷综合久久久 | 国产精品99视频 | 免费成人黄色av | 天天色天天综合 | 午夜婷婷综合 | 91精品一区二区三区久久久久久 | 成人av高清在线观看 | 色婷婷亚洲综合 | 国产涩涩网站 | 97电影手机版 | 久久99精品久久久久婷婷 | 国产xxxx | 91精品国产麻豆国产自产影视 | 天天搞天天干 | 欧美做受高潮1 | 最新色视频 | 五月丁香 | 99久久99久国产黄毛片 | 中文字幕一区二区三区乱码在线 | av一区在线 | 久久久久国产精品一区二区 | 国产成人一区二区三区久久精品 | 成人午夜电影在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 免费手机黄色网址 | 丁香五月缴情综合网 | 日韩中文三级 |