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

Java中的JVM字符串性能優化

開發 開發工具
String 對象是我們使用很頻繁的一個對象類型,但它的性能問題卻是很容易被忽略的。String 對象作為 Java 語言中重要的數據類型,是內存中占據空間較大的一個對象。高效地使用字符串,可以提升系統的整體性能。

 一、引言

String 對象是我們使用很頻繁的一個對象類型,但它的性能問題卻是很容易被忽略的。String 對象作為 Java 語言中重要的數據類型,是內存中占據空間較大的一個對象。高效地使用字符串,可以提升系統的整體性能。

[[285816]]

二、String 對象的實現

在 Java 語言中,Sun 公司的工程師們對 String 對象做了大量的優化,來節約內存空間,提升 String 對象在系統中的性能。

1. 在 Java6 以及之前的版本中,String 對象是對 char 數組進行了封裝實現的對象,主要有四個成員變量:char 數組、偏移量 offset、字符數量 count、哈希值 hash。String 對象是通過 offset 和 count 兩個屬性來定位 char[] 數組,獲取字符串。這么做可以高效、快速地共享數組對象,同時節省內存空間,但這種方式很有可能會導致內存泄漏。

2. 從 Java7 版本開始到 Java8 版本,Java 對 String 類做了一些改變。String 類中不再有 offset 和 count 兩個變量了。這樣的好處是 String 對象占用的內存稍微少了些,同時,String.substring 方法也不再共享 char[],從而解決了使用該方法可能導致的內存泄漏問題。

3. 從 Java9 版本開始,工程師將 char[] 字段改為了 byte[] 字段,又維護了一個新的屬性 coder,它是一個編碼格式的標識。

工程師為什么這樣修改呢?

我們知道一個 char 字符占 16 位,2 個字節。這個情況下,存儲單字節編碼內的字符(占一個字節的字符)就顯得非常浪費。JDK1.9 的 String 類為了節約內存空間,于是使用了占 8 位,1 個字節的 byte 數組來存放字符串。

而新屬性 coder 的作用是,在計算字符串長度或者使用 indexOf()函數時,我們需要根據這個字段,判斷如何計算字符串長度。coder 屬性默認有 0 和 1 兩個值,0 代表 Latin-1(單字節編碼),1 代表 UTF-16。如果 String 判斷字符串只包含了 Latin-1,則 coder 屬性值為 0,反之則為 1。

三、String 對象的不可變性起因

了解了 String 對象的實現后,你有沒有發現在實現代碼中 String 類被 final 關鍵字修飾了,而且變量 char 數組也被 final 修飾了。

我們知道類被 final 修飾代表該類不可繼承,而 char[] 被 final+private 修飾,代表了 String 對象不可被更改。Java 實現的這個特性叫作 String 對象的不可變性,即 String 對象一旦創建成功,就不能再對它進行改變。

四、String 對象的不可變性好處

1.保證 String 對象的安全性。假設 String 對象是可變的,那么 String 對象將可能被惡意修改。

2.保證 hash 屬性值不會頻繁變更,確保了唯一性,使得類似 HashMap 容器才能實現相應的 key-value 緩存功能。

3.可以實現字符串常量池。在 Java 中,通常有兩種創建字符串對象的方式,一種是通過字符串常量的方式創建,如 String str=“abc”;另一種是字符串變量通過 new 形式的創建,如 String str = new String(“abc”)。

當代碼中使用第一種方式創建字符串對象時,JVM 首先會檢查該對象是否在字符串常量池中,如果在,就返回該對象引用,否則新的字符串將在常量池中被創建。這種方式可以減少同一個值的字符串對象的重復創建,節約內存。

String str = new String(“abc”) 這種方式,首先在編譯類文件時,“abc”常量字符串將會放入到常量結構中,在類加載時,“abc”將會在常量池中創建;其次,在調用 new 時,JVM 命令將會調用 String 的構造函數,同時引用常量池中的“abc” 字符串,在堆內存中創建一個 String 對象;最后,str 將引用 String 對象。

五、String 對象的優化

1. 如何構建超大字符串?

編程過程中,字符串的拼接很常見。前面我講過 String 對象是不可變的,如果我們使用 String 對象相加,拼接我們想要的字符串,是不是就會產生多個對象呢?例如以下代碼:

 

  1. String str= "ab" + "cd" + "ef"

分析代碼可知:首先會生成 ab 對象,再生成 abcd 對象,最后生成 abcdef 對象,從理論上來說,這段代碼是低效的。

