日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java性能调优工具--笔记

發(fā)布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java性能调优工具--笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、JDK命令行工具

1.1、jps命令

jps用于列出Java的進程,jps可以增加參數(shù),-m用于輸出傳遞給Java進程的參數(shù),-l用于輸出主函數(shù)的完整路徑,-v可以用于顯示傳遞給jvm的參數(shù)。

jps -l -m -v 31427 sun.tools.jps.Jps -l -m -v -Dapplication.home=/Library/Java/JavaVirtualMachines/jdk1.7.0_55.jdk/Contents/Home -Xms8m

1.2、jstat命令

jstat是一個可以用于觀察Java應(yīng)用程序運行時信息的工具,它的功能非常強大,可以通過它查看堆信息的詳細情況,它的基本使用方法為:

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

選項option可以由以下值組成:

jstat -class pid:顯示加載class的數(shù)量,及所占空間等信息。 jstat -compiler pid:顯示VM實時編譯的數(shù)量等信息。jstat -gc pid:可以顯示gc的信息,查看gc的次數(shù),及時間。其中最后五項,分別是young gc的次數(shù),young gc的時間,full gc的次數(shù),full gc的時間,gc的總時間。jstat -gccapacity:可以顯示,VM內(nèi)存中三代(young,old,perm)對象的使用和占用大小,如:PGCMN顯示的是最小perm的內(nèi)存使用量,PGCMX顯示的是perm的內(nèi)存最大使用量,PGC是當(dāng)前新生成的perm內(nèi)存占用量,PC是但前perm內(nèi)存占用量。其他的可以根據(jù)這個類推, OC是old內(nèi)純的占用量。jstat -gcnew pid:new對象的信息。jstat -gcnewcapacity pid:new對象的信息及其占用量。jstat -gcold pid:old對象的信息。jstat -gcoldcapacity pid:old對象的信息及其占用量。jstat -gcpermcapacity pid: perm對象的信息及其占用量。jstat -gcutil pid:統(tǒng)計gc信息統(tǒng)計。jstat -printcompilation pid:當(dāng)前VM執(zhí)行的信息。除了以上一個參數(shù)外,還可以同時加上 兩個數(shù)字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次。

這些參數(shù)中最常用的參數(shù)是gcutil,下面是該參數(shù)的輸出介紹以及一個簡單例子:  

S0 — Heap上的 Survivor space 0 區(qū)已使用空間的百分比 S1 — Heap上的 Survivor space 1 區(qū)已使用空間的百分比E — Heap上的 Eden space 區(qū)已使用空間的百分比O — Heap上的 Old space 區(qū)已使用空間的百分比P — Perm space 區(qū)已使用空間的百分比YGC — 從應(yīng)用程序啟動到采樣時發(fā)生 Young GC 的次數(shù)YGCT– 從應(yīng)用程序啟動到采樣時 Young GC 所用的時間(單位秒)FGC — 從應(yīng)用程序啟動到采樣時發(fā)生 Full GC 的次數(shù)FGCT– 從應(yīng)用程序啟動到采樣時 Full GC 所用的時間(單位秒)GCT — 從應(yīng)用程序啟動到采樣時用于垃圾回收的總時間(單位秒)實例使用1:[root@localhost bin]# jstat -gcutil 25444S0 S1 E O P YGC YGCT FGC FGCT GCT11.63 0.00 56.46 66.92 98.49 162 0.248 6 0.331 0.579

1.3、jinfo命令
jinfo可以用來查看正在運行的Java應(yīng)用程序的擴展參數(shù),甚至在運行時修改部分參數(shù),它的基本語法為:

jinfo <option> <pid>

jinfo可以查看運行時參數(shù):

jinfo -flag MaxTenuringThreshold 31518 -XX:MaxTenuringThreshold=15

jinfo還可以在運行時修改參數(shù)值:

> jinfo -flag PrintGCDetails 31518 -XX:-PrintGCDetails > jinfo -flag +PrintGCDetails 31518> jinfo -flag PrintGCDetails 31518-XX:+PrintGCDetails

1.4、jmap命令
jmap命令主要用于生成堆快照文件,它的使用方法如下:

> jmap -dump:format=b,file=heap.hprof 31531 Dumping heap to /Users/caojie/heap.hprof ...Heap dump file created

獲得堆快照文件之后,我們可以使用多種工具對文件進行分析,例如jhat,visual vm等。

