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

解讀 Java 云原生實踐中的內存問題

云計算 云原生
對外提供服務的業務往往會帶來更活躍的內存分配動作,比如創建新的對象、開啟執行線程,這些操作都需要開辟內存空間,所以線上業務往往耗費更多內存。并且越是流量高峰期,耗費的內存會更多。所以為了保證服務質量,需要依據自身業務流量,對應用內存配置進行相應擴容。

?Java 憑借著自身活躍的開源社區和完善的生態優勢,在過去的二十幾年一直是最受歡迎的編程語言之一。步入云原生時代,蓬勃發展的云原生技術釋放云計算紅利,推動業務進行云原生化改造,加速企業數字化轉型。

然而 Java 的云原生轉型之路面臨著巨大的挑戰,Java 的運行機制和云原生特性存在著諸多矛盾。企業借助云原生技術進行深層次成本優化,資源成本管理被上升到前所未有的高度。公有云上資源按量收費,用戶對資源用量十分敏感。在內存使用方面,基于 Java 虛擬機的執行機制使得任何 Java 程序都會有固定的基礎內存開銷,相比 C++/Golang 等原生語言,Java 應用占用的內存巨大,被稱為“內存吞噬者”,因此 Java 應用上云更加昂貴。并且應用集成到云上之后系統復雜度增加,普通用戶對云上 Java 應用內存沒有清晰的認識,不知道如何為應用合理配置內存,出現 OOM 問題時也很難排障,遇到了許多問題。

為什么堆內存未超過 Xmx 卻發生了 OOM?怎么理解操作系統和JVM的內存關系?為什么程序占用的內存比 Xmx 大不少,內存都用在哪兒了?為什么線上容器內的程序內存需求更大?本文將 EDAS 用戶在 Java 應用云原生化演進實踐中遇到的這些問題進行了抽絲剝繭的分析,并給出云原生 Java 應用內存的配置建議。

一、背景知識

K8s 應用的資源配置?

云原生架構以 K8s 為基石,應用在 K8s 上部署,以容器組的形態運行。K8s 的資源模型有兩個定義,資源請求(request)和資源限制(limit),K8s 保障容器擁有 request數量的資源,但不允許使用超過limit數量的資源。以如下的內存配置為例,容器至少能獲得 1024Mi 的內存資源,但不允許超過 4096Mi,一旦內存使用超限,該容器將發生OOM,而后被 K8s 控制器重啟。 

spec:
containers:
- name: edas
image: alibaba/edas
resources:
requests:
memory: "1024Mi"
limits:
memory: "4096Mi"
command: ["java", "-jar", "edas.jar"]

容器 OOM?

對于容器的 OOM 機制,首先需要來復習一下容器的概念。當我們談到容器的時候,會說這是一種沙盒技術,容器作為一個沙盒,內部是相對獨立的,并且是有邊界有大小的。容器內獨立的運行環境通過 Linux的Namespace 機制實現,對容器內 PID、Mount、UTS、IPD、Network 等 Namespace 進行了障眼法處理,使得容器內看不到宿主機 Namespace 也看不到其他容器的 Namespace;而所謂容器的邊界和大小,是指要對容器使用 CPU、內存、IO 等資源進行約束,不然單個容器占用資源過多可能導致其他容器運行緩慢或者異常。Cgroup 是 Linux 內核提供的一種可以限制單個進程或者多個進程所使用資源的機制,也是實現容器資源約束的核心技術。容器在操作系統看來只不過是一種特殊進程,該進程對資源的使用受 Cgroup 的約束。當進程使用的內存量超過 Cgroup 的限制量,就會被系統 OOM Killer 無情地殺死。

所以,所謂的容器 OOM,實質是運行在Linux系統上的容器進程發生了 OOM。Cgroup 并不是一種晦澀難懂的技術,Linux 將其實現為了文件系統,這很符合 Unix 一切皆文件的哲學。對于 Cgroup V1 版本,我們可以直接在容器內的 /sys/fs/cgroup/ 目錄下查看當前容器的 Cgroup 配置。

