成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

版本歷史與代碼示例之JMX

開發(fā) 后端
對于一個正在運(yùn)行的Java程序,我們希望管理和監(jiān)控它的狀態(tài),如:內(nèi)存、CPU使用率、線程數(shù)、垃圾回收情況等等,這時使用JMX便是一種非常優(yōu)雅的解決方案。

[[429706]]

前言

對于一個正在運(yùn)行的Java程序,我們希望管理和監(jiān)控它的狀態(tài),如:內(nèi)存、CPU使用率、線程數(shù)、垃圾回收情況等等,這時使用JMX便是一種非常優(yōu)雅的解決方案。你可能聽過JConsole、VisualVM等性能調(diào)優(yōu)工具,殊不知哥倆底層都依賴于它,本文就帶你走進(jìn)Java的管理擴(kuò)展:JMX。

[[429707]]

JMX既是Java管理系統(tǒng)的一個標(biāo)準(zhǔn),一個規(guī)范;也是一個接口,一個“框架”。有標(biāo)準(zhǔn)、有規(guī)范是為了讓開發(fā)者可以定制開發(fā)自己的擴(kuò)展功能,而且作為一個“框架”來講,JDK 已經(jīng)幫我們實現(xiàn)了常用的功能,尤其是對JVM本身的監(jiān)控和管理。

所屬專欄【方向盤】

-Java EE

相關(guān)下載

  • 【本專欄源代碼】:https://github.com/yourbatman/FXP-java-ee
  • 【技術(shù)專欄源代碼大本營】:https://github.com/yourbatman/tech-column-learning
  • 【女媧Knife-Initializr工程】訪問地址:http://152.136.106.14:8761
  • 【程序員專用網(wǎng)盤】公益上線啦,注冊送1G超小容量,幫你實踐做減法:https://wangpan.yourbatman.cn
  • 【Java開發(fā)軟件包(Mac)】:https://wangpan.yourbatman.cn/s/rEH0 提取碼:javakit

版本約定

  • Java EE:6、7、8
  • Jakarta EE:8、9、9.1

正文

JMX

JMX(Java Management Extensions,即Java管理擴(kuò)展)是一個為應(yīng)用程序、設(shè)備、系統(tǒng)等植入管理功能的框架。我們可以使用jmx對程序的運(yùn)行狀態(tài)進(jìn)行監(jiān)控和管理。

JMX是Java EE內(nèi)嵌(被內(nèi)嵌進(jìn)JRE里面了)的一套標(biāo)準(zhǔn)的代理和服務(wù),也就是說只要遵循這個接口標(biāo)準(zhǔn),那么就可以管理和監(jiān)控我們的應(yīng)用程序。為了標(biāo)準(zhǔn)化管理和監(jiān)控,Java平臺使用JMX作為管理和監(jiān)控的標(biāo)準(zhǔn)接口,任何程序,只要按JMX規(guī)范訪問這個接口,就可以獲取所有管理與監(jiān)控信息。常用的運(yùn)維監(jiān)控如Zabbix、Nagios等工具對JVM本身的監(jiān)控都是通過JMX獲取的信息。

JMX是一個標(biāo)準(zhǔn)接口,不但可以用于管理JVM,還可以管理應(yīng)用程序自身。

這是官方給出的JMX架構(gòu)圖:

由圖可知,JMX技術(shù)分為三層:

設(shè)備/資源層:這些被管理的資源就是MBean/MXBean們

代理層:MBeanServer就是代理層的最核心組件,MBean們均注冊到此處,讓它代理統(tǒng)一對外提供功能服務(wù)

  • 代理層其實就是一個獨(dú)立的Java線程

遠(yuǎn)程管理層:JMX技術(shù)可以通過多種不同的方式去訪問,每個適配器通過一個給定的協(xié)議來訪問MBeanServer中注冊的所有MBean們,比如Html協(xié)議、Http協(xié)議、JDK自己實現(xiàn)的RMI協(xié)議等

什么是MBean