1.5、jhat命令
使用jhat工具可以分析Java應(yīng)用程序的堆快照文件,使用命令如下:

> jhat heap.hprof Reading from heap.hprof...Dump file created Tue Nov 11 06:02:05 CST 2014Snapshot read, resolving...Resolving 8781 objects...Chasing references, expect 1 dots.Eliminating duplicate references.Snapshot resolved.Started HTTP server on port 7000Server is ready.

jhat在分析完成之后,使用HTTP服務(wù)器展示其分析結(jié)果,在瀏覽器中訪問http://127.0.0.1:7000/即可得到分析結(jié)果。

1.6、jstack命令
jstack可用于導(dǎo)出Java應(yīng)用程序的線程堆棧信息,語法為:

jstack -l <pid>

jstack可以檢測死鎖,下例通過一個簡單例子演示jstack檢測死鎖的功能。java代碼如下:

package com.huihui.test;import java.util.concurrent.locks.ReentrantLock;public class DeadLock extends Thread {protected Object myDirect;static ReentrantLock south = new ReentrantLock();static ReentrantLock north = new ReentrantLock();public DeadLock(Object obj) {this.myDirect = obj;if (myDirect == south) {this.setName("south");}if (myDirect == north) {this.setName("north");}}@Overridepublic void run() {if (myDirect == south) {try {north.lockInterruptibly();try {Thread.sleep(500);} catch (Exception e) {e.printStackTrace();}south.lockInterruptibly();System.out.println("car to south has passed");} catch (InterruptedException e1) {System.out.println("car to south is killed");} finally {if (north.isHeldByCurrentThread())north.unlock();if (south.isHeldByCurrentThread())south.unlock();}}if (myDirect == north) {try {south.lockInterruptibly();try {Thread.sleep(500);} catch (Exception e) {e.printStackTrace();}north.lockInterruptibly();System.out.println("car to north has passed");} catch (InterruptedException e1) {System.out.println("car to north is killed");} finally {if (north.isHeldByCurrentThread())north.unlock();if (south.isHeldByCurrentThread())south.unlock();}}}public static void main(String[] args) throws InterruptedException {DeadLock car2south = new DeadLock(south);DeadLock car2north = new DeadLock(north);car2south.start();car2north.start();Thread.sleep(1000);}}

使用jps命令查看進程號為32627,然后使用jstack -l 32637 > a.txt命令把堆棧信息打印到文件中,該文件內(nèi)容如下:

2016-09-18 22:26:12 Full thread dump Java HotSpot(TM) Client VM (25.101-b13 mixed mode, sharing):"DestroyJavaVM" #10 prio=5 os_prio=0 tid=0x156e6800 nid=0x2648 waiting on condition [0x00000000]java.lang.Thread.State: RUNNABLELocked ownable synchronizers:- None"north" #9 prio=5 os_prio=0 tid=0x156e8800 nid=0x21cc waiting on condition [0x15a5f000]java.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for <0x04aad4b0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireInterruptibly(AbstractQueuedSynchronizer.java:897)at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1222)at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335)at com.huihui.test.DeadLock.run(DeadLock.java:50)Locked ownable synchronizers:- <0x04aad488> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)"south" #8 prio=5 os_prio=0 tid=0x156e8000 nid=0x19e4 waiting on condition [0x159cf000]java.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for <0x04aad488> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireInterruptibly(AbstractQueuedSynchronizer.java:897)at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1222)at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335)at com.huihui.test.DeadLock.run(DeadLock.java:30)Locked ownable synchronizers:- <0x04aad4b0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)"Service Thread" #7 daemon prio=9 os_prio=0 tid=0x00f49400 nid=0xfe8 runnable [0x00000000]java.lang.Thread.State: RUNNABLELocked ownable synchronizers:- None"C1 CompilerThread0" #6 daemon prio=9 os_prio=2 tid=0x00f3f000 nid=0x1314 waiting on condition [0x00000000]java.lang.Thread.State: RUNNABLELocked ownable synchronizers:- None"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x00f3d400 nid=0x2d94 waiting on condition [0x00000000]java.lang.Thread.State: RUNNABLELocked ownable synchronizers:- None"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x00f2c800 nid=0x2d20 runnable [0x00000000]java.lang.Thread.State: RUNNABLELocked ownable synchronizers:- None"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x00f23c00 nid=0xd3c in Object.wait() [0x0497f000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x04a08980> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)- locked <0x04a08980> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)Locked ownable synchronizers:- None"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x00ec6c00 nid=0x3a00 in Object.wait() [0x048ef000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x04a06a70> (a java.lang.ref.Reference$Lock)at java.lang.Object.wait(Object.java:502)at java.lang.ref.Reference.tryHandlePending(Reference.java:191)- locked <0x04a06a70> (a java.lang.ref.Reference$Lock)at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)Locked ownable synchronizers:- None"VM Thread" os_prio=2 tid=0x00ec2800 nid=0x2414 runnable "VM Periodic Task Thread" os_prio=2 tid=0x156e0400 nid=0x28d4 waiting on condition JNI global references: 6Found one Java-level deadlock: ============================= "north":waiting for ownable synchronizer 0x04aad4b0, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),which is held by "south" "south":waiting for ownable synchronizer 0x04aad488, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),which is held by "north"Java stack information for the threads listed above: =================================================== "north":at sun.misc.Unsafe.park(Native Method)- parking to wait for <0x04aad4b0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireInterruptibly(AbstractQueuedSynchronizer.java:897)at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1222)at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335)at com.huihui.test.DeadLock.run(DeadLock.java:50) "south":at sun.misc.Unsafe.park(Native Method)- parking to wait for <0x04aad488> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireInterruptibly(AbstractQueuedSynchronizer.java:897)at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1222)at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335)at com.huihui.test.DeadLock.run(DeadLock.java:30)Found 1 deadlock.