但實際運行中,我們發現只有一個對象生成,這是為什么呢?難道我們的理論判斷錯了?我們再來看編譯后的代碼,你會發現編譯器自動優化了這行代碼,如下:

 

  1. String str= "abcdef"

上面介紹的是字符串常量的累計,再來看看字符串變量的累計又是怎樣的呢?

 

  1. String str = "abcdef"
  2.  
  3. for(int i=0; i<1000; i++) { 
  4.  
  5. str = str + i; 
  6.  

 

上面的代碼編譯后,你可以看到編譯器同樣對這段代碼進行了優化。不難發現,Java 在進行字符串的拼接時,偏向使用 StringBuilder,這樣可以提高程序的效率。

 

  1. String str = "abcdef"
  2.  
  3. for(int i=0; i<1000; i++) { 
  4.  
  5. str = (new StringBuilder(String.valueOf(str))).append(i).toString(); 
  6.  

 

綜上已知:即使使用 + 號作為字符串的拼接,也一樣可以被編譯器優化成 StringBuilder 的方式。但再細致些,你會發現在編譯器優化的代碼中,每次循環都會生成一個新的 StringBuilder 實例,同樣也會降低系統的性能。

所以平時做字符串拼接的時候,我建議你還是要顯示地使用 String Builder 來提升系統性能。

如果在多線程編程中,String 對象的拼接涉及到線程安全,你可以使用 StringBuffer。但是要注意,由于 StringBuffer 是線程安全的,涉及到鎖競爭,所以從性能上來說,要比 StringBuilder 差一些。

2. 如何使用 String.intern 節省內存?

講完了構建字符串,我們再來討論下 String 對象的存儲問題。先看一個案例。

Twitter 每次發布消息狀態的時候,都會產生一個地址信息,以當時 Twitter 用戶的規模預估,服務器需要 32G 的內存來存儲地址信息。

 

  1. public class Location { 
  2.  
  3. private String city; 
  4.  
  5. private String region; 
  6.  
  7. private String countryCode; 
  8.  
  9. private double longitude; 
  10.  
  11. private double latitude; 
  12.  

 

考慮到其中有很多用戶在地址信息上是有重合的,比如,國家、省份、城市等,這時就可以將這部分信息單獨列出一個類,以減少重復,代碼如下:

 

  1. public class SharedLocation { 
  2.  
  3. private String city; 
  4.  
  5. private String region; 
  6.  
  7. private String countryCode; 
  8.  
  9.  
  10. public class Location { 
  11.  
  12. private SharedLocation sharedLocation; 
  13.  
  14. double longitude; 
  15.  
  16. double latitude; 
  17.  

 

通過優化,數據存儲大小減到了 20G 左右。但對于內存存儲這個數據來說,依然很大,怎么辦呢?

這個案例來自一位 Twitter 工程師在 QCon 全球軟件開發大會上的演講,他們想到的解決方法,就是使用 String.intern 來節省內存空間,從而優化 String 對象的存儲。

具體做法就是,在每次賦值的時候使用 String 的 intern 方法,如果常量池中有相同值,就會重復使用該對象,返回對象引用,這樣一開始的對象就可以被回收掉。這種方式可以使重復性非常高的地址信息存儲大小從 20G 降到幾百兆。

 

  1. SharedLocation sharedLocation = new SharedLocation(); 
  2.  
  3. sharedLocation.setCity(messageInfo.getCity().intern()); sharedLocation.setCountryCode(messageInfo.getRegion().intern()); 
  4.  
  5. sharedLocation.setRegion(messageInfo.getCountryCode().intern()); 
  6.  
  7. Location location = new Location(); 
  8.  
  9. location.set(sharedLocation); 
  10.  
  11. location.set(messageInfo.getLongitude()); 
  12.  
  13. location.set(messageInfo.getLatitude()); 

 

為了更好地理解,我們再來通過一個簡單的例子,回顧下其中的原理:

 

  1. String a =new String("abc").intern(); 
  2.  
  3. String b = new String("abc").intern(); 
  4.  
  5. if(a==b) { 
  6.  
  7. System.out.print("a==b"); 
  8.  

 

輸出結果:

 

  1. a==b 

在字符串常量中,默認會將對象放入常量池;在字符串變量中,對象是會創建在堆內存中,同時也會在常量池中創建一個字符串對象,復制到堆內存對象中,并返回堆內存對象引用。

如果調用 intern 方法,會去查看字符串常量池中是否有等于該對象的字符串的引用,如果沒有,在 JDK1.6 版本中會復制堆中的字符串到常量池中,并返回該字符串引用,堆內存中原有的字符串由于沒有引用指向它,將會通過垃圾回收器回收。

在 JDK1.7 版本以后,由于常量池已經合并到了堆中,所以不會再復制具體字符串了,只是會把首次遇到的字符串的引用添加到常量池中;如果有,就返回常量池中的字符串引用。

了解了原理,我們再一起看下上邊的例子。

在一開始字符串“abc”會在加載類時,在常量池中創建一個字符串對象。

創建 a 變量時,調用 new String() 會在堆內存中創建一個 String 對象,String 對象中的 char 數組將會引用常量池中字符串。在調用 intern 方法之后,會去常量池中查找是否有等于該字符串對象的引用,有就返回引用。

創建 b 變量時,調用 new String() 會在堆內存中創建一個 String 對象,String 對象中的 char 數組將會引用常量池中字符串。在調用 intern 方法之后,會去常量池中查找是否有等于該字符串對象的引用,有就返回引用。

而在堆內存中的兩個對象,由于沒有引用指向它,將會被垃圾回收。所以 a 和 b 引用的是同一個對象。

如果在運行時,創建字符串對象,將會直接在堆內存中創建,不會在常量池中創建。所以動態創建的字符串對象,調用 intern 方法,在 JDK1.6 版本中會去常量池中創建運行時常量以及返回字符串引用,在 JDK1.7 版本之后,會將堆中的字符串常量的引用放入到常量池中,當其他堆中的字符串對象通過 intern 方法獲取字符串對象引用時,則會去常量池中判斷是否有相同值的字符串的引用,此時有,則返回該常量池中字符串引用,跟之前的字符串指向同一地址的字符串對象。

以一張圖來總結 String 字符串的創建分配內存地址情況:

使用 intern 方法需要注意的一點是,一定要結合實際場景。因為常量池的實現是類似于一個 HashTable 的實現方式,HashTable 存儲的數據越大,遍歷的時間復雜度就會增加。如果數據過大,會增加整個字符串常量池的負擔。

3. 如何使用字符串的分割方法?

Split() 方法使用了正則表達式實現了其強大的分割功能,而正則表達式的性能是非常不穩定的,使用不恰當會引起回溯問題,很可能導致 CPU 居高不下。

所以我們應該慎重使用 Split() 方法,我們可以用 String.indexOf() 方法代替 Split() 方法完成字符串的分割。如果實在無法滿足需求,你就在使用 Split() 方法時,對回溯問題加以重視就可以了。

六、總結

我們認識到做好 String 字符串性能優化,可以提高系統的整體性能。在這個理論基礎上,Java 版本在迭代中通過不斷地更改成員變量,節約內存空間,對 String 對象進行優化。

我們還特別提到了 String 對象的不可變性,正是這個特性實現了字符串常量池,通過減少同一個值的字符串對象的重復創建,進一步節約內存。

但也是因為這個特性,我們在做長字符串拼接時,需要顯示使用 StringBuilder,以提高字符串的拼接性能。最后,在優化方面,我們還可以使用 intern 方法,讓變量字符串對象重復使用常量池中相同值的對象,進而節約內存。

最后再分享一個個人觀點。那就是千里之堤,潰于蟻穴。日常編程中,我們往往可能就是對一個小小的字符串了解不夠深入,使用不夠恰當,從而引發線上事故。

比如,在我之前的工作經歷中,就曾因為使用正則表達式對字符串進行匹配,導致并發瓶頸,這里也可以將其歸納為字符串使用的性能問題。

【本文是51CTO專欄機構“AiChinaTech”的原創文章,微信公眾號( id: tech-AI)”】

 

戳這里,看該作者更多好文

 

責任編輯:華軒 來源: 51CTO
相關推薦

2024-01-03 08:20:05

Java字符串性能

2013-06-24 15:16:29

Java字符串拼接

2025-03-27 03:20:00

C#開發字符串

2022-05-18 10:56:58

Java字符串編碼

2011-06-08 15:45:41

字符串JAVA

2013-10-16 10:45:29

JVMJava

2009-09-02 16:21:20

C#字符串

2025-01-03 08:31:43

2009-08-21 15:06:09

C#連接字符串

2024-03-05 18:29:54

JavaString字符串

2010-06-28 15:18:51

SQL Server

2010-03-18 08:59:29

JVM字符串JVM常量池

2011-06-22 10:45:19

JAVA

2021-03-08 08:23:24

Java字符串截取

2015-08-14 09:37:44

Java字符串基本運算

2011-07-11 16:00:22

字符串拼接

2009-02-24 15:39:27

字符串比較函數函數

2025-06-30 02:11:00

2021-09-07 09:23:07

C++字符串算法

2020-09-03 10:13:49

JavaScript字符串pad
點贊
收藏

51CTO技術棧公眾號

欧美一级一级性生活免费录像| 国产一区二区在线免费观看| 亚洲摸下面视频| 91视频免费版污| 欧美一区二区三区在线观看免费| 久久91精品国产91久久小草| 欧美黑人视频一区| a级片在线观看| 亚洲精品aa| 亚洲福利一区二区三区| 日韩亚洲一区在线播放| 国产浮力第一页| 亚洲免费在线| 成年人精品视频| av无码av天天av天天爽| 日韩成人在线电影| 精品久久久久久久久中文字幕 | 奇米影视第四色777| 国产成人久久| 精品日本一线二线三线不卡| 久久久久国产精品熟女影院| 日本h片在线| 中文字幕欧美三区| 国产精品区一区| 亚洲天堂手机在线| 国产日韩欧美三区| 另类色图亚洲色图| 一级黄色片网址| 国产极品模特精品一二| 欧美日韩一区视频| 91传媒久久久| 欧美高清另类hdvideosexjaⅴ| 国产偷国产偷精品高清尤物| 动漫一区二区在线| 97在线播放免费观看| 久久国产欧美| 国模精品一区二区三区色天香| 青青草华人在线视频| 色88888久久久久久影院| 欧美一级精品在线| 午夜久久久精品| 韩国成人动漫| 精品国产乱码久久久久久虫虫漫画| 99热一区二区三区| 在线毛片网站| 国产精品午夜在线| 欧美日韩最好看的视频| 无码国产色欲xxxx视频| 国产福利精品导航| 亚洲综合中文字幕在线观看| 曰批又黄又爽免费视频| 午夜亚洲一区| 97超级碰在线看视频免费在线看 | 色综合天天综合狠狠| 老子影院午夜伦不卡大全| a级影片在线观看| √…a在线天堂一区| 在线一区高清| 麻豆传媒在线完整视频| 中文字幕一区av| 亚洲精品二区| 香港伦理在线| 亚洲欧洲一区二区在线播放| 亚洲精品中文字幕在线| 成人免费高清在线播放| 久久品道一品道久久精品| 久久久水蜜桃| 黄色在线播放| 中文字幕乱码久久午夜不卡 | 亚洲激情在线| 91精品国产色综合| 欧美国产成人精品一区二区三区| 亚洲欧美日韩国产一区| 91av在线影院| 日日夜夜狠狠操| 日韩二区三区四区| 国产精品高潮呻吟久久av无限| 无码久久精品国产亚洲av影片| 日本美女视频一区二区| 国产精品99久久久久久www| 久久这里只有精品9| 另类的小说在线视频另类成人小视频在线| 国产欧美精品在线播放| 国产探花精品一区二区| 丁香一区二区三区| 久久久一本精品99久久精品66| 男人的天堂av高清在线| 亚洲国产电影在线观看| 亚洲黄色网址在线观看| 波多野结衣乳巨码无在线观看| 精品国产1区2区| 成人性生生活性生交12| 国产精区一区二区| 日韩av在线网页| 亚洲av熟女国产一区二区性色| 97精品视频| 久久久久久成人| 国产精品熟女视频| 国产精品资源在线观看| 久久99蜜桃综合影院免费观看| 粉嫩av一区| 亚洲最大成人网4388xx| 日本精品久久久久中文字幕| 国产va免费精品观看精品| 亚洲国产99精品国自产| 天天操天天舔天天射| 欧美日韩一视频区二区| 国产成人av在线| 亚洲av无码乱码国产麻豆| 久久久国产精品麻豆| 91制片厂免费观看| 韩日成人影院| 欧美成人艳星乳罩| 欧美丰满美乳xxⅹ高潮www| 中文字幕一区二区三区欧美日韩 | 亚洲天堂男人av| 国产福利一区二区三区视频| 午夜免费电影一区在线观看| av在线最新| 日韩一区二区三区精品视频| 成人在线一级片| 亚洲精品123区| 成人福利网站在线观看| 久草福利在线视频| 亚洲成在线观看| 99九九99九九九99九他书对| 丝袜美腿综合| 欧美黑人巨大精品一区二区| 国产又粗又猛又爽又黄91| 久久久久国产一区二区三区四区 | 久久精品亚洲| 成人精品一二区| 日本中文字幕在线视频| 欧洲精品在线观看| 美国黄色a级片| 亚洲高清自拍| www.一区二区三区| 激情成人四房播| 欧美日韩高清在线| 亚洲精品国产熟女久久久| 在线视频精品| 国产视色精品亚洲一区二区| 欧美大胆的人体xxxx| 91精品国产综合久久福利| 成人午夜免费影院| 免费亚洲电影在线| 日韩一区免费观看| 日韩精品影院| 国产亚洲精品美女| 91porny九色| 国产亚洲精品bt天堂精选| 1024av视频| 亚洲老女人视频免费| 97成人精品视频在线观看| 黄色成人一级片| 亚洲午夜精品久久久久久久久| xxxx国产视频| 欧美日韩理论| ts人妖另类在线| av中文字幕在线观看第一页| 亚洲国产精品va在线看黑人| 日产亚洲一区二区三区| 丁香天五香天堂综合| 国产av熟女一区二区三区| 成人高潮视频| 91sao在线观看国产| 视频在线不卡| 91久久精品日日躁夜夜躁欧美| jizz中文字幕| 黄网站免费久久| 男人日女人的bb| 给我免费播放日韩视频| 97在线视频免费| 暖暖视频在线免费观看| 欧美在线免费播放| 亚洲一区电影在线观看| 国产精品夜夜嗨| 欧美大片在线播放| 久久av免费看| 国产男人精品视频| 秋霞在线午夜| 亚洲欧美在线第一页| 波多野结衣不卡| 中文字幕人成不卡一区| 久草免费资源站| 乱码第一页成人| 手机福利在线视频| 极品束缚调教一区二区网站 | 久久综合久久综合久久| 日本va中文字幕| 1024精品久久久久久久久| 成人免费视频网站入口| 三上悠亚国产精品一区二区三区| 精品国模在线视频| 蜜臀久久精品久久久久| 欧美性色欧美a在线播放| 三级影片在线看| 91蜜桃网址入口| 亚洲第一天堂久久| 一本色道久久综合亚洲精品不| 视频一区亚洲| 国产精品对白| 国产精品久久久久久久久久久不卡 | 亚洲成人久久电影| 中文字幕 亚洲视频| 亚洲在线一区二区三区| 免费看黄色三级| 高清久久久久久| 一区二区三区 日韩| 在线亚洲精品| 成人一区二区av| 精品久久久久久久久久久aⅴ| 69堂成人精品视频免费| 日韩免费va| 97国产一区二区精品久久呦| 久久99精品久久久久久野外| 亚洲精品中文字幕女同| 精品国产一级片| 欧美午夜片在线看| 日本在线视频免费| 一区二区三区欧美久久| 1024手机在线观看你懂的| 成人国产精品视频| 激情文学亚洲色图| 久久久夜精品| 青青草精品视频在线| 亚洲一区欧美| 一本一本a久久| 国产探花在线精品一区二区| 国产一区二区在线观看免费播放| 国产精品一区二区三区av| 国产精品热视频| 唐人社导航福利精品| 欧美激情在线视频二区| 好操啊在线观看免费视频| 在线不卡国产精品| 久久精品a一级国产免视看成人| 精品国产免费一区二区三区四区 | 夜夜春亚洲嫩草影视日日摸夜夜添夜| 免费福利视频一区| 国产91视觉| 一区二区三区四区精品视频| 亚洲最大福利视频网站| 亚州欧美在线| 成人黄色免费看| 久久久久久久性潮| 国产精品久久久久久婷婷天堂| 欧美日韩不卡| 国产精品免费观看在线| 日韩一区二区三区在线免费观看 | 在线日韩第一页| 国产在线网站| 在线a欧美视频| 麻豆网站视频在线观看| 久久成人精品电影| 国产色在线观看| 色综合天天狠天天透天天伊人| 七七成人影院| 5252色成人免费视频| videos性欧美另类高清| 日韩av电影院| 久久亚洲国产精品尤物| 国产日韩欧美在线播放| 日日夜夜亚洲| 成人在线观看av| 日韩精品免费一区二区夜夜嗨 | 五月天一区二区三区| 91精品国产乱码在线观看| 欧美午夜精品久久久久久浪潮| 日韩欧美在线观看免费| 91精品国产91久久| 日韩免费av网站| 欧美午夜精品理论片a级按摩| 羞羞色院91蜜桃| 91精品国产手机| 欧性猛交ⅹxxx乱大交| 亚洲黄色av女优在线观看| 日韩精品123| 中文字幕视频在线免费欧美日韩综合在线看 | 最近中文字幕免费观看| 91高清视频免费看| 国产视频在线观看免费| 日韩欧美国产综合在线一区二区三区 | 欧美1区2区视频| av动漫在线播放| 亚洲福利精品| 奇米影音第四色| 国产精品一区二区黑丝| 中文字幕第3页| 欧美国产日韩亚洲一区| 午夜国产福利视频| 艳妇臀荡乳欲伦亚洲一区| 久久精品无码av| 欧美日韩国产电影| 丁香六月色婷婷| 尤物九九久久国产精品的特点| 久草免费在线| 欧美精品成人91久久久久久久| av有声小说一区二区三区| 国产一区二区在线免费视频| 亚洲精品a区| 视频一区二区三区在线观看 | 国产成人精品免费| 欧美夫妇交换xxx| 久久免费视频色| 亚洲一二三在线观看| 亚洲成人动漫在线观看| 亚洲一区二区视频在线播放| 精品精品欲导航| yiren22亚洲综合伊人22| 欧美激情伊人电影| 91综合国产| 国产伦精品一区二区三区照片91| 久久网站免费观看| xxxx18hd亚洲hd捆绑| 翔田千里一区二区| 无码一区二区精品| 国产精品福利一区二区| 337p粉嫩色噜噜噜大肥臀| 精品捆绑美女sm三区| 99免在线观看免费视频高清| 欧美亚洲日本网站| 久久天堂久久| 日韩一本精品| 久久成人精品| 中文字幕在线观看91| 国产欧美日韩不卡| 久久精品视频1| 欧美精品一区二区三区在线| 中文字幕中文字幕在线十八区| 国产成人精品综合| 欧美亚洲色图校园春色| 中文字幕色呦呦| 美女视频一区二区| 这里只有久久精品| 黄色91在线观看| 亚洲第一天堂影院| 日韩中文字幕免费| 亚洲日日夜夜| 亚洲国产精品www| 免费高清在线一区| brazzers精品成人一区| 午夜精品成人在线视频| 日韩一区免费视频| 欧美精品久久久久久久| 国产电影一区二区三区爱妃记| 日本精品一区二区三区高清 久久| 99pao成人国产永久免费视频| 国产精品久久久久久亚洲色| 一区二区免费看| 国产av一区二区三区| 欧美俄罗斯乱妇| 欧美精品影院| 欧美日韩视频免费| 国产毛片精品国产一区二区三区| 美国一级黄色录像| 欧美日韩电影在线| 91在线免费看| 国产成人精品国内自产拍免费看| 国产剧情一区| 99视频免费播放| 一色屋精品亚洲香蕉网站| 在线观看免费视频a| 日韩视频中文字幕| 亚洲欧美在线人成swag| 亚洲巨乳在线观看| 精品一二线国产| 欧美日韩偷拍视频| 亚洲精品电影网| 天堂√中文最新版在线| 日韩欧美一区二区三区久久婷婷| 免费永久网站黄欧美| 真实乱视频国产免费观看| 欧美日韩免费观看一区三区| 免费在线你懂的| 国产在线播放一区二区| 亚洲一区网站| 少妇饥渴放荡91麻豆| 91久久精品国产91性色tv| 高清av电影在线观看| 97人摸人人澡人人人超一碰| 亚洲婷婷免费| 性猛交娇小69hd| 欧美一级午夜免费电影| 俄罗斯一级**毛片在线播放 | 欧美18xxxxx| 国产成人jvid在线播放| 欧美影院一区| 西西大胆午夜视频| 色婷婷av久久久久久久| 黄色av电影在线播放| 国产欧美日韩视频一区二区三区| 久久精品官网| 国产真实乱在线更新| 日韩午夜在线播放| 欧美大片免费高清观看| 一区二区三区久久网| 成人av网站在线观看| 在线观看日本网站| 色婷婷久久av|