MBean = Managed Bean。其的本質(zhì)就是我們經(jīng)常說的Java Bean,遵循Java Bean規(guī)范,只是它專門用于JMX所以稱為MBean。JMX把所有被管理的資源都稱為MBean,全部交由MBeanServer管理,JVM會將自身各種資源(CPU、內(nèi)存等)注冊到JMX中,自己也可自定義MBean然后放進(jìn)去,從而達(dá)到自定義監(jiān)控的能力。最后對外通過暴露RMI/HTTP協(xié)議提供訪問。

  • 說明:JMX不需要安裝任何額外組件,也不需要第三方庫,因為MBeanServer已經(jīng)內(nèi)置在JavaSE標(biāo)準(zhǔn)庫中了。

JDK提供的MBean主要都在java.lang.management 和 javax.management這兩個包里面,MBean一共分為四種類型:

1.Standard MBean:最常用、最簡單的一種,結(jié)構(gòu)和普通Java Bean沒有區(qū)別,管理接口通過方法名來描述。它只要遵循一定的命名規(guī)則即可注冊進(jìn)MBeanServer

  • 定義一個接口,該接口名稱必須為xxxMBean(必須以MBean為后綴結(jié)尾)
  • 寫該接口的實現(xiàn)類,然后將此實現(xiàn)類注冊進(jìn)MBeanServer即可

2.Dynamic MBean:在運(yùn)行期才定義它的屬性和方法,也就是說它有什么屬性和方法是可以動態(tài)改變的。所有的動態(tài)MBean必須實現(xiàn)DynamicMBean接口,然后注冊上去即可

  • 動態(tài)Bean的輔助類主要有MBeanConstructorInfo、MBeanAttributeInfo、MBeanOperationInfo等等
  • 動態(tài)Bean是一種妥協(xié)的產(chǎn)物,因為已經(jīng)存在一些MBean,而將其改造成標(biāo)準(zhǔn)MBean比較費(fèi)力而且不切實際,所以就用動態(tài)Bean妥協(xié)一下。自定義的時候幾乎不會使用

3.Open MBean:Open MBeans需實現(xiàn)DynamicMBean接口,與動態(tài)Bean不同的是提供了更復(fù)雜的metadata數(shù)據(jù),和在接口中,只使用了幾種預(yù)定義的通用數(shù)據(jù)類型:OpenMBeanInfo、OpenMBeanOperationInfo、OpenMBeanConstructorInfo、OpenMBeanParameterInfo、OpenMBeanAttributeInfo

4.Model MBean:如果不能修改已有的Java類,使用它是個不錯的選擇。通過實現(xiàn)接口javax.management.modelmbean.RequiredModelMBean,我們要做的就是實例化該類然后注冊即可實現(xiàn)對資源的管理

  • 編寫Model MBean的最大挑戰(zhàn)是告訴Model MBean對象托管資源的那些熟悉和方法可以暴露給代理層,ModelMBeanInfo對象描述了將會暴露給代理的構(gòu)造函數(shù)、屬性、操作甚至是監(jiān)聽器。

話外音:一般情況下,我們只需要了解Standard MBean即可。

MBean和MXBean區(qū)別

MBean與MXBean的區(qū)別主要是在于在接口中會引用到一些其他類型的類(復(fù)合類型)時,其表現(xiàn)方式的不一樣。

  • MBean:屬性不能是復(fù)合類型/自定義類型,否則不能被識別
  • MXBean:屬性可以是自定義類型。如JDK自帶的MemoryMXBean中定義了heapMemoryUsage屬性,它就是復(fù)合類型

什么是MBeanServer

顧名思義:用于管理MBean的“服務(wù)器”。一般來講一個JVM只有一個MBeanServer(通過ManagementFactory.getPlatformMBeanServer()這個API來獲得),用于管理該JVM內(nèi)所有的MBean,并且對外提供服務(wù)。

倘若需要多個MBeanServer(比如不同的domain),你可通過MBeanServerFactory.newMBeanServer(String domain)這個API來創(chuàng)建。

什么是Connector和Adaptor

當(dāng)MBean都注冊到MBeanServer上面后,功能已經(jīng)具備,就可以通過協(xié)議把這些功能暴露出去啦。針對不同的協(xié)議就有其對應(yīng)的Connector或者Adaptor(這里可把Connector和Adaptor認(rèn)為是相同的角色)。