從這個輸出可以知道:

1、在輸出的最后一段,有明確的”Found one Java-level deadlock”輸出,所以通過jstack命令我們可以檢測死鎖;
2、輸出中包含了所有線程,除了我們的north,sorth線程外,還有”Attach Listener”, “C2 CompilerThread0”, “C2 CompilerThread1”等等;
3、每個線程下面都會輸出當(dāng)前狀態(tài),以及這個線程當(dāng)前持有鎖以及等待鎖,當(dāng)持有與等待造成循環(huán)等待時,將導(dǎo)致死鎖。

1.7、jstatd命令
jstatd命令是一個RMI服務(wù)器程序,它的作用相當(dāng)于代理服務(wù)器,建立本地計算機與遠程監(jiān)控工具的通信,jstatd服務(wù)器能夠?qū)⒈緳C的Java應(yīng)用程序信息傳遞到遠程計算機,由于需要多臺計算機做演示,此處略。

1.8、hprof工具  
hprof工具可以用于監(jiān)控Java應(yīng)用程序在運行時的CPU信息和堆信息,關(guān)于hprof的官方文檔如下:https://docs.oracle.com/javase/7/docs/technotes/samples/hprof.html

2、Visual VM工具

Visual VM是一個功能強大的多合一故障診斷和性能監(jiān)控的可視化工具,它集成了多種性能統(tǒng)計工具的功能,使用Visual VM可以替代jstat、jmap、jhat、jstack等工具。在命令行輸入jvisualvm即可啟動visualvm。

打開Visual VM之后,左邊導(dǎo)航欄會顯示出當(dāng)前機器所有Java進程:

點擊你想監(jiān)控的程序即可對該程序進行監(jiān)控,Visual VM的性能監(jiān)控頁一共有以下幾個tab頁:

概述頁會顯示程序的基本使用情況,比如,進程ID,系統(tǒng)屬性,啟動參數(shù)等。

通過監(jiān)視頁面,可以監(jiān)視應(yīng)用程序的CPU、堆、永久區(qū)、類加載器和線程數(shù)的整體情況,通過頁面上的Perform GC和Heap Dump按鈕還可以手動執(zhí)行Full GC和生成堆快照。

線程頁面會提供詳細的線程信息,單擊Thread Dump按鈕可以導(dǎo)出當(dāng)前所有線程的堆棧信息,如果Visual VM在當(dāng)前線程中找到死鎖,則會以十分顯眼的方式在Threads頁面給予提示。

抽樣器可以對CPU和內(nèi)存兩個性能進行抽樣,用于實時地監(jiān)控程序。CPU采樣器可以將CPU占用時間定位到方法,內(nèi)存采樣器可以查看當(dāng)前程序的堆信息。下面是一個頻繁調(diào)用的Java程序,我們會對改程序進行采樣:

package com.huihui.test;import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;public class MethodTime {static java.util.Random r = new java.util.Random();static Map<String, String> map = null;static {map = new HashMap<String, String>();map.put("1", "Java");map.put("2", "C++");map.put("3", "Delphi");map.put("4", "C");map.put("5", "Phython");}public String getNameById(String id) {try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}return map.get(id);}public List<String> getNamesByIds(String ids) {List<String> re = new ArrayList<String>();String[] strs = ids.split(",");for (String id : strs) {re.add(getNameById(id));}return re;}public List<String> getNamesByIdsBad(String ids) {List<String> re = new ArrayList<String>();String[] strs = ids.split(",");for (String id : strs) {// A bad codegetNameById(id);re.add(getNameById(id));}return re;}public class NamesByIdsThread implements Runnable {@Overridepublic void run() {try {while (true) {int c = r.nextInt(4);String ids = "";for (int i = 0; i < c; i++)ids = Integer.toString((r.nextInt(4) + 1)) + ",";getNamesByIds(ids);}} catch (Exception e) {}}}public class NamesByIdsBadThread implements Runnable {@Overridepublic void run() {try {while (true) {int c = r.nextInt(4);String ids = "";for (int i = 0; i < c; i++)ids = Integer.toString((r.nextInt(4) + 1)) + ",";getNamesByIdsBad(ids);}} catch (Exception e) {}}}public static void main(String args[]) {MethodTime instance = new MethodTime();new Thread(instance.new NamesByIdsThread()).start();new Thread(instance.new NamesByIdsBadThread()).start();} }

通過Visual VM的采樣功能,可以找到改程序中占用CPU時間最長的方法:

默認Visual VM不統(tǒng)計內(nèi)置對象的函數(shù)調(diào)用,比如java.*包中的類,如果要統(tǒng)計這些內(nèi)置對象,單機右上角的設(shè)置進行調(diào)配。Visual VM雖然可以統(tǒng)計方法的調(diào)用時間,但是無法給出方法調(diào)用堆棧,Jprofile不僅可以給出方法調(diào)用時間,還可以給出方法調(diào)用堆棧,較Visual VM更強大。

右擊左導(dǎo)航的應(yīng)用程序,會出現(xiàn)以下菜單:

單機應(yīng)用程序快照,可以分析當(dāng)前應(yīng)用程序的快照,單擊堆Dump能夠?qū)Ξ?dāng)前的堆信息進行分析。Visual VM的更多使用方法,可以查看Oracle的官方文檔https://docs.oracle.com/javase/7/docs/technotes/guides/visualvm/index.html

BTrace插件
BTrace是一款功能強大的性能檢測工具,它可以在不停機的情況下,通過字節(jié)碼注入,動態(tài)監(jiān)控系統(tǒng)的運行情況,它可以跟蹤指定的方法調(diào)用、構(gòu)造函數(shù)調(diào)用和系統(tǒng)內(nèi)存等信息,本部分打算舉一個例子,講解一下BTrace的使用。要在Visual VM中使用Btrace,首先需要安裝Btrace插件,點擊工具->插件即可在線安裝,安裝后右鍵應(yīng)用程序,就會出現(xiàn)如下選項:

點擊Trace application,即可進入BTrace插件界面。使用BTrace可以監(jiān)控指定函數(shù)的耗時,以下腳本通過正則表達式,監(jiān)控所有類的getNameById方法:

package com.huihui.test;import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*;@BTrace public class TracingScript {@TLSprivate static long startTime = 0;@OnMethod(clazz = "/.+/", method = "/getNameById/") // 監(jiān)控任意類的getNameById方法public static void startMethod() {startTime = timeMillis();}@OnMethod(clazz = "/.+/", method = "/getNameById/", location = @Location(Kind.RETURN)) // 方法返回時觸發(fā)public static void endMethod() {print(strcat(strcat(name(probeClass()), "."), probeMethod()));print(" [");print(strcat("Time taken : ", str(timeMillis() - startTime)));println("]");} }

點擊運行,部分輸出如下:

MethodTime.getNameById [Time taken : 5] MethodTime.getNameById [Time taken : 4] MethodTime.getNameById [Time taken : 7] MethodTime.getNameById [Time taken : 7]

BTrace除了可以監(jiān)控函數(shù)耗時外,還可以指定程序運行到某一行代碼觸發(fā)某一行為,定時觸發(fā)行為,監(jiān)控函數(shù)參數(shù)等等。

3、MAT內(nèi)存分析工具

MAT是一款功能強大的Java堆內(nèi)存分析器,可以用于查找內(nèi)存泄露以及查看內(nèi)存消耗情況,MAT的官方文檔如下:http://help.eclipse.org/luna/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html。

在MAT中有淺堆和深堆的概念,淺堆是指一個對象結(jié)構(gòu)所占用的內(nèi)存大小,深堆是指一個對象被GC回收后可以真正釋放的內(nèi)存大小。

通過MAT,可以列出所有垃圾回收的根對象,Java系統(tǒng)的根對象可能是以下類:系統(tǒng)類,線程,Java局部變量,本地棧等等。在MAT中還可以很清楚的看到根對象到當(dāng)前對象的引用關(guān)系鏈。

MAT還可以自動檢測內(nèi)存泄露,單擊菜單上的Leak Suspects命令,MAT會自動生成一份報告,這份報告羅列了系統(tǒng)內(nèi)可能存在內(nèi)存泄露的問題點。

在MAT中,還可以自動查找并顯示消耗內(nèi)存最多的幾個對象,這些消耗大量內(nèi)存的大對象往往是解決系統(tǒng)性能問題的關(guān)鍵所在。

具體例子,略,網(wǎng)速太慢,至今還未下好。。

總結(jié)

以上是生活随笔為你收集整理的java性能调优工具--笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 公妇借种乱htp109cc | 综合色婷婷一区二区亚洲欧美国产 | 一个人在线观看免费视频www | 黄色精品视频 | av福利站| 久久久久久天堂 | 精品人妻久久久久久888不卡 | 国产精品国产三级国产 | 97精品久久久 | 日韩黄网站 | 日韩无套无码精品 | 国产夫妻在线视频 | 亚洲网站色 | 日韩av一二三区 | 蜜色视频 | 久久久精彩视频 | 成人久久久久久久 | 国产亚洲二区 | 在线视频亚洲色图 | 一区二区三区视频免费看 | 捆绑调教在线观看 | 成人国产a | 日韩中文一区二区 | 精品午夜视频 | 蜜桃av色偷偷av老熟女 | 欧美福利视频导航 | 可以免费在线观看的av | 国产午夜亚洲精品午夜鲁丝片 | 亚洲影视中文字幕 | www国产 | 日本在线看 | 日韩精品视频网 | 国产大学生自拍视频 | 自拍亚洲国产 | 亚洲综合欧美综合 | 精品久久久中文字幕 | 久久免费激情视频 | 久久久综合精品 | 欧美成人视屏 | 欧美精品网址 | 久久久久久综合网 | 亚洲污视频 | 国产男男一区二区三区 | 国产精品久久久久aaaa | 日韩美女一区 | 中国浓毛少妇毛茸茸 | 欧美深夜在线 | 国产伦精品一区二区三区四区 | 欧美另类tv | 日韩porn| 成年网站免费在线观看 | 丰满人妻一区二区三区精品高清 | 深夜久久久| 亚洲国产日韩欧美一区二区三区 | 99久久99久久精品国产片果冻 | av在线免播放器 | 欧美综合图区 | 波多野结衣一本 | 免费成人在线视频观看 | 亚洲欧美中文日韩在线观看 | 国产美女www | 老子午夜影院 | 亚洲综合免费观看高清完整版在线 | 久久婷综合| 麻豆美女视频 | 99久久久无码国产精品性青椒 | 国产在线拍揄自揄拍无码视频 | 欧美在线黄 | 成人国产免费视频 | 欧美日韩视频一区二区三区 | 欧美性日韩 | 国产精品久久久久久久久毛片 | 视频在线亚洲 | 国产a毛片| 欧美成本人视频 | 久草福利 | 色噜噜狠狠一区二区三区果冻 | 色婷婷av一区二区三区之红樱桃 | 影音av在线| 播放毛片| 女人18毛片一区二区三区 | 成人交配视频 | 一区二区三区四区不卡 | 波多野结衣一区二区三区在线观看 | 逼特逼视频在线观看 | 欧美大黑b| 好色艳妇小说 | 91亚洲免费 | 动漫女被黄漫免费视频 | 亚洲高清一区二区三区 | 精品一区亚洲 | 久久aⅴ国产欧美74aaa | 国产精品系列在线观看 | 韩日激情视频 | 自拍偷拍国内 | 不卡一区在线 | 国产偷人视频 | 亚洲一区,二区 | 美脚の诱脚舐め脚视频播放 |