對于容器內存來說,memory.limit_in_bytes 和 memory.usage_in_bytes 是內存控制組中最重要的兩個參數,前者標識了當前容器進程組可使用內存的最大值,后者是當前容器進程組實際使用的內存總和。一般來說,使用值和最大值越接近,OOM 的風險越高。

# 當前容器內存限制量
$ cat /sys/fs/cgroup/memory/memory.limit_in_bytes
4294967296
# 當前容器內存實際用量
$ cat /sys/fs/cgroup/memory/memory.usage_in_bytes
39215104

JVM OOM?

說到 OOM,Java 開發者更熟悉的是 JVM OOM,當 JVM 因為沒有足夠的內存來為對象分配空間并且垃圾回收器也已經沒有空間可回收時,將會拋出 java.lang.OutOfMemoryError。按照 JVM 規范,除了程序計數器不會拋出 OOM 外,其他各個內存區域都可能會拋出 OOM。最常見的 JVM OOM 情況有幾種:

  • java.lang.OutOfMemoryError:Java heap space 堆內存溢出。當堆內存 (Heap Space) 沒有足夠空間存放新創建的對象時,就會拋出該錯誤。一般由于內存泄露或者堆的大小設置不當引起。對于內存泄露,需要通過內存監控軟件查找程序中的泄露代碼,而堆大小可以通過-Xms,-Xmx等參數修改。
  • java.lang.OutOfMemoryError:PermGen space / Metaspace 永久代/元空間溢出。永久代存儲對象包括class信息和常量,JDK 1.8 使用 Metaspace 替換了永久代(Permanent Generation)。通常因為加載的 class 數目太多或體積太大,導致拋出該錯誤。可以通過修改 -XX:MaxPermSize 或者 -XX:MaxMetaspaceSize 啟動參數, 調大永久代/元空間大小。
  • java.lang.OutOfMemoryError:Unable to create new native thread 無法創建新線程。每個 Java 線程都需要占用一定的內存空間, 當 JVM 向底層操作系統請求創建一個新的 native 線程時, 如果沒有足夠的資源分配就會報此類錯誤。可能原因是 native 內存不足、線程泄露導致線程數超過操作系統最大線程數 ulimit 限制或是線程數超過 kernel.pid_max。需要根據情況進行資源升配、限制線程池大小、減少線程棧大小等操作。

二、為什么堆內存未超過 Xmx 卻發生了 OOM?

相信很多人都遇到過這一場景,在 K8s 部署的 Java 應用經常重啟,查看容器退出狀態為exit code 137 reason: OOM Killed 各方信息都指向明顯的 OOM,然而 JVM 監控數據顯示堆內存用量并未超過最大堆內存限制Xmx,并且配置了 OOM 自動 heapdump 參數之后,發生 OOM 時卻沒有產生 dump 文件。

根據上面的背景知識介紹,容器內的 Java 應用可能會發生兩種類型的 OOM 異常,一種是 JVM OOM,一種是容器 OOM。JVM 的 OOM 是 JVM 內存區域空間不足導致的錯誤,JVM 主動拋出錯誤并退出進程,通過觀測數據可以看到內存用量超限,并且 JVM 會留下相應的錯誤記錄。而容器的 OOM 是系統行為,整個容器進程組使用的內存超過 Cgroup 限制,被系統 OOM Killer 殺死,在系統日志和 K8s 事件中會留下相關記錄。

總的來說,Java程序內存使用同時受到來自 JVM 和 Cgroup 的限制,其中 Java 堆內存受限于 Xmx 參數,超限后發生 JVM OOM;整個進程內存受限于容器內存limit值,超限后發生容器 OOM。需要結合觀測數據、JVM 錯誤記錄、系統日志和 K8s 事件對 OOM 進行區分、排障,并按需進行配置調整。

三、怎么理解操作系統和 JVM 的內存關系?