所以,只要有連接器/適配器,可以通過多種協(xié)議將功能暴露出去,如Http協(xié)議、Saop協(xié)議、RMI等。JDK默認(rèn)實現(xiàn)的只有基于RMI的javax.management.remote.rmi.RMIConnector,像JConsole、VisualVM這類工具默認(rèn)是可直接連接訪問的。

注意:Spring Boot Actuator對其管理、監(jiān)控等端點(diǎn)提供Http和RMI(JMX)兩種訪問方式,但是其Http方式并非實現(xiàn)了Connector/Adaptor哦,甚至來講基于Http的操作方式都并非JMX方式(實為Endpoint方式),不要讓某些文章給誤導(dǎo)了哈。

既然有Http,JMX意義何在?

這個問題一度困擾過我,沒太想明白JMX存在的意義。誠然,JMX能完成的任務(wù)通過Http都能完成,只不過某些情況下用JMX來做會更加方便。簡單來講,Http更重,JMX更輕。

  • Http是一個更加抽象、應(yīng)用面更廣泛、功能更強(qiáng)大的協(xié)議/服務(wù),因此做的工作也會多一些。比如光方法它就有Get、Post、Put、Delete等等
  • JMX是一個更加具體、應(yīng)用面不那么廣、功能也沒有Http強(qiáng)大的協(xié)議/服務(wù)。所以它的優(yōu)點(diǎn)是輕便、好用

JMX的特點(diǎn)決定了它非常非常適合做資源監(jiān)控,因此各大監(jiān)控組件、框架為了監(jiān)控JVM的運(yùn)行情況,都會把JMX當(dāng)做首選,而Http協(xié)議只是為了產(chǎn)品化的備選。

  1. jmx被內(nèi)嵌入jdk/jre自帶,無需額外導(dǎo)包 

版本歷程

JMX伴隨著JDK 5的發(fā)布而出現(xiàn),之后其實也幾乎沒有變化,如下所示。

Java EE 5:

Java EE 8:

JSR 3的內(nèi)容基本和JSR 255沒變,可認(rèn)為一樣。

 生存現(xiàn)狀

高階必備。比如做監(jiān)控、JVM性能分析、調(diào)優(yōu)、問題定位等。

實現(xiàn)(框架)

代碼示例

雖說Demo示例才是重頭戲,但由于本文并非JMX專題,所以只會示例原生方式使用JMX,至于在Spring、Spring Boot、借助commons-modeler等使用,點(diǎn)到即止。

直接使用JDK內(nèi)置的MBean/MXBean

JDK內(nèi)置了“大量”的MBean,供你直接使用:

  • ClassLoadingMXBean:Java虛擬機(jī)的類加載系統(tǒng)。
  • CompilationMXBean:Java虛擬機(jī)的編譯系統(tǒng)。
  • MemoryMXBean:Java虛擬機(jī)的內(nèi)存系統(tǒng)。
  • ThreadMXBean:Java虛擬機(jī)的線程系統(tǒng)。
  • RuntimeMXBean:Java虛擬機(jī)的運(yùn)行時系統(tǒng)。
  • OperatingSystemMXBean:Java虛擬機(jī)在其上運(yùn)行的操作系統(tǒng)。
  • GarbageCollectorMXBean:Java虛擬機(jī)中的垃圾回收器。
  • MemoryManagerMXBean:Java虛擬機(jī)中的內(nèi)存管理器。
  • MemoryPoolMXBean:Java虛擬機(jī)中的內(nèi)存池。

這些實例通過ManagementFactory都可拿到。

  1. @Test 
  2. public void test1() { 
  3.     ClassLoadingMXBean classLoadingMXBean = ManagementFactory.getClassLoadingMXBean(); 
  4.     ObjectName objectName = classLoadingMXBean.getObjectName(); 
  5.     long totalLoadedClassCount = classLoadingMXBean.getTotalLoadedClassCount(); 
  6.     int loadedClassCount = classLoadingMXBean.getLoadedClassCount(); 
  7.     long unloadedClassCount = classLoadingMXBean.getUnloadedClassCount(); 
  8.  
  9.     System.out.println("objectName:" + objectName); 
  10.     System.out.println("JVM啟動共加載的Class類總數(shù)(一個類被加載多次):" + totalLoadedClassCount); 
  11.     System.out.println("JVM當(dāng)前狀態(tài)加載Class類總數(shù):" + loadedClassCount); 
  12.     System.out.println("JVM還未加載的Class類總數(shù):" + unloadedClassCount); 
  13.  
  14. objectName:java.lang:type=ClassLoading 
  15. JVM啟動共加載的Class類總數(shù)(一個類被加載多次):1743 
  16. JVM當(dāng)前狀態(tài)加載Class類總數(shù):1743 
  17. JVM還未加載的Class類總數(shù):0 
  1. @Test 
  2. public void test2() { 
  3.     RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean(); 
  4.     ObjectName objectName = runtimeMXBean.getObjectName(); 
  5.     String name = runtimeMXBean.getName(); 
  6.     // JVM信息 
  7.     String specVendor = runtimeMXBean.getSpecVendor(); 
  8.     String specName = runtimeMXBean.getSpecName(); 
  9.     String specVersion = runtimeMXBean.getSpecVersion(); 
  10.  
  11.     String bootClassPath = runtimeMXBean.getBootClassPath(); 
  12.     String classPath = runtimeMXBean.getClassPath(); 
  13.     String libraryPath = runtimeMXBean.getLibraryPath(); 
  14.  
  15.     System.out.println("objectName:" + objectName); 
  16.     System.out.println("運(yùn)行期名稱name:" + name); 
  17.     System.out.println("當(dāng)前JVM進(jìn)程ID:" + name.split("@")[0]); 
  18.     System.out.println("虛擬機(jī)信息:" + specVendor + ":" + specName + ":" + specVersion); 
  19.     // System.out.println("bootClassPath:" + bootClassPath); 
  20.     // System.out.println("classPath:" + classPath); 
  21.     // System.out.println("libraryPath:" + libraryPath); 
  22.  
  23. objectName:java.lang:type=Runtime 
  24. 運(yùn)行期名稱name:9966@YourBatman-MBA.local 
  25. 當(dāng)前JVM進(jìn)程ID:9966 
  26. 虛擬機(jī)信息:Oracle Corporation:Java Virtual Machine Specification:1.8 

RuntimeMXBean它常被用來獲取JVM進(jìn)程ID。

  1. @Test 
  2. public void test3() { 
  3.     // JVM內(nèi)存情況 
  4.     MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); 
  5.     ObjectName objectName = memoryMXBean.getObjectName(); 
  6.     MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage(); 
  7.     MemoryUsage nonHeapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage(); 
  8.  
  9.     System.out.println("objectName:" + objectName); 
  10.     System.out.println("已使用堆內(nèi)存:" + heapMemoryUsage); 
  11.     System.out.println("已使用非堆內(nèi)存:" + nonHeapMemoryUsage); 
  12.  
  13.     // 操作系統(tǒng)的內(nèi)存情況? 
  14.     long l = Runtime.getRuntime().totalMemory(); 
  15.     long l1 = Runtime.getRuntime().freeMemory(); 
  16.  
  17. objectName:java.lang:type=Memory 
  18. 已使用堆內(nèi)存:init = 268435456(262144K) used = 24183016(23616K) committed = 257425408(251392K) max = 3817865216(3728384K) 
  19. 已使用非堆內(nèi)存:init = 2555904(2496K) used = 12547040(12252K) committed = 13959168(13632K) max = -1(-1K) 

下面OperatingSystemMXBean是操作系統(tǒng)層面的信息:

  1. @Test 
  2. public void test4() { 
  3.     OperatingSystemMXBean osbean = ManagementFactory.getOperatingSystemMXBean(); 
  4.     System.out.println("操作系統(tǒng)體系結(jié)構(gòu):" + osbean.getArch()); 
  5.     System.out.println("操作系統(tǒng)名字:" + osbean.getName()); 
  6.     System.out.println("處理器數(shù)目:" + osbean.getAvailableProcessors()); 
  7.     System.out.println("操作系統(tǒng)版本:" + osbean.getVersion()); 
  8.  
  9.     ThreadMXBean threadBean = ManagementFactory.getThreadMXBean(); 
  10.     System.out.println("總線程數(shù):" + threadBean.getThreadCount());// 
  11.  
  12. 操作系統(tǒng)體系結(jié)構(gòu):aarch64 
  13. 操作系統(tǒng)名字:Mac OS X 
  14. 處理器數(shù)目:8 
  15. 操作系統(tǒng)版本:11.6 
  16. 總線程數(shù):4 

自定義MBean - 本地線程連接

除了以上系統(tǒng)自帶的MBean/MXBean,更重要的是自定義MBean:將普通User實體類暴露成為一個MBean。

  1. /** 
  2.  * MBean資源通過接口暴露,【一定必須】以MBean結(jié)尾才算一個MBean 
  3.  * 
  4.  * @author YourBatman. <a href=mailto:yourbatman@aliyun.com>Send email to me</a> 
  5.  * @site https://yourbatman.cn 
  6.  * @date 2021/10/18 21:14 
  7.  * @since 0.0.1 
  8.  */ 
  9. public interface UserMBean { 
  10.  
  11.     String getName(); 
  12.  
  13.     void setName(String name); 
  14.  
  15.     void setAge(int age); 

User實體類必須實現(xiàn)此接口:

  1. @Getter 
  2. @Setter 
  3. public class User implements UserMBean { 
  4.  
  5.     private String name
  6.     private int age; 
  7.  

將此MBean注冊到MBeanServer:

  1. @Test 
  2. public void test1() throws Exception { 
  3.     MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); 
  4.     ObjectName objectName = new ObjectName("com.yourbatman:type=UserXXX"); // 名字可任意取,但最好見名知意 
  5.     mBeanServer.registerMBean(new User(), objectName); 
  6.  
  7.     // 線程保活,方便獲取MBean 
  8.     Thread.sleep(Long.MAX_VALUE); 

使用JConsole即可連接到此線程:

鏈接上后即可以進(jìn)行“操作”啦:

自定義MBean - 遠(yuǎn)程連接

除了通過本地進(jìn)程連接外,JDK原生還支持通過RMI協(xié)議暴露,供以連接。我們只需要將其通過RMI協(xié)議暴露出去即可:

JMX并不限制通過上面協(xié)議暴露出去,只是JDK默認(rèn)只實現(xiàn)了RMI協(xié)議,夠用就好!

  1. @Test 
  2. public void test2() throws Exception { 
  3.     MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); 
  4.  
  5.     LocateRegistry.createRegistry(9090); // 這一步不能少,不需要返回值 
  6.     JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://127.0.0.1:9090/userXXX"); 
  7.     JMXConnectorServer cntorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mBeanServer); 
  8.     cntorServer.start(); 
  9.  
  10.     ObjectName objectName = new ObjectName("com.yourbatman:type=UserXXX"); 
  11.     mBeanServer.registerMBean(new User(), objectName); 
  12.  
  13.     // 線程?;?,方便獲取MBean 
  14.     Thread.sleep(Long.MAX_VALUE); 

使用JConsole通過RMI協(xié)議遠(yuǎn)程連接:

自定義MBean - 編程方式連接

除了通過JConsole這類工具連接外,通過編程方式也是能夠通過JMX搞的。畢竟RMI協(xié)議用Java可以直接操作嘛:

  1. @Test 
  2. public void test1() throws Exception { 
  3.     JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://127.0.0.1:9090/userXXX"); 
  4.     JMXConnector conn = JMXConnectorFactory.connect(url, null); 
  5.  
  6.     UserMBean userMBean = JMX.newMBeanProxy(conn.getMBeanServerConnection(), new ObjectName("com.yourbatman:type=UserXXX"), UserMBean.class); 
  7.     System.out.println("通過RMI協(xié)議拿到:" + userMBean); 
  8.     System.out.println("user的名字:" + userMBean.getName()); 
  9.  
  10.     conn.close(); 
  11.  
  12. 通過RMI協(xié)議拿到:MBeanProxy(javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection@706a04ae[com.yourbatman:type=UserXXX]) 
  13. user的名字:null 

注意:執(zhí)行client前請確保Server端已啟動,否則會連接失敗!

自定義MBean - 遠(yuǎn)程連接(啟動參數(shù)方式)

對于已打好的Jar包/war包,不可能改其代碼再讓其支持JMX遠(yuǎn)程連接。這時,我們可以通過啟動參數(shù)方式來開啟遠(yuǎn)程連接。這些啟動參數(shù)一般放在命令行、環(huán)境變量里。

  1. java  
  2.  
  3. -Djava.rmi.server.hostname=你的主機(jī) 
  4. -Dcom.sun.management.jmxremote.port=端口號 
  5. -Dcom.sun.management.jmxremote.ssl=false 
  6. -Dcom.sun.management.jmxremote.authenticate=false 
  7.  
  8. -jar xxx.jar 

總結(jié)

JMX是Java EE規(guī)范、JDK提供的一個小工具,使用起來不難但能量不小,推薦你可花點(diǎn)時間學(xué)習(xí)學(xué)習(xí)、寫一寫、用一用以發(fā)揮效用,向高級進(jìn)階。

其實JMX并不“稀有”,它存在于很多流行軟件/中間件里:Kafka、Spring Boot、RocketMQ,以及Logback都可看到JMX的影子,實現(xiàn)了很好的功能。如:使用JMX(無需重啟)動態(tài)更改Logback的日志級別。

關(guān)于JMX的內(nèi)容,本文點(diǎn)到即止。若你在Spring/Spring Boot場景下開發(fā),依托于Spring的抽象能力,“集成/使用”JMX將變得更加容易,期待你的探索,以后有機(jī)會我們再聊此專題。

本文轉(zhuǎn)載自微信公眾號「Java方向盤」

 

責(zé)任編輯:姜華 來源: Java方向盤
相關(guān)推薦

2021-09-15 18:54:22

BATutopia-JWebSocket

2021-10-11 08:51:50

JavaMailJDBCJava

2021-10-08 06:50:32

版本歷史代碼

2021-09-13 18:39:50

ServeltELJSP

2021-10-25 08:16:20

Java JAX-RS Java 基礎(chǔ)

2024-09-03 10:35:31

JMXJava框架

2017-10-31 12:56:52

Androidios谷歌

2023-09-05 07:02:25

開源工具應(yīng)用程序

2023-09-04 00:05:27

JMX管理組件

2010-03-23 14:12:43

Python開發(fā)Win

2011-08-16 16:37:40

Oracle數(shù)據(jù)庫樹形查詢根節(jié)點(diǎn)

2010-04-09 18:02:31

Oracle創(chuàng)建

2024-10-09 17:12:34

2010-03-23 13:30:36

Python VIM

2010-04-16 09:27:18

Ocacle執(zhí)行計劃

2011-08-25 14:38:14

SQL Server修改表結(jié)構(gòu)字段類型

2018-01-02 13:30:04

代碼質(zhì)量代碼預(yù)言

2023-11-09 16:13:00

TypeScript前端

2024-06-03 00:00:20

.NET定時器

2012-04-19 14:41:39

安騰惠普HP
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 国产精品伦理一区二区三区 | 亚洲人成网站777色婷婷 | 九九热精品在线视频 | 成人h片在线观看 | 久久久久久久久久久久91 | 污片在线免费观看 | 久在线| 免费99精品国产自在在线 | 午夜电影福利 | 啪啪免费网 | 日韩三级在线观看 | 国产精品亚洲一区二区三区在线观看 | 精品国产99 | 第一色在线 | 亚洲日本激情 | 免费视频99 | 久久中文字幕av | 成年免费在线观看 | 国产人成精品一区二区三 | 久久高清 | 99riav3国产精品视频 | 一区亚洲 | 九九热在线视频观看这里只有精品 | av性色全交蜜桃成熟时 | 国产福利网站 | 久热精品视频 | 亚洲www啪成人一区二区麻豆 | 在线观看精品视频网站 | 性一交一乱一伦视频免费观看 | 午夜激情免费视频 | 国产免费人成xvideos视频 | 中文字幕精品一区二区三区精品 | 亚洲欧美视频一区 | 国产电影一区二区三区爱妃记 | 成人不卡视频 | 亚洲天天干 | 成人午夜电影在线观看 | www亚洲精品| 久久精品国产久精国产 | 国产精品波多野结衣 | 精品一区二区在线看 |