上文說到 Java 容器 OOM 實質是 Java 進程使用的內存超過 Cgroup 限制,被操作系統的 OOM Killer 殺死。那在操作系統的視角里,如何看待 Java 進程的內存?操作系統和 JVM 都有各自的內存模型,二者是如何映射的?對于探究 Java 進程的 OOM 問題,理解 JVM 和操作系統之間的內存關系非常重要。

以最常用的 OpenJDK 為例,JVM 本質上是運行在操作系統上的一個 C++ 進程,因此其內存模型也有 Linux 進程的一般特點。Linux 進程的虛擬地址空間分為內核空間和用戶空間,用戶空間又細分為很多個段,此處選取幾個和本文討論相關度高的幾個段,描述 JVM 內存與進程內存的映射關系。

圖片

  • 代碼段。一般指程序代碼在內存中的映射,這里特別指出是 JVM 自身的代碼,而不是Java代碼。
  • 數據段。在程序運行初已經對變量進行初始化的數據,此處是 JVM 自身的數據。
  • 堆空間。運行時堆是 Java 進程和普通進程區別最大的一個內存段。Linux 進程內存模型里的堆是為進程在運行時動態分配的對象提供內存空間,而幾乎所有JVM內存模型里的東西,都是 JVM 這個進程在運行時新建出來的對象。而 JVM 內存模型中的 Java 堆,只不過是 JVM 在其進程堆空間上建立的一段邏輯空間。
  • 棧空間。存放進程的運行棧,此處并不是 JVM 內存模型中的線程棧,而是操作系統運行 JVM 本身需要留存的一些運行數據。

如上所述,堆空間作為 Linux 進程內存布局和 JVM 內存布局都有的概念,是最容易混淆也是差別最大的一個概念。Java 堆相較于 Linux 進程的堆,范圍更小,是 JVM 在其進程堆空間上建立的一段邏輯空間,而進程堆空間還包含支撐 JVM 虛擬機運行的內存數據,例如 Java 線程堆棧、代碼緩存、GC 和編譯器數據等。

四、為什么程序占用的內存比 Xmx 大不少,內存都用在哪了?

在 Java 開發者看來,Java 代碼運行中開辟的對象都放在 Java 堆中,所以很多人會將 Java 堆內存等同于 Java 進程內存,將 Java 堆內存限制參數Xmx當作進程內存限制參數使用,并且把容器內存限制也設置為 Xmx 一樣大小,然后悲催地發現容器被 OOM 了。

實質上除了大家所熟悉的堆內存(Heap),JVM 還有所謂的非堆內存(Non-Heap),除去 JVM 管理的內存,還有繞過 JVM 直接開辟的本地內存。Java 進程的內存占用情況可以簡略地總結為下圖:

圖片

JDK8 引入了 Native Memory Tracking (NMT)特性,可以追蹤 JVM 的內部內存使用。默認情況下,NMT 是關閉狀態,使用 JVM 參數開啟:-XX:NativeMemoryTracking=[off | summary | detail]

$ java -Xms300m -Xmx300m -XX:+UseG1GC -XX:NativeMemoryTracking=summary -jar app.jar

此處限制最大堆內存為 300M,使用 G1 作為 GC 算法,開啟 NMT 追蹤進程的內存使用情況。

注意:啟用 NMT 會導致 5% -10% 的性能開銷。

開啟 NMT 后,可以使用 jcmd 命令打印 JVM 內存的占用情況。此處僅查看內存摘要信息,設置單位為 MB。

$ jcmd <pid> VM.native_memory summary scale=MB

JVM 總內存

Native Memory Tracking:
Total: reserved=1764MB, committed=534MB

NMT 報告顯示進程當前保留內存為 1764MB,已提交內存為 534MB,遠遠高于最大堆內存 300M。保留指為進程開辟一段連續的虛擬地址內存,可以理解為進程可能使用的內存量;提交指將虛擬地址與物理內存進行映射,可以理解為進程當前占用的內存量。

需要特別說明的是,NMT 所統計的內存與操作系統統計的內存有所差異,Linux 在分配內存時遵循 lazy allocation 機制,只有在進程真正訪問內存頁時才將其換入物理內存中,所以使用 top 命令看到的進程物理內存占用量與 NMT 報告中看到的有差別。此處只用 NMT 說明 JVM 視角下內存的占用情況。

Java Heap

Java Heap (reserved=300MB, committed=300MB)    (mmap: reserved=300MB, committed=300MB)

Java 堆內存如設置的一樣,實際開辟了 300M 的內存空間。

Metaspace

Class (reserved=1078MB, committed=61MB)      (classes #11183)      (malloc=2MB #19375)       (mmap: reserved=1076MB, committed=60MB)

加載的類被存儲在 Metaspace,此處元空間加載了 11183 個類,保留了近 1G,提交了 61M。

加載的類越多,使用的元空間就越多。元空間大小受限于-XX:MaxMetaspaceSize(默認無限制)和 -XX:CompressedClassSpaceSize(默認 1G)。

Thread

Thread (reserved=60MB, committed=60MB)       (thread #61)       (stack: reserved=60MB, committed=60MB)

JVM 線程堆棧也需要占據一定空間。此處 61 個線程占用了 60M 空間,每個線程堆棧默認約為 1M。堆棧大小由 -Xss 參數控制。

Code Cache

Code (reserved=250MB, committed=36MB)     (malloc=6MB #9546)      (mmap: reserved=244MB, committed=30MB)

代碼緩存區主要用來保存 JIT 即時編譯器編譯后的代碼和 Native 方法,目前緩存了 36M 的代碼。代碼緩存區可以通過 -XX:ReservedCodeCacheSize 參數進行容量設置。

GC

GC (reserved=47MB, committed=47MB)
(malloc=4MB #11696)
(mmap: reserved=43MB, committed=43MB)

GC 垃圾收集器也需要一些內存空間支撐 GC 操作,GC 占用的空間與具體選用的 GC 算法有關,此處的 GC 算法使用了 47M。在其他配置相同的情況下,換用 SerialGC:

GC (reserved=1MB, committed=1MB)
(mmap: reserved=1MB, committed=1MB)

可以看到 SerialGC 算法僅使用 1M 內存。這是因為 SerialGC 是一種簡單的串行算法,涉及數據結構簡單,計算數據量小,所以內存占用也小。但是簡單的 GC 算法可能會帶來性能的下降,需要平衡性能和內存表現進行選擇。

Symbol

Symbol (reserved=15MB, committed=15MB)
(malloc=11MB #113566)
(arena=3MB #1)

JVM 的 Symbol 包含符號表和字符串表,此處占用 15M。

非 JVM 內存

NMT 只能統計 JVM 內部的內存情況,還有一部分內存不由JVM管理。除了 JVM 托管的內存之外,程序也可以顯式地請求堆外內存 ByteBuffer.allocateDirect,這部分內存受限于 -XX:MaxDirectMemorySize 參數(默認等于-Xmx)。System.loadLibrary 所加載的 JNI 模塊也可以不受 JVM 控制地申請堆外內存。

綜上,其實并沒有一個能準確估量 Java 進程內存用量的模型,只能夠盡可能多地考慮到各種因素。其中有一些內存區域能通過 JVM 參數進行容量限制,例如代碼緩存、元空間等,但有些內存區域不受 JVM 控制,而與具體應用的代碼有關。

Total memory = Heap + Code Cache + Metaspace + Thread stacks + 
Symbol + GC + Direct buffers + JNI + ...

五、為什么線上容器比本地測試內存需求更大?

經常有用戶反饋,為什么相同的一份代碼,在線上容器里跑總是要比本地跑更耗內存,甚至出現 OOM。可能的情況的情況有如下幾種:

沒有使用容器感知的 JVM 版本?

在一般的物理機或虛擬機上,當未設置 -Xmx 參數時,JVM 會從常見位置(例如,Linux 中的 /proc目錄下)查找其可以使用的最大內存量,然后按照主機最大內存的 1/4 作為默認的 JVM 最大堆內存量。而早期的 JVM 版本并未對容器進行適配,當運行在容器中時,仍然按照主機內存的 1/4 設置 JVM最 大堆,而一般集群節點的主機內存比本地開發機大得多,容器內的 Java 進程堆空間開得大,自然更耗內存。同時在容器中又受到 Cgroup 資源限制,當容器進程組內存使用量超過 Cgroup 限制時,便會被 OOM。為此,8u191 之后的 OpenJDK 引入了默認開啟的 UseContainerSupport 參數,使得容器內的 JVM 能感知容器內存限制,按照 Cgroup 內存限制量的 1/4 設置最大堆內存量。

線上業務耗費更多內存

對外提供服務的業務往往會帶來更活躍的內存分配動作,比如創建新的對象、開啟執行線程,這些操作都需要開辟內存空間,所以線上業務往往耗費更多內存。耗費的內存會更多。所以為了保證服務質量,需要依據自身業務流量,對應用內存配置進行相應擴容。

六、云原生 Java 應用內存的配置建議

  1. 使用容器感知的 JDK 版本。對于使用 Cgroup V1 的集群,需要升級至 8u191+、Java 9、Java 10 以及更高版本;對于使用 Cgroup V2 的集群,需要升級至 8u372+ 或 Java 15 及更高版本。
  2. 使用 NativeMemoryTracking(NMT) 了解應用的 JVM 內存用量。NMT 能夠追蹤 JVM 的內存使用情況,在測試階段可以使用 NMT 了解程序JVM使用內存的大致分布情況,作為內存容量配置的參考依據。JVM 參數 -XX:NativeMemoryTracking 用于啟用 NMT,開啟 NMT 后,可以使用 jcmd 命令打印 JVM 內存的占用情況。
  3. 根據 Java 程序內存使用量設置容器內存 limit。容器 Cgroup 內存限制值來源于對容器設置的內存 limit 值,當容器進程使用的內存量超過 limit,就會發生容器 OOM。為了程序在正常運行或業務波動時發生 OOM,應該按照 Java 進程使用的內存量上浮 20%~30% 設置容器內存 limit。如果初次運行的程序,并不了解其實際內存使用量,可以先設置一個較大的 limit 讓程序運行一段時間,按照觀測到的進程內存量對容器內存 limit 進行調整。
  4. OOM 時自動 dump 內存快照,并為 dump 文件配置持久化存儲,比如使用 PVC 掛載到 hostPath、OSS 或 NAS,盡可能保留現場數據,支撐后續的故障排查。?
責任編輯:武曉燕 來源: 阿里云云原生
相關推薦

2023-12-06 15:21:16

Java云原生

2010-03-09 17:32:45

Python數組

2010-03-17 16:06:08

Java線程同步

2023-08-31 22:40:01

2022-09-19 08:35:28

Kafka節點故障

2021-05-07 10:42:10

云計算云原生數據中臺

2020-09-22 20:00:30

微服務架構設計

2021-06-03 08:32:52

KubernetesRBACRole

2017-03-07 10:00:01

定義實踐DevOps

2021-08-02 09:40:57

Dapr阿里云Service Mes

2023-07-18 18:14:51

云原生軟件架構

2013-04-19 10:40:03

2012-08-30 16:24:04

HTML5歐朋W3C

2010-11-11 14:28:01

SQL Server排

2023-08-24 09:44:16

數據庫性能

2020-03-04 09:56:56

網絡安全云原生容器

2022-05-02 15:11:15

Bytedoc云原生數據庫服務

2020-09-18 13:09:15

云原生云安全網絡安全

2021-06-15 09:57:23

云計算云原生云開發

2022-08-21 07:25:09

Flink云原生K8S
點贊
收藏

51CTO技術棧公眾號

欧美肥臀大乳一区二区免费视频| 欧美久久久久免费| 精品欧美一区二区三区久久久| 日韩黄色一级大片| 国产伦精品一区二区三区视频| 欧美日韩中字一区| 神马午夜伦理影院| 欧美新色视频| 另类成人小视频在线| 欧美精品999| 性欧美一区二区| 色妞ww精品视频7777| 欧美日韩一二三四五区| 亚洲国产精品一区二区第一页| 国产黄色av网站| 翔田千里一区二区| 久久黄色av网站| aaaa黄色片| 国产日韩中文在线中文字幕| 欧美日韩激情小视频| 亚洲一区二区在| 少妇高潮久久久| 久久精品国产久精国产爱| 欧美大片在线看免费观看| 中文字幕第20页| 国产乱论精品| 91精品国产黑色紧身裤美女| 日本www在线视频| 麻豆影院在线| 国产日韩欧美a| 亚洲尤物视频网| 中文字幕a级片| 亚洲欧美日本国产专区一区| 久久99精品视频一区97| 国精产品久拍自产在线网站| 综合伊思人在钱三区| 欧美不卡一区二区| www,av在线| 精品自拍视频| 欧美亚日韩国产aⅴ精品中极品| 国产在线播放观看| 在线午夜影院| 亚洲欧美日韩中文字幕一区二区三区 | 久久精品第一页| 日韩伦理视频| 中文字幕精品在线视频| 一区二区三区四区免费| 免费av一区| 国产午夜一区二区| 黄瓜视频污在线观看| 色婷婷精品视频| 亚洲精品videossex少妇| 亚洲一二三四五| 综合激情网...| 欧美成人午夜电影| 国产人妻黑人一区二区三区| japanese色系久久精品| 亚洲爱爱爱爱爱| 中文字幕第九页| 久久精品国产亚洲blacked| 亚洲第一视频网站| 波多野结衣视频播放| 免费看成人人体视频| 亚洲国产精品电影| 在线免费观看污视频| 青青草久久爱| 国产亚洲精品美女久久久| 欧美 日韩 国产 成人 在线观看| 精品日韩欧美一区| 日韩网站在线观看| 欧产日产国产v| 国内精品久久久久国产盗摄免费观看完整版| 久久国产色av| xxxxxx国产| 免费精品视频| 国产欧美日韩丝袜精品一区| av在线亚洲天堂| av一区二区三区在线| 欧美精品免费观看二区| 91电影在线播放| 亚洲同性同志一二三专区| 欧美久久久久久久久久久久久久| 国产99re66在线视频| 欧美午夜激情在线| 天天操天天爽天天射| 国产成人福利夜色影视| 日韩一区二区免费在线观看| 欧美在线一级片| 精品国产美女| 欧美猛少妇色xxxxx| 久久久91视频| 先锋影音久久| 国产综合福利在线| 性一交一乱一伧老太| 成人精品在线视频观看| 欧美黄色直播| 黄网站在线播放| 亚洲电影第三页| 男人操女人免费软件| 亚洲国产aⅴ精品一区二区三区| 日韩欧美一卡二卡| 国产精品亚洲无码| 欧美jjzz| 国产精品久久久久久一区二区| 国产av无码专区亚洲av麻豆| av中文一区二区三区| 日产国产精品精品a∨| 国产精品刘玥久久一区| 精品久久久久国产| 欧美大片久久久| 外国成人在线视频| 久久这里只有精品99| 男人天堂2024| 国产iv一区二区三区| 四虎一区二区| 国产丝袜视频在线播放| 欧美精品乱码久久久久久按摩| 国产原创剧情av| 色综合狠狠操| 欧洲美女免费图片一区| 亚洲AV无码一区二区三区少妇 | 欧洲在线视频| 欧美视频在线一区| 国产十八熟妇av成人一区| 自拍欧美日韩| 成人激情春色网| 岛国大片在线观看| 狠狠躁夜夜躁人人爽天天天天97| 久久久精品视频国产| 色天天久久综合婷婷女18| 日本国产一区二区三区| 午夜在线观看视频18| 亚洲观看高清完整版在线观看| 一级黄色高清视频| 日韩精品一区二区久久| 日本欧美国产在线| 亚洲av成人精品日韩在线播放| 欧美国产禁国产网站cc| 无码少妇一区二区三区芒果| 欧美电影在线观看免费| 性欧美亚洲xxxx乳在线观看| 性欧美一区二区三区| 亚洲精品久久7777| 欧美一级xxxx| 成人在线免费观看视频| 国产精品成人一区二区三区吃奶| 日漫免费在线观看网站| 黄色一区二区在线| 亚洲久久久久久| 在线成人国产| 国产亚洲欧美一区二区| 色婷婷视频在线观看| 欧美一级高清片在线观看| 成人免费毛片xxx| 国产综合色在线视频区| 9色视频在线观看| 伊人久久大香伊蕉在人线观看热v| 国产亚洲精品综合一区91| 无码人妻精品一区二区50| 久久综合狠狠综合| 日本在线观看a| 免费国产自久久久久三四区久久| 97国产精品视频人人做人人爱| 手机看片福利永久| 午夜精品成人在线视频| 日b视频在线观看| 玖玖视频精品| 一区二区日本伦理| 日本免费一区二区视频| 欧美激情2020午夜免费观看| 性欧美在线看片a免费观看| 国产aⅴ激情无码久久久无码| 在线综合亚洲| 欧美日韩国产综合在线| 成人天堂yy6080亚洲高清 | eeuss影院在线播放| 欧美色综合影院| 18岁成人毛片| 99久久久久久99| 久久久精品麻豆| 成人在线免费小视频| 91免费高清视频| 香蕉成人app免费看片| 亚洲国产高清高潮精品美女| 欧美人一级淫片a免费播放| 国产精品黄色在线观看| 一区二区三区四区影院| 亚洲欧美日韩专区| 最新国产精品久久| 里番精品3d一二三区| 国产精品美女久久| 欧美孕妇性xxxⅹ精品hd| 在线91免费看| 91av在线免费视频| 亚洲欧美自拍偷拍| 在线天堂www在线国语对白| 秋霞影院一区二区| 99热久久这里只有精品| 成人6969www免费视频| 豆国产97在线| 成人在线免费| 97视频免费观看| 二区三区四区高清视频在线观看| 亚洲精品ady| 99热这里只有精品9| 色先锋资源久久综合| 免费在线观看av网址| 国产女人18水真多18精品一级做 | 中文字幕二区三区| 亚洲国产视频一区| 在线日韩国产网站| 久久五月婷婷丁香社区| 绯色av蜜臀vs少妇| 久久av资源站| 999精品网站| 日韩视频精品在线观看| 日本女人高潮视频| 精品久久久久中文字幕小说 | 欧美最猛性xxxxx亚洲精品| av免费在线观| 日韩在线视频免费观看高清中文| 男同在线观看| 亚洲国产精品字幕| 不卡的日韩av| 欧美一级精品大片| 国产又黄又粗又猛又爽| 欧美亚洲动漫另类| jizz国产在线| 色88888久久久久久影院野外| 日本道在线观看| 亚洲一区中文日韩| 国产精品99久久久久久成人| 国产婷婷一区二区| av小说在线观看| ww久久中文字幕| 免费看黄色aaaaaa 片| 99久久精品国产导航| 亚洲午夜久久久久久久久| 国产成人av福利| 超碰在线超碰在线| 韩国成人在线视频| 日韩av自拍偷拍| 精品无人区卡一卡二卡三乱码免费卡| 国产成人综合一区| 视频一区二区中文字幕| 久久九九国产视频| 日韩av一区二| 色婷婷狠狠18| 寂寞少妇一区二区三区| 婷婷激情综合五月天| 狠狠色狠狠色综合| 亚洲综合伊人久久| 国产精品99久久不卡二区| 色婷婷一区二区三区在线观看| 国产一区激情在线| 中文字幕在线视频一区二区| 国产成人一区二区精品非洲| 亚洲成a人无码| 成人avav影音| 亚洲区自拍偷拍| 亚洲国产精品传媒在线观看| 夫妇交换中文字幕| 国产精品久99| 青青草原在线免费观看| 亚洲va国产va欧美va观看| 男女视频免费看| 色老头久久综合| 中文字幕人妻一区二区三区视频 | 制服丝袜av在线| 久久综合一区二区| wwwww黄色| 亚洲欧美日韩综合aⅴ视频| 亚洲国产精品成人无久久精品| 疯狂欧美牲乱大交777| 最近免费中文字幕大全免费版视频| 欧美三级中文字幕在线观看| a天堂视频在线| 亚洲黄色免费三级| h视频网站在线观看| 久久在线观看视频| 123区在线| 国产精品久久国产精品99gif| 伊人久久大香线蕉综合影院首页| 国产伦精品一区二区三区照片| 妖精视频一区二区三区免费观看 | 波多野结衣办公室33分钟| 亚洲国产精品成人综合色在线婷婷| 中文字幕五月天| 欧美日韩国产精品一区| 亚洲午夜精品久久久| 精品国产伦一区二区三区观看方式| 免费在线性爱视频| 久久综合久久八八| 超碰国产一区| 亚洲伊人第一页| 国模精品一区| 国产一线二线三线女| 免费在线观看日韩欧美| xxxx黄色片| 日韩美女精品在线| 久久全球大尺度高清视频| 亚洲区成人777777精品| 激情综合在线| 在线观看日本一区二区| av中文一区二区三区| 国产wwwwxxxx| 夜夜亚洲天天久久| 6080午夜伦理| 欧美老年两性高潮| 青青草观看免费视频在线| 中文字幕日韩免费视频| 免费不卡视频| 国产精品久久电影观看| 婷婷亚洲成人| 黄色a级片免费看| 日本在线视频一区二区| 青青久久aⅴ北条麻妃| 国产精品亚洲一区二区在线观看| 蜜桃视频在线观看成人| 欧美三级网页| 亚洲国产综合av| 欧美激情一区二区三区蜜桃视频| 欧美日韩综合在线观看| 日韩一区二区三区免费看| 亚洲成人三级| 国产精品扒开腿做爽爽爽男男| 日韩高清影视在线观看| 国产青草视频在线观看| 久草中文综合在线| 日韩福利在线视频| 欧美性xxxx在线播放| 老司机午夜福利视频| 欧美疯狂xxxx大交乱88av| 四虎国产精品永久在线国在线| 欧美视频1区| 羞羞视频在线观看欧美| 国产激情视频网站| 五月激情综合网| 亚洲国产一二三区| 一区二区三区高清不卡| 天天操夜夜操视频| 亚洲国产成人精品女人久久久 | 2023国产精品久久久精品双| 狠狠热免费视频| www一区二区| 四虎精品永久在线| 亚洲男人的天堂在线| 人人视频精品| 色播亚洲婷婷| 麻豆免费精品视频| 亚洲女人毛茸茸高潮| 欧美男同性恋视频网站| 欧美三级黄网| 亚洲伊人久久综合| 影音先锋久久资源网| 蜜臀av粉嫩av懂色av| 欧美日韩精品在线播放| 你懂的免费在线观看| 国产ts一区二区| 精品香蕉视频| www.成年人| 一区二区三区欧美在线观看| 亚洲女人18毛片水真多| 国内精品小视频| 竹菊久久久久久久| 日本中文字幕观看| 一区二区三区四区在线| 欧美一区,二区| 国产脚交av在线一区二区| 久久视频精品| 国产在线观看免费播放| 欧美日韩一二三四五区| 91亚洲欧美| 99在线视频免费观看| 午夜亚洲视频| 国产大屁股喷水视频在线观看| 91精品福利在线一区二区三区| 国产蜜臀一区二区打屁股调教| 快播亚洲色图| 麻豆精品视频在线观看免费 | 午夜在线视频| 3d精品h动漫啪啪一区二区 | 88xx成人精品| blacked蜜桃精品一区| 久久精品无码一区二区三区毛片| 午夜影院久久久| 午夜视频成人| 国产亚洲一区二区三区在线播放 | 国产sm在线观看| 都市激情亚洲色图| 久草免费在线| 久久草.com| 久久99国内精品| 国产一级淫片免费| 一区二区三欧美| 五月亚洲婷婷| 色综合天天色综合| 亚洲国产精品久久人人爱蜜臀| 嫩草研究院在线| 99伊人久久|