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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

一篇年薪60万的JVM性能调优文章

發(fā)布時(shí)間:2023/12/6 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一篇年薪60万的JVM性能调优文章 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

?

JVM 調(diào)優(yōu)概述

性能定義

  • 吞吐量 - 指不考慮 GC 引起的停頓時(shí)間或內(nèi)存消耗,垃圾收集器能支撐應(yīng)用達(dá)到的最高性能指標(biāo)。
  • 延遲 - 其度量標(biāo)準(zhǔn)是縮短由于垃圾啊收集引起的停頓時(shí)間或者完全消除因垃圾收集所引起的停頓,避免應(yīng)用運(yùn)行時(shí)發(fā)生抖動(dòng)。
  • 內(nèi)存占用 - 垃圾收集器流暢運(yùn)行所需要的內(nèi)存數(shù)量。

調(diào)優(yōu)原則

GC 優(yōu)化的兩個(gè)目標(biāo):

  • 將進(jìn)入老年代的對(duì)象數(shù)量降到最低
  • 減少 Full GC 的執(zhí)行時(shí)間
  • GC 優(yōu)化的基本原則是:將不同的 GC 參數(shù)應(yīng)用到兩個(gè)及以上的服務(wù)器上然后比較它們的性能,然后將那些被證明可以提高性能或減少 GC 執(zhí)行時(shí)間的參數(shù)應(yīng)用于最終的工作服務(wù)器上。

    將進(jìn)入老年代的對(duì)象數(shù)量降到最低

    除了可以在 JDK7 及更高版本中使用的 G1 收集器以外,其他分代 GC 都是由 Oracle JVM 提供的。關(guān)于分代 GC,就是對(duì)象在 Eden 區(qū)被創(chuàng)建,隨后被轉(zhuǎn)移到 Survivor 區(qū),在此之后剩余的對(duì)象會(huì)被轉(zhuǎn)入老年代。也有一些對(duì)象由于占用內(nèi)存過(guò)大,在 Eden 區(qū)被創(chuàng)建后會(huì)直接被傳入老年代。老年代 GC 相對(duì)來(lái)說(shuō)會(huì)比新生代 GC 更耗時(shí),因此,減少進(jìn)入老年代的對(duì)象數(shù)量可以顯著降低 Full GC 的頻率。你可能會(huì)以為減少進(jìn)入老年代的對(duì)象數(shù)量意味著把它們留在新生代,事實(shí)正好相反,新生代內(nèi)存的大小是可以調(diào)節(jié)的。

    降低 Full GC 的時(shí)間

    Full GC 的執(zhí)行時(shí)間比 Minor GC 要長(zhǎng)很多,因此,如果在 Full GC 上花費(fèi)過(guò)多的時(shí)間(超過(guò) 1s),將可能出現(xiàn)超時(shí)錯(cuò)誤。

    • 如果通過(guò)減小老年代內(nèi)存來(lái)減少 Full GC 時(shí)間,可能會(huì)引起 OutOfMemoryError 或者導(dǎo)致 Full GC 的頻率升高。
    • 另外,如果通過(guò)增加老年代內(nèi)存來(lái)降低 Full GC 的頻率,Full GC 的時(shí)間可能因此增加。

    因此,你需要把老年代的大小設(shè)置成一個(gè)“合適”的值

    GC 優(yōu)化需要考慮的 JVM 參數(shù)

    類(lèi)型參數(shù)描述
    堆內(nèi)存大小-Xms啟動(dòng) JVM 時(shí)堆內(nèi)存的大小
    ?-Xmx堆內(nèi)存最大限制
    新生代空間大小-XX:NewRatio新生代和老年代的內(nèi)存比
    ?-XX:NewSize新生代內(nèi)存大小
    ?-XX:SurvivorRatioEden 區(qū)和 Survivor 區(qū)的內(nèi)存比

    GC 優(yōu)化時(shí)最常用的參數(shù)是-Xms,-Xmx和-XX:NewRatio。-Xms和-Xmx參數(shù)通常是必須的,所以NewRatio的值將對(duì) GC 性能產(chǎn)生重要的影響。

    有些人可能會(huì)問(wèn)如何設(shè)置永久代內(nèi)存大小,你可以用-XX:PermSize和-XX:MaxPermSize參數(shù)來(lái)進(jìn)行設(shè)置,但是要記住,只有當(dāng)出現(xiàn)OutOfMemoryError錯(cuò)誤時(shí)你才需要去設(shè)置永久代內(nèi)存。

    GC 優(yōu)化的過(guò)程

    GC 優(yōu)化的過(guò)程和大多數(shù)常見(jiàn)的提升性能的過(guò)程相似,下面是筆者使用的流程:

    1.監(jiān)控 GC 狀態(tài)

    你需要監(jiān)控 GC 從而檢查系統(tǒng)中運(yùn)行的 GC 的各種狀態(tài)。

    2.分析監(jiān)控結(jié)果后決定是否需要優(yōu)化 GC

    在檢查 GC 狀態(tài)后,你需要分析監(jiān)控結(jié)構(gòu)并決定是否需要進(jìn)行 GC 優(yōu)化。如果分析結(jié)果顯示運(yùn)行 GC 的時(shí)間只有 0.1-0.3 秒,那么就不需要把時(shí)間浪費(fèi)在 GC 優(yōu)化上,但如果運(yùn)行 GC 的時(shí)間達(dá)到 1-3 秒,甚至大于 10 秒,那么 GC 優(yōu)化將是很有必要的。

    但是,如果你已經(jīng)分配了大約 10GB 內(nèi)存給 Java,并且這些內(nèi)存無(wú)法省下,那么就無(wú)法進(jìn)行 GC 優(yōu)化了。在進(jìn)行 GC 優(yōu)化之前,你需要考慮為什么你需要分配這么大的內(nèi)存空間,如果你分配了 1GB 或 2GB 大小的內(nèi)存并且出現(xiàn)了OutOfMemoryError,那你就應(yīng)該執(zhí)行**堆快照(heap dump)**來(lái)消除導(dǎo)致異常的原因。

    注意:

    **堆快照(heap dump)**是一個(gè)用來(lái)檢查 Java 內(nèi)存中的對(duì)象和數(shù)據(jù)的內(nèi)存文件。該文件可以通過(guò)執(zhí)行 JDK 中的jmap命令來(lái)創(chuàng)建。在創(chuàng)建文件的過(guò)程中,所有 Java 程序都將暫停,因此,不要在系統(tǒng)執(zhí)行過(guò)程中創(chuàng)建該文件。

    你可以在互聯(lián)網(wǎng)上搜索 heap dump 的詳細(xì)說(shuō)明。

    3.設(shè)置 GC 類(lèi)型/內(nèi)存大小

    如果你決定要進(jìn)行 GC 優(yōu)化,那么你需要選擇一個(gè) GC 類(lèi)型并且為它設(shè)置內(nèi)存大小。此時(shí)如果你有多個(gè)服務(wù)器,請(qǐng)如上文提到的那樣,在每臺(tái)機(jī)器上設(shè)置不同的 GC 參數(shù)并分析它們的區(qū)別。

    4.分析結(jié)果

    在設(shè)置完 GC 參數(shù)后就可以開(kāi)始收集數(shù)據(jù),請(qǐng)?jiān)谑占辽?24 小時(shí)后再進(jìn)行結(jié)果分析。如果你足夠幸運(yùn),你可能會(huì)找到系統(tǒng)的最佳 GC 參數(shù)。如若不然,你還需要分析輸出日志并檢查分配的內(nèi)存,然后需要通過(guò)不斷調(diào)整 GC 類(lèi)型/內(nèi)存大小來(lái)找到系統(tǒng)的最佳參數(shù)。

    5.如果結(jié)果令人滿(mǎn)意,將參數(shù)應(yīng)用到所有服務(wù)器上并結(jié)束 GC 優(yōu)化

    如果 GC 優(yōu)化的結(jié)果令人滿(mǎn)意,就可以將參數(shù)應(yīng)用到所有服務(wù)器上,并停止 GC 優(yōu)化。

    在下面的章節(jié)中,你將會(huì)看到上述每一步所做的具體工作。

    命令

    jmap

    jmap 即 JVM Memory Map。

    jmap 用于生成 heap dump 文件

    如果不使用這個(gè)命令,還可以使用?-XX:+HeapDumpOnOutOfMemoryError?參數(shù)來(lái)讓虛擬機(jī)出現(xiàn) OOM 的時(shí)候,自動(dòng)生成 dump 文件。

    jmap 不僅能生成 dump 文件,還可以查詢(xún) finalize 執(zhí)行隊(duì)列、Java 堆和永久代的詳細(xì)信息,如當(dāng)前使用率、當(dāng)前使用的是哪種收集器等。

    命令格式:

    jmap [option] LVMID

    option 參數(shù):

    • dump - 生成堆轉(zhuǎn)儲(chǔ)快照
    • finalizerinfo - 顯示在 F-Queue 隊(duì)列等待 Finalizer 線(xiàn)程執(zhí)行 finalizer 方法的對(duì)象
    • heap - 顯示 Java 堆詳細(xì)信息
    • histo - 顯示堆中對(duì)象的統(tǒng)計(jì)信息
    • permstat - to print permanent generation statistics
    • F - 當(dāng)-dump 沒(méi)有響應(yīng)時(shí),強(qiáng)制生成 dump 快照

    示例:jmap -dump PID 生成堆快照

    dump 堆到文件,format 指定輸出格式,live 指明是活著的對(duì)象,file 指定文件名

    $ jmap -dump:live,format=b,file=dump.hprof 28920 Dumping heap to /home/xxx/dump.hprof ... Heap dump file created

    dump.hprof 這個(gè)后綴是為了后續(xù)可以直接用 MAT(Memory Anlysis Tool)打開(kāi)。

    示例:jmap -heap 查看指定進(jìn)程的堆信息

    注意:使用 CMS GC 情況下,jmap -heap 的執(zhí)行有可能會(huì)導(dǎo)致 java 進(jìn)程掛起。

    jmap -heap PID [root@chances bin]# ./jmap -heap 12379 Attaching to process ID 12379, please wait... Debugger attached successfully. Server compiler detected. JVM version is 17.0-b16using thread-local object allocation. Parallel GC with 6 thread(s)Heap Configuration:MinHeapFreeRatio = 40MaxHeapFreeRatio = 70MaxHeapSize = 83886080 (80.0MB)NewSize = 1310720 (1.25MB)MaxNewSize = 17592186044415 MBOldSize = 5439488 (5.1875MB)NewRatio = 2SurvivorRatio = 8PermSize = 20971520 (20.0MB)MaxPermSize = 88080384 (84.0MB)Heap Usage: PS Young Generation Eden Space:capacity = 9306112 (8.875MB)used = 5375360 (5.1263427734375MB)free = 3930752 (3.7486572265625MB)57.761608714788736% used From Space:capacity = 9306112 (8.875MB)used = 3425240 (3.2665634155273438MB)free = 5880872 (5.608436584472656MB)36.80634834397007% used To Space:capacity = 9306112 (8.875MB)used = 0 (0.0MB)free = 9306112 (8.875MB)0.0% used PS Old Generationcapacity = 55967744 (53.375MB)used = 48354640 (46.11457824707031MB)free = 7613104 (7.2604217529296875MB)86.39733629427693% used PS Perm Generationcapacity = 62062592 (59.1875MB)used = 60243112 (57.452308654785156MB)free = 1819480 (1.7351913452148438MB)97.06831451706046% used

    jstack

    jstack 用于生成 java 虛擬機(jī)當(dāng)前時(shí)刻的線(xiàn)程快照。

    線(xiàn)程快照是當(dāng)前 java 虛擬機(jī)內(nèi)每一條線(xiàn)程正在執(zhí)行的方法堆棧的集合,生成線(xiàn)程快照的主要目的是定位線(xiàn)程出現(xiàn)長(zhǎng)時(shí)間停頓的原因,如線(xiàn)程間死鎖、死循環(huán)、請(qǐng)求外部資源導(dǎo)致的長(zhǎng)時(shí)間等待等。

    線(xiàn)程出現(xiàn)停頓的時(shí)候通過(guò) jstack 來(lái)查看各個(gè)線(xiàn)程的調(diào)用堆棧,就可以知道沒(méi)有響應(yīng)的線(xiàn)程到底在后臺(tái)做什么事情,或者等待什么資源。 如果 java 程序崩潰生成 core 文件,jstack 工具可以用來(lái)獲得 core 文件的 java stack 和 native stack 的信息,從而可以輕松地知道 java 程序是如何崩潰和在程序何處發(fā)生問(wèn)題。另外,jstack 工具還可以附屬到正在運(yùn)行的 java 程序中,看到當(dāng)時(shí)運(yùn)行的 java 程序的 java stack 和 native stack 的信息, 如果現(xiàn)在運(yùn)行的 java 程序呈現(xiàn) hung 的狀態(tài),jstack 是非常有用的。

    命令格式:

    jstack [option] LVMID

    option 參數(shù):

    • -F?- 當(dāng)正常輸出請(qǐng)求不被響應(yīng)時(shí),強(qiáng)制輸出線(xiàn)程堆棧
    • -l?- 除堆棧外,顯示關(guān)于鎖的附加信息
    • -m?- 如果調(diào)用到本地方法的話(huà),可以顯示 C/C++的堆棧

    jps

    jps(JVM Process Status Tool),顯示指定系統(tǒng)內(nèi)所有的 HotSpot 虛擬機(jī)進(jìn)程。

    命令格式:

    jps [options] [hostid]

    option 參數(shù):

    • -l?- 輸出主類(lèi)全名或 jar 路徑
    • -q?- 只輸出 LVMID
    • -m?- 輸出 JVM 啟動(dòng)時(shí)傳遞給 main()的參數(shù)
    • -v?- 輸出 JVM 啟動(dòng)時(shí)顯示指定的 JVM 參數(shù)

    其中[option]、[hostid]參數(shù)也可以不寫(xiě)。

    $ jps -l -m 28920 org.apache.catalina.startup.Bootstrap start 11589 org.apache.catalina.startup.Bootstrap start 25816 sun.tools.jps.Jps -l -m

    jstat

    jstat(JVM statistics Monitoring),是用于監(jiān)視虛擬機(jī)運(yùn)行時(shí)狀態(tài)信息的命令,它可以顯示出虛擬機(jī)進(jìn)程中的類(lèi)裝載、內(nèi)存、垃圾收集、JIT 編譯等運(yùn)行數(shù)據(jù)。

    命令格式:

    jstat [option] LVMID [interval] [count]

    參數(shù):

    • [option] - 操作參數(shù)
    • LVMID - 本地虛擬機(jī)進(jìn)程 ID
    • [interval] - 連續(xù)輸出的時(shí)間間隔
    • [count] - 連續(xù)輸出的次數(shù)

    jhat

    jhat(JVM Heap Analysis Tool),是與 jmap 搭配使用,用來(lái)分析 jmap 生成的 dump,jhat 內(nèi)置了一個(gè)微型的 HTTP/HTML 服務(wù)器,生成 dump 的分析結(jié)果后,可以在瀏覽器中查看。

    注意:一般不會(huì)直接在服務(wù)器上進(jìn)行分析,因?yàn)?jhat 是一個(gè)耗時(shí)并且耗費(fèi)硬件資源的過(guò)程,一般把服務(wù)器生成的 dump 文件復(fù)制到本地或其他機(jī)器上進(jìn)行分析。

    命令格式:

    jhat [dumpfile]

    jinfo

    jinfo(JVM Configuration info),用于實(shí)時(shí)查看和調(diào)整虛擬機(jī)運(yùn)行參數(shù)。

    之前的 jps -v 口令只能查看到顯示指定的參數(shù),如果想要查看未被顯示指定的參數(shù)的值就要使用 jinfo 口令

    命令格式:

    jinfo [option] [args] LVMID

    option 參數(shù):

    • -flag : 輸出指定 args 參數(shù)的值
    • -flags : 不需要 args 參數(shù),輸出所有 JVM 參數(shù)的值
    • -sysprops : 輸出系統(tǒng)屬性,等同于 System.getProperties()

    HotSpot VM 參數(shù)

    詳細(xì)參數(shù)說(shuō)明請(qǐng)參考官方文檔:Java HotSpot VM Options,這里僅列舉常用參數(shù)。

    JVM 內(nèi)存配置

    配置描述
    -Xms堆空間初始值。
    -Xmx堆空間最大值。
    -XX:NewSize新生代空間初始值。
    -XX:MaxNewSize新生代空間最大值。
    -Xmn新生代空間大小。
    -XX:PermSize永久代空間的初始值。
    -XX:MaxPermSize永久代空間的最大值。

    GC 類(lèi)型配置

    配置描述
    -XX:+UseSerialGC串行垃圾回收器
    -XX:+UseParallelGC并行垃圾回收器
    -XX:+UseParNewGC使用 ParNew + Serial Old 垃圾回收器組合
    -XX:+UseConcMarkSweepGC并發(fā)標(biāo)記掃描垃圾回收器
    -XX:ParallelCMSThreads=并發(fā)標(biāo)記掃描垃圾回收器 = 為使用的線(xiàn)程數(shù)量
    -XX:+UseG1GCG1 垃圾回收器

    輔助配置

    配置描述
    -XX:+PrintGCDetails打印 GC 日志
    -Xloggc:<filename>指定 GC 日志文件名
    -XX:+HeapDumpOnOutOfMemoryError內(nèi)存溢出時(shí)輸出堆快照文件

    典型配置

    堆大小設(shè)置

    年輕代的設(shè)置很關(guān)鍵。

    JVM 中最大堆大小有三方面限制:

  • 相關(guān)操作系統(tǒng)的數(shù)據(jù)模型(32-bt 還是 64-bit)限制;
  • 系統(tǒng)的可用虛擬內(nèi)存限制;
  • 系統(tǒng)的可用物理內(nèi)存限制。
  • 整個(gè)堆大小 = 年輕代大小 + 年老代大小 + 持久代大小
    • 持久代一般固定大小為 64m。使用?-XX:PermSize?設(shè)置。
    • 官方推薦年輕代占整個(gè)堆的 3/8。使用?-Xmn?設(shè)置。

    回收器選擇

    JVM 給了三種選擇:串行收集器、并行收集器、并發(fā)收集器。

    JVM 實(shí)戰(zhàn)

    分析 GC 日志

    獲取 GC 日志

    獲取 GC 日志有兩種方式:

    • 使用命令動(dòng)態(tài)查看
    • 在容器中設(shè)置相關(guān)參數(shù)打印 GC 日志

    jstat -gc?統(tǒng)計(jì)垃圾回收堆的行為:

    jstat -gc 1262S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT 26112.0 24064.0 6562.5 0.0 564224.0 76274.5 434176.0 388518.3 524288.0 42724.7 320 6.417 1 0.398 6.815

    也可以設(shè)置間隔固定時(shí)間來(lái)打印:

    $ jstat -gc 1262 2000 20

    這個(gè)命令意思就是每隔 2000ms 輸出 1262 的 gc 情況,一共輸出 20 次

    Tomcat 設(shè)置示例:

    JAVA_OPTS="-server -Xms2000m -Xmx2000m -Xmn800m -XX:PermSize=64m -XX:MaxPermSize=256m -XX:SurvivorRatio=4 -verbose:gc -Xloggc:$CATALINA_HOME/logs/gc.log -Djava.awt.headless=true -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Dsun.rmi.dgc.server.gcInterval=600000 -Dsun.rmi.dgc.client.gcInterval=600000 -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15"
    • -Xms2000m -Xmx2000m -Xmn800m -XX:PermSize=64m -XX:MaxPermSize=256m?Xms,即為 jvm 啟動(dòng)時(shí)得 JVM 初始堆大小,Xmx 為 jvm 的最大堆大小,xmn 為新生代的大小,permsize 為永久代的初始大小,MaxPermSize 為永久代的最大空間。
    • -XX:SurvivorRatio=4?SurvivorRatio 為新生代空間中的 Eden 區(qū)和救助空間 Survivor 區(qū)的大小比值,默認(rèn)是 8,則兩個(gè) Survivor 區(qū)與一個(gè) Eden 區(qū)的比值為 2:8,一個(gè) Survivor 區(qū)占整個(gè)年輕代的 1/10。調(diào)小這個(gè)參數(shù)將增大 survivor 區(qū),讓對(duì)象盡量在 survitor 區(qū)呆長(zhǎng)一點(diǎn),減少進(jìn)入年老代的對(duì)象。去掉救助空間的想法是讓大部分不能馬上回收的數(shù)據(jù)盡快進(jìn)入年老代,加快年老代的回收頻率,減少年老代暴漲的可能性,這個(gè)是通過(guò)將-XX:SurvivorRatio 設(shè)置成比較大的值(比如 65536)來(lái)做到。
    • -verbose:gc -Xloggc:$CATALINA_HOME/logs/gc.log?將虛擬機(jī)每次垃圾回收的信息寫(xiě)到日志文件中,文件名由 file 指定,文件格式是平文件,內(nèi)容和-verbose:gc 輸出內(nèi)容相同。
    • -Djava.awt.headless=true?Headless 模式是系統(tǒng)的一種配置模式。在該模式下,系統(tǒng)缺少了顯示設(shè)備、鍵盤(pán)或鼠標(biāo)。
    • -XX:+PrintGCTimeStamps -XX:+PrintGCDetails?設(shè)置 gc 日志的格式
    • -Dsun.rmi.dgc.server.gcInterval=600000 -Dsun.rmi.dgc.client.gcInterval=600000?指定 rmi 調(diào)用時(shí) gc 的時(shí)間間隔
    • -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15?采用并發(fā) gc 方式,經(jīng)過(guò) 15 次 minor gc 后進(jìn)入年老代

    如何分析 GC 日志

    Young GC 回收日志:

    2016-07-05T10:43:18.093+0800: 25.395: [GC [PSYoungGen: 274931K->10738K(274944K)] 371093K->147186K(450048K), 0.0668480 secs] [Times: user=0.17 sys=0.08, real=0.07 secs]

    Full GC 回收日志:

    2016-07-05T10:43:18.160+0800: 25.462: [Full GC [PSYoungGen: 10738K->0K(274944K)] [ParOldGen: 136447K->140379K(302592K)] 147186K->140379K(577536K) [PSPermGen: 85411K->85376K(171008K)], 0.6763541 secs] [Times: user=1.75 sys=0.02, real=0.68 secs]

    通過(guò)上面日志分析得出,PSYoungGen、ParOldGen、PSPermGen 屬于 Parallel 收集器。其中 PSYoungGen 表示 gc 回收前后年輕代的內(nèi)存變化;ParOldGen 表示 gc 回收前后老年代的內(nèi)存變化;PSPermGen 表示 gc 回收前后永久區(qū)的內(nèi)存變化。young gc 主要是針對(duì)年輕代進(jìn)行內(nèi)存回收比較頻繁,耗時(shí)短;full gc 會(huì)對(duì)整個(gè)堆內(nèi)存進(jìn)行回城,耗時(shí)長(zhǎng),因此一般盡量減少 full gc 的次數(shù)

    通過(guò)兩張圖非常明顯看出 gc 日志構(gòu)成:

    OutOfMemory(OOM)分析

    OutOfMemory ,即內(nèi)存溢出,是一個(gè)常見(jiàn)的 JVM 問(wèn)題。那么分析 OOM 的思路是什么呢?

    首先,要知道有三種 OutOfMemoryError:

    • OutOfMemoryError:Java heap space?- 堆空間溢出
    • OutOfMemoryError:PermGen space?- 方法區(qū)和運(yùn)行時(shí)常量池溢出
    • OutOfMemoryError:unable to create new native thread?- 線(xiàn)程過(guò)多

    OutOfMemoryError:PermGen space

    OutOfMemoryError:PermGen space 表示方法區(qū)和運(yùn)行時(shí)常量池溢出。

    原因:

    Perm 區(qū)主要用于存放 Class 和 Meta 信息的,Class 在被 Loader 時(shí)就會(huì)被放到 PermGen space,這個(gè)區(qū)域稱(chēng)為年老代。GC 在主程序運(yùn)行期間不會(huì)對(duì)年老區(qū)進(jìn)行清理,默認(rèn)是 64M 大小。

    當(dāng)程序程序中使用了大量的 jar 或 class,使 java 虛擬機(jī)裝載類(lèi)的空間不夠,超過(guò) 64M 就會(huì)報(bào)這部分內(nèi)存溢出了,需要加大內(nèi)存分配,一般 128m 足夠。

    解決方案:

    (1)擴(kuò)大永久代空間

    • JDK7 以前使用?-XX:PermSize?和?-XX:MaxPermSize?來(lái)控制永久代大小。
    • JDK8 以后把原本放在永久代的字符串常量池移出, 放在 Java 堆中(元空間 Metaspace)中,元數(shù)據(jù)并不在虛擬機(jī)中,使用的是本地的內(nèi)存。使用?-XX:MetaspaceSize?和?-XX:MaxMetaspaceSize?控制元空間大小。

    注意:-XX:PermSize?一般設(shè)為 64M

    (2)清理應(yīng)用程序中?WEB-INF/lib?下的 jar,用不上的 jar 刪除掉,多個(gè)應(yīng)用公共的 jar 移動(dòng)到 Tomcat 的 lib 目錄,減少重復(fù)加載。

    OutOfMemoryError:Java heap space

    OutOfMemoryError:Java heap space 表示堆空間溢出。

    原因:JVM 分配給堆內(nèi)存的空間已經(jīng)用滿(mǎn)了。

    問(wèn)題定位

    (1)使用 jmap 或 -XX:+HeapDumpOnOutOfMemoryError 獲取堆快照。 (2)使用內(nèi)存分析工具(visualvm、mat、jProfile 等)對(duì)堆快照文件進(jìn)行分析。 (3)根據(jù)分析圖,重點(diǎn)是確認(rèn)內(nèi)存中的對(duì)象是否是必要的,分清究竟是是內(nèi)存泄漏(Memory Leak)還是內(nèi)存溢出(Memory Overflow)。

    內(nèi)存泄露

    內(nèi)存泄漏是指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存的情況。

    內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,由于設(shè)計(jì)錯(cuò)誤,失去了對(duì)該段內(nèi)存的控制,因而造成了內(nèi)存的浪費(fèi)。

    內(nèi)存泄漏隨著被執(zhí)行的次數(shù)越多-最終會(huì)導(dǎo)致內(nèi)存溢出。

    而因程序死循環(huán)導(dǎo)致的不斷創(chuàng)建對(duì)象-只要被執(zhí)行到就會(huì)產(chǎn)生內(nèi)存溢出。

    內(nèi)存泄漏常見(jiàn)幾個(gè)情況:

    • 靜態(tài)集合類(lèi)
      • 聲明為靜態(tài)(static)的 HashMap、Vector 等集合
      • 通俗來(lái)講 A 中有 B,當(dāng)前只把 B 設(shè)置為空,A 沒(méi)有設(shè)置為空,回收時(shí) B 無(wú)法回收-因被 A 引用。
    • 監(jiān)聽(tīng)器
      • 監(jiān)聽(tīng)器被注冊(cè)后釋放對(duì)象時(shí)沒(méi)有刪除監(jiān)聽(tīng)器
    • 物理連接
      • DataSource.getConnection()建立鏈接,必須通過(guò) close()關(guān)閉鏈接
    • 內(nèi)部類(lèi)和外部模塊等的引用
      • 發(fā)現(xiàn)它的方式同內(nèi)存溢出,可再加個(gè)實(shí)時(shí)觀察
      • jstat -gcutil 7362 2500 70

    重點(diǎn)關(guān)注:

    • FGC — 從應(yīng)用程序啟動(dòng)到采樣時(shí)發(fā)生 Full GC 的次數(shù)。
    • FGCT — 從應(yīng)用程序啟動(dòng)到采樣時(shí) Full GC 所用的時(shí)間(單位秒)。
    • FGC 次數(shù)越多,FGCT 所需時(shí)間越多-可非常有可能存在內(nèi)存泄漏。

    解決方案

    (1)檢查程序,看是否有死循環(huán)或不必要地重復(fù)創(chuàng)建大量對(duì)象。有則改之。

    下面是一個(gè)重復(fù)創(chuàng)建內(nèi)存的示例:

    public class OOM {public static void main(String[] args) {Integer sum1=300000;Integer sum2=400000;OOM oom = new OOM();System.out.println("往ArrayList中加入30w內(nèi)容");oom.javaHeapSpace(sum1);oom.memoryTotal();System.out.println("往ArrayList中加入40w內(nèi)容");oom.javaHeapSpace(sum2);oom.memoryTotal();}public void javaHeapSpace(Integer sum){Random random = new Random(); ArrayList openList = new ArrayList();for(int i=0;i<sum;i++){String charOrNum = String.valueOf(random.nextInt(10));openList.add(charOrNum);} }public void memoryTotal(){Runtime run = Runtime.getRuntime();long max = run.maxMemory();long total = run.totalMemory();long free = run.freeMemory();long usable = max - total + free;System.out.println("最大內(nèi)存 = " + max);System.out.println("已分配內(nèi)存 = " + total);System.out.println("已分配內(nèi)存中的剩余空間 = " + free);System.out.println("最大可用內(nèi)存 = " + usable);} }

    執(zhí)行結(jié)果:

    往ArrayList中加入30w內(nèi)容 最大內(nèi)存 = 20447232 已分配內(nèi)存 = 20447232 已分配內(nèi)存中的剩余空間 = 4032576 最大可用內(nèi)存 = 4032576 往ArrayList中加入40w內(nèi)容 Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat java.util.Arrays.copyOf(Arrays.java:2245)at java.util.Arrays.copyOf(Arrays.java:2219)at java.util.ArrayList.grow(ArrayList.java:242)at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:216)at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:208)at java.util.ArrayList.add(ArrayList.java:440)at pers.qingqian.study.seven.OOM.javaHeapSpace(OOM.java:36)at pers.qingqian.study.seven.OOM.main(OOM.java:26)

    (2)擴(kuò)大堆內(nèi)存空間

    使用?-Xms?和?-Xmx?來(lái)控制堆內(nèi)存空間大小。

    OutOfMemoryError: GC overhead limit exceeded

    原因:JDK6 新增錯(cuò)誤類(lèi)型,當(dāng) GC 為釋放很小空間占用大量時(shí)間時(shí)拋出;一般是因?yàn)槎烟?#xff0c;導(dǎo)致異常的原因,沒(méi)有足夠的內(nèi)存。

    解決方案:

    查看系統(tǒng)是否有使用大內(nèi)存的代碼或死循環(huán); 通過(guò)添加 JVM 配置,來(lái)限制使用內(nèi)存:

    <jvm-arg>-XX:-UseGCOverheadLimit</jvm-arg>

    OutOfMemoryError:unable to create new native thread

    原因:線(xiàn)程過(guò)多

    那么能創(chuàng)建多少線(xiàn)程呢?這里有一個(gè)公式:

    (MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads MaxProcessMemory 指的是一個(gè)進(jìn)程的最大內(nèi)存 JVMMemory JVM內(nèi)存 ReservedOsMemory 保留的操作系統(tǒng)內(nèi)存 ThreadStackSize 線(xiàn)程棧的大小

    當(dāng)發(fā)起一個(gè)線(xiàn)程的創(chuàng)建時(shí),虛擬機(jī)會(huì)在 JVM 內(nèi)存創(chuàng)建一個(gè) Thread 對(duì)象同時(shí)創(chuàng)建一個(gè)操作系統(tǒng)線(xiàn)程,而這個(gè)系統(tǒng)線(xiàn)程的內(nèi)存用的不是 JVMMemory,而是系統(tǒng)中剩下的內(nèi)存: (MaxProcessMemory - JVMMemory - ReservedOsMemory) 結(jié)論:你給 JVM 內(nèi)存越多,那么你能用來(lái)創(chuàng)建的系統(tǒng)線(xiàn)程的內(nèi)存就會(huì)越少,越容易發(fā)生 java.lang.OutOfMemoryError: unable to create new native thread。

    CPU 過(guò)高

    定位步驟:

    (1)執(zhí)行 top -c 命令,找到 cpu 最高的進(jìn)程的 id

    (2)jstack PID 導(dǎo)出 Java 應(yīng)用程序的線(xiàn)程堆棧信息。

    示例:

    jstack 6795"Low Memory Detector" daemon prio=10 tid=0x081465f8 nid=0x7 runnable [0x00000000..0x00000000] "CompilerThread0" daemon prio=10 tid=0x08143c58 nid=0x6 waiting on condition [0x00000000..0xfb5fd798] "Signal Dispatcher" daemon prio=10 tid=0x08142f08 nid=0x5 waiting on condition [0x00000000..0x00000000] "Finalizer" daemon prio=10 tid=0x08137ca0 nid=0x4 in Object.wait() [0xfbeed000..0xfbeeddb8] at java.lang.Object.wait(Native Method) - waiting on <0xef600848> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116) - locked <0xef600848> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159) "Reference Handler" daemon prio=10 tid=0x081370f0 nid=0x3 in Object.wait() [0xfbf4a000..0xfbf4aa38] at java.lang.Object.wait(Native Method) - waiting on <0xef600758> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:474) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116) - locked <0xef600758> (a java.lang.ref.Reference$Lock) "VM Thread" prio=10 tid=0x08134878 nid=0x2 runnable "VM Periodic Task Thread" prio=10 tid=0x08147768 nid=0x8 waiting on condition

    在打印的堆棧日志文件中,tid 和 nid 的含義:

    nid : 對(duì)應(yīng)的 Linux 操作系統(tǒng)下的 tid 線(xiàn)程號(hào),也就是前面轉(zhuǎn)化的 16 進(jìn)制數(shù)字 tid: 這個(gè)應(yīng)該是 jvm 的 jmm 內(nèi)存規(guī)范中的唯一地址定位

    在 CPU 過(guò)高的情況下,查找響應(yīng)的線(xiàn)程,一般定位都是用 nid 來(lái)定位的。而如果發(fā)生死鎖之類(lèi)的問(wèn)題,一般用 tid 來(lái)定位。

    (3)定位 CPU 高的線(xiàn)程打印其 nid

    查看線(xiàn)程下具體進(jìn)程信息的命令如下:

    top -H -p 6735

    top - 14:20:09 up 611 days, 2:56, 1 user, load average: 13.19, 7.76, 7.82 Threads: 6991 total, 17 running, 6974 sleeping, 0 stopped, 0 zombie %Cpu(s): 90.4 us, 2.1 sy, 0.0 ni, 7.0 id, 0.0 wa, 0.0 hi, 0.4 si, 0.0 st KiB Mem: 32783044 total, 32505008 used, 278036 free, 120304 buffers KiB Swap: 0 total, 0 used, 0 free. 4497428 cached MemPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND6800 root 20 0 27.299g 0.021t 7172 S 54.7 70.1 187:55.61 java6803 root 20 0 27.299g 0.021t 7172 S 54.4 70.1 187:52.59 java6798 root 20 0 27.299g 0.021t 7172 S 53.7 70.1 187:55.08 java6801 root 20 0 27.299g 0.021t 7172 S 53.7 70.1 187:55.25 java6797 root 20 0 27.299g 0.021t 7172 S 53.1 70.1 187:52.78 java6804 root 20 0 27.299g 0.021t 7172 S 53.1 70.1 187:55.76 java6802 root 20 0 27.299g 0.021t 7172 S 52.1 70.1 187:54.79 java6799 root 20 0 27.299g 0.021t 7172 S 51.8 70.1 187:53.36 java6807 root 20 0 27.299g 0.021t 7172 S 13.6 70.1 48:58.60 java 11014 root 20 0 27.299g 0.021t 7172 R 8.4 70.1 8:00.32 java 10642 root 20 0 27.299g 0.021t 7172 R 6.5 70.1 6:32.06 java6808 root 20 0 27.299g 0.021t 7172 S 6.1 70.1 159:08.40 java 11315 root 20 0 27.299g 0.021t 7172 S 3.9 70.1 5:54.10 java 12545 root 20 0 27.299g 0.021t 7172 S 3.9 70.1 6:55.48 java 23353 root 20 0 27.299g 0.021t 7172 S 3.9 70.1 2:20.55 java 24868 root 20 0 27.299g 0.021t 7172 S 3.9 70.1 2:12.46 java9146 root 20 0 27.299g 0.021t 7172 S 3.6 70.1 7:42.72 java

    由此可以看出占用 CPU 較高的線(xiàn)程,但是這些還不高,無(wú)法直接定位到具體的類(lèi)。nid 是 16 進(jìn)制的,所以我們要獲取線(xiàn)程的 16 進(jìn)制 ID:

    printf "%x\n" 6800 輸出結(jié)果:45cd

    然后根據(jù)輸出結(jié)果到 jstack 打印的堆棧日志中查定位:

    "catalina-exec-5692" daemon prio=10 tid=0x00007f3b05013800 nid=0x45cd waiting on condition [0x00007f3ae08e3000]java.lang.Thread.State: TIMED_WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for <0x00000006a7800598> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2082)at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:86)at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:32)at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:745)

    ?

    免費(fèi)Java資料需要自己領(lǐng)取,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并發(fā)分布式等教程,一共30G。?
    傳送門(mén):?https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q

    轉(zhuǎn)載于:https://my.oschina.net/u/3728792/blog/3038275

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的一篇年薪60万的JVM性能调优文章的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

    免费看在线看www777 | 久久久久久久99精品免费观看 | 亚洲视频综合在线 | 久久久性 | 中文字幕高清免费日韩视频在线 | 一级片视频在线 | 亚洲干视频在线观看 | 日韩在线色视频 | 欧美激情精品久久久久久免费 | 国产精品久久久久永久免费观看 | 摸阴视频 | 天天射综合网视频 | av成人在线播放 | 99综合影院在线 | 激情网色| 欧美精品三级 | 亚洲精品一区二区三区四区高清 | 婷婷中文字幕在线观看 | 欧美日韩三区二区 | 丰满少妇对白在线偷拍 | 久久久久久久久久免费 | 亚洲视频在线播放 | 天天操天天是 | 激情开心站 | 日韩com | se视频网址 | a成人v在线 | 亚洲国产精彩中文乱码av | 国产成人精品电影久久久 | 日韩一级黄色大片 | 精品一区二区免费在线观看 | 亚洲一区欧美激情 | 五月婷婷狠狠 | 国产亚洲婷婷免费 | 91九色在线视频 | 免费a视频在线观看 | 精品亚洲免费 | 91系列在线 | 久久这里有精品 | 国产黄色资源 | 亚洲天堂网在线视频 | 国产精品扒开做爽爽的视频 | 中文字幕中文中文字幕 | 亚洲精品午夜久久久久久久久久久 | av高清网站在线观看 | 91麻豆精品国产91久久久久 | 激情欧美一区二区免费视频 | 国产一区二区在线免费视频 | 激情综合网色播五月 | 国产精品免费视频一区二区 | 国产福利免费看 | 久久人91精品久久久久久不卡 | 国产不卡av在线 | 日本中文字幕在线免费观看 | 一级黄色a视频 | 中文字幕精品www乱入免费视频 | 久久九九视频 | 久久男人中文字幕资源站 | 色爽网站 | 在线观看国产91 | 人人玩人人添人人 | 亚洲人人av | 欧美在线一级片 | 中文字幕日本电影 | 激情深爱.com| 国产精品九九久久99视频 | 免费在线观看国产黄 | 深夜免费福利网站 | 天天色天天上天天操 | 日日爱999 | 亚洲天天在线日亚洲洲精 | 日韩在线无 | 最近高清中文字幕 | 国产精品扒开做爽爽的视频 | 国产高清在线看 | 日日夜夜狠狠干 | 久久久在线观看 | 日韩久久电影 | 97超碰在线免费观看 | 亚洲免费婷婷 | 久久成熟 | 久久视频这里有精品 | 九色琪琪久久综合网天天 | 91看片一区二区三区 | 2023亚洲精品国偷拍自产在线 | 综合久久五月天 | 久久久资源网 | 激情小说网站亚洲综合网 | 中文字幕文字幕一区二区 | 在线观看亚洲精品 | 手机看片1042 | 中文字幕中文字幕在线中文字幕三区 | 亚洲国产日韩欧美 | 亚洲一区二区麻豆 | 精品国产免费一区二区三区五区 | 毛片一区二区 | 久久精品美女视频网站 | aaa毛片视频 | 免费看国产黄色 | 天天干天天草天天爽 | 黄色软件在线观看免费 | 九九精品久久 | 福利视频午夜 | 最近日本韩国中文字幕 | 狠狠干天天色 | 成人av免费网站 | 91看片在线播放 | 东方av在 | 日韩欧美国产免费播放 | 久久久久成人精品亚洲国产 | 中文字幕免费在线 | av电影免费在线看 | 国产黄大片在线观看 | 久久大视频 | 黄色最新网址 | 99热这里只有精品免费 | 黄色成人毛片 | 搡bbbb搡bbb视频 | 2022久久国产露脸精品国产 | 91在线观看高清 | 色综合久久久久网 | 国产不卡精品 | 精品国产成人av在线免 | 亚洲一区不卡视频 | 视频在线观看入口黄最新永久免费国产 | 中文字幕第 | 国产91九色蝌蚪 | 九九在线高清精品视频 | 99色免费 | 一区二区视频免费在线观看 | 欧美精品中文在线免费观看 | 久久综合福利 | 97狠狠干| 日本黄色免费在线观看 | 伊色综合久久之综合久久 | 亚洲日韩欧美一区二区在线 | 欧美日韩高清一区二区三区 | 日日夜夜狠狠操 | 成人免费网站视频 | 日韩欧美精品一区二区三区经典 | 四虎成人精品永久免费av九九 | 久久久综合 | 天天干天天拍天天操天天拍 | 欧美成人精品三级在线观看播放 | 欧美性生活小视频 | 日日夜夜91 | 国产精品黄色在线观看 | 中文字幕一区二区三 | 中文字幕字幕中文 | 欧美九九九 | av资源免费在线观看 | 99精品视频在线观看播放 | 在线看的av网站 | 91久久丝袜国产露脸动漫 | 国产精品免费在线播放 | 国产亚洲精品久久久久久网站 | 国产香蕉97碰碰久久人人 | 日本精品免费看 | 热久久最新地址 | 人人爽人人爽人人爽学生一级 | 99精品视频观看 | 国产精品黄网站在线观看 | 狠狠干2018 | 永久免费在线 | 91久久国产自产拍夜夜嗨 | 精品自拍av| 久久久久久久久久伊人 | 欧美日韩一区二区三区在线免费观看 | 狠狠干激情| 日韩有码第一页 | 91完整版在线观看 | 亚洲精品乱码久久久久久 | 日韩欧美中文 | 黄污在线观看 | www.黄色小说.com | 99久久精品免费看国产免费软件 | 日韩在线中文字幕 | 日韩视频免费在线观看 | 狂野欧美激情性xxxx欧美 | 99色在线观看视频 | bbbbb女女女女女bbbbb国产 | av在线播放一区二区三区 | 毛片视频网址 | 麻豆va一区二区三区久久浪 | 欧美日韩免费在线视频 | 日韩在线观看高清 | 97视频网站 | 97视频免费观看2区 亚洲视屏 | 96精品在线| 涩涩网站在线 | 人人插人人做 | 久久精品美女视频 | 国产精品视屏 | 国产一级电影网 | 欧美激情综合色综合啪啪五月 | 欧美精品v国产精品v日韩精品 | 日本99干网 | 国产又粗又硬又爽的视频 | 一级片黄色片网站 | 天堂av观看| 国产区免费在线 | www.黄色小说.com | 一区二区中文字幕在线 | 97操碰 | 国产一区在线免费观看 | 久久综合久久综合九色 | 亚洲三级在线免费观看 | av在线一 | 少妇搡bbb | 久久国产精品99久久久久久老狼 | 久久久网| avav片| 在线观看国产91 | 超碰国产在线 | 国产视频一 | 亚洲欧洲久久久 | 国产a视频免费观看 | av不卡免费看 | 亚洲午夜精品一区二区三区电影院 | 欧美日bb | 久久久蜜桃一区二区 | 中文字幕人成乱码在线观看 | 一区二区三区日韩视频在线观看 | 亚洲视频在线观看网站 | 精精国产xxxx视频在线播放 | 丁香久久婷婷 | 欧美日韩国语 | 在线不卡视频 | 国产精品成人国产乱一区 | 丁香九月激情综合 | 玖操 | 91视频久久久久久 | 天天操月月操 | 免费看一及片 | 欧美aa级 | 成人免费视频免费观看 | 国产日韩欧美在线观看 | 成人免费91 | 中文字幕频道 | 国产精品免费久久久 | www五月天婷婷 | 伊人国产在线播放 | 国产免费黄视频在线观看 | 激情网综合 | 亚洲成人av一区 | 国产手机在线精品 | 狠狠干中文字幕 | 999久久久| 国产亚洲精品美女 | 色综合久久久久 | 国产精品久久久久久欧美 | 中文字幕在线影视资源 | 亚洲精欧美一区二区精品 | 国产一级黄大片 | 国产精品自产拍在线观看中文 | 日本深夜福利视频 | 久久久久免费网 | 国产精品久久一区二区三区不卡 | 青青河边草免费观看 | 国产精品女人久久久久久 | 久久久久免费精品视频 | 国产麻豆电影在线观看 | 男女靠逼app | 国产亚洲午夜高清国产拍精品 | 国产特级毛片aaaaaaa高清 | 99精品视频免费看 | 99热最新地址 | 国产亚洲综合精品 | 亚洲精品乱码久久久久久按摩 | 高清av免费观看 | 91色偷偷 | 九九九视频在线 | av丝袜在线 | 成年性视频 | 久久精品一区二区三区四区 | 久久8| 久久成人国产精品 | 国产成人三级三级三级97 | 日日爱影视 | 国产乱视频 | www.香蕉视频| 日日夜夜网站 | 在线一级片 | 99热这里只有精品国产首页 | 国产成人三级一区二区在线观看一 | 手机色站 | 亚洲黄色在线观看 | 欧美久久久久久久久久久久 | 特级西西www44高清大胆图片 | 久久免费福利视频 | 中文字幕在线观看一区二区三区 | 视频直播国产精品 | av视屏在线播放 | 国产免费观看视频 | 成人久久18免费网站图片 | 成在人线av | 亚洲涩综合 | 91精品国产高清 | 久久久在线| av中文字幕在线看 | 欧美色图88 | 在线电影中文字幕 | 国产成人一区二区在线观看 | 久久免费视频在线 | 一区二区三区 中文字幕 | 国产在线色 | 国产精品第二页 | 六月丁香综合网 | 精品一区av | 精品v亚洲v欧美v高清v | 国产精品国产亚洲精品看不卡15 | 日韩精品极品视频 | 在线观看av麻豆 | 欧美一级特黄aaaaaa大片在线观看 | 亚洲视频axxx | 成人一级片免费看 | 激情视频网页 | 天天做日日做天天爽视频免费 | 精品福利视频在线 | 视频精品一区二区三区 | 国产精品久久久久国产精品日日 | 天天爱天天操天天射 | 日批视频在线观看免费 | 亚洲国产片 | 中文在线a√在线 | 免费亚洲成人 | 人人舔人人爽 | 久久电影色 | 91最新国产 | 日韩视频中文 | 激情影音| 伊人亚洲综合网 | 精品久久久久久久久中文字幕 | 欧美精品久久久久久久久老牛影院 | 精品国产一区二区三区久久久蜜臀 | 国产91精品在线观看 | 欧美一区二区三区特黄 | 精品久久久久久一区二区里番 | 亚洲成人中文在线 | 日韩大片免费在线观看 | 男女啪啪网站 | 久久图 | 特黄特色特刺激视频免费播放 | 在线免费亚洲 | 99精品在线免费在线观看 | 91综合视频在线观看 | 高清不卡一区二区在线 | 8x成人免费视频 | 久久人人97超碰国产公开结果 | 日日射av | av在线一级 | 亚洲国产资源 | 久久社区视频 | 久久精品1区 | 狠狠的干狠狠的操 | 欧美久久久久久久 | 日韩网站中文字幕 | 五月婷婷亚洲 | 久久精品中文字幕免费mv | 久久精选视频 | 成人精品国产免费网站 | 国产在线97 | 六月色婷婷 | 久久爱综合 | 天天色天天操天天爽 | 少妇bbb | 久久久一本精品99久久精品 | 日韩理论片| 日韩高清不卡一区二区三区 | 激情婷婷在线 | 97免费在线观看视频 | 精品国产123 | 97精品国产97久久久久久粉红 | 国产精品激情在线观看 | 中文字幕黄色av | 日日干天天插 | 欧美精品免费在线观看 | 麻豆久久一区 | 国产精品久久久久毛片大屁完整版 | 亚洲国产伊人 | 97在线观看视频国产 | 色片网站在线观看 | 色在线中文字幕 | 久久99精品国产麻豆婷婷 | 国模视频一区二区三区 | 手机av在线网站 | 黄色片免费看 | 久久老司机精品视频 | 看片黄网站| wwwwww黄| 日本黄区免费视频观看 | 麻豆mv在线观看 | 岛国大片免费视频 | 久久污视频 | 天天操天天色天天射 | 中文字幕在线不卡国产视频 | 免费在线一区二区 | a在线观看国产 | 亚洲永久字幕 | 久久午夜鲁丝片 | 日本黄色免费播放 | 中文字幕之中文字幕 | 激情五月播播久久久精品 | 欧美精品中文在线免费观看 | 黄色片免费在线 | 久久手机免费观看 | 国产精品黄色av | 97狠狠干| 亚洲美女视频在线观看 | 91精品国产入口 | 天天操综 | 亚洲精品视频在线播放 | 欧美成人一区二区 | 国产成人黄色片 | 高清不卡免费视频 | 激情导航 | 免费日韩高清 | 日本精品一区二区三区在线观看 | 国产黑丝袜在线 | 三级av免费| 97视频免费在线观看 | 中文字幕日韩一区二区三区不卡 | 青春草视频 | 久久99精品波多结衣一区 | 91丨九色丨蝌蚪丨老版 | 日韩欧美精品一区二区三区经典 | 99精品久久久久久久久久综合 | 国产视频一区二区三区在线 | 国产亚洲精品美女久久 | 久久九九国产精品 | 久久精品一二区 | 久久久久久在线观看 | www.色就是色| 久色网| 99精品国产在热久久 | 三级黄色网址 | 成人久久久久久久久 | 婷婷九月丁香 | 久久久精品视频网站 | 狠狠88综合久久久久综合网 | 99爱在线| 亚洲婷婷伊人 | 伊人干综合 | 亚洲狠狠婷婷综合久久久 | 欧美韩日在线 | 国产一级在线免费观看 | 亚洲精品国产电影 | 日韩a在线看 | 香蕉在线视频播放网站 | 久久精品爱爱视频 | 麻豆av一区二区三区在线观看 | 欧美 亚洲 另类 激情 另类 | 国产精品毛片一区二区在线看 | 99视频导航 | 久久三级毛片 | 亚洲高清免费在线 | 久草视频手机在线 | 午夜神马福利 | 人人爽人人片 | 国内精品视频在线 | 人人添人人澡人人澡人人人爽 | 欧美日韩视频一区二区 | 国产福利一区二区三区在线观看 | 日日干影院 | 日韩高清激情 | 色天天久久| 婷婷色影院 | 国产偷在线 | 精品久久久久久国产 | 国产人成在线视频 | 久久这里只有精品视频首页 | 久久精品96| www.狠狠操| 日日操天天操狠狠操 | 欧美精品中文字幕亚洲专区 | 中文十次啦 | 欧美在线观看视频一区二区三区 | 99re久久资源最新地址 | 欧美日韩亚洲精品在线 | www.久久久精品 | 深夜免费福利在线 | 久久国产精品视频 | 免费福利在线视频 | 午夜精品一区二区三区在线视频 | 国产一区视频在线 | 久久久久久久久免费视频 | 国产精品18久久久久久久网站 | 成人亚洲免费 | 日韩中文字幕91 | 国产二区视频在线观看 | 国产成人99久久亚洲综合精品 | 免费一级日韩欧美性大片 | 亚洲综合色播 | 99免费在线视频 | 久草在线看片 | 夜夜躁狠狠燥 | 伊人天天干 | 亚洲3级| 四虎影视4hu4虎成人 | 日日弄天天弄美女bbbb | 欧美激情视频在线免费观看 | 久草免费色站 | 国产va在线 | 激情婷婷色| 99国产在线观看 | 91黄站| 亚洲国产日韩av | www夜夜| 特黄色大片 | 五月导航 | 欧美日韩二三区 | av福利在线免费观看 | 最近免费在线观看 | 美女网站在线免费观看 | 亚洲第一av在线播放 | 四虎www. | 国产另类xxxxhd高清 | 久久免费成人网 | 国产精品成人久久 | 久久久久国产一区二区三区 | 午夜丰满寂寞少妇精品 | 日韩欧美一区二区三区在线 | 色.www| 亚洲综合激情网 | 天天操天天干天天综合网 | 日韩视频在线播放 | 国产理论一区二区三区 | 欧美亚洲国产日韩 | 97在线免费观看 | 97免费公开视频 | 国产97视频 | 国产在线精品一区二区不卡了 | 亚洲精品999 | 欧美视频18 | av网站免费看 | 日本中文字幕网站 | 激情av资源 | 一区二区三区高清在线观看 | 国产精品一级在线 | 亚洲国产精品va在线看黑人动漫 | 九九九九九九精品 | 国产色拍拍拍拍在线精品 | 免费色视频| 国产高清在线免费 | 日日干精品 | 2022国产精品视频 | 开心激情五月网 | 国产麻豆视频免费观看 | 婷婷国产在线 | 国产精品原创在线 | 久久三级视频 | 91精品在线免费观看视频 | 一区二区三区免费看 | 日韩欧美视频免费看 | 日本少妇视频 | 99热精品久久 | 狠狠色丁香婷婷综合欧美 | 九草视频在线 | 黄网站大全 | 97超碰在线资源 | 99久久综合狠狠综合久久 | 人人草在线观看 | 久久久久二区 | 天天操天天操天天操天天操天天操天天操 | 久久久久久久久久伊人 | 日日干日日操 | 99国产精品免费网站 | 伊人影院av | 五月婷婷操| 国产美女精品人人做人人爽 | 在线观看你懂的网址 | 日韩精品久久久久 | 国产在线更新 | 在线观看电影av | 人人看人人草 | 天天天天综合 | 一区二区三区日韩视频在线观看 | 九九热有精品 | 色婷婷综合久色 | 亚洲五月婷 | 一本之道乱码区 | 五月婷婷六月丁香激情 | 精品亚洲免费 | av片一区 | 69av免费视频| 青青草久草在线 | 99久久99视频只有精品 | 日韩免费精品 | 99免在线观看免费视频高清 | 欧美福利视频一区 | 天天干天天摸天天操 | 九九色视频 | 日韩av视屏在线观看 | 国产精品免费观看国产网曝瓜 | 在线观看久久久久久 | 草免费视频 | 国产精品久久久久久久久久久久午夜 | 免费av视屏| www.五月激情.com| 久久久久激情视频 | 爱情影院aqdy鲁丝片二区 | www.天堂av| 久久久国产精品一区二区三区 | 天堂av在线网站 | 精品国产电影 | 婷婷色资源| 日本精品视频在线观看 | 黄网站色视频免费观看 | 精品久久网 | 91成人免费在线 | 最近最新中文字幕 | 69夜色精品国产69乱 | 国产精品videossex国产高清 | 国产 视频 久久 | 亚洲v欧美v国产v在线观看 | 欧美视频二区 | 麻豆久久久 | 亚洲精品美女在线观看播放 | 日韩午夜视频在线观看 | 婷婷色亚洲 | 中文在线8新资源库 | 美女在线免费观看视频 | 日本在线观看视频一区 | 91色视频 | 91资源在线观看 | 久久一区国产 | 久久综合九色综合欧美就去吻 | 欧美不卡视频在线 | 国产精品99精品久久免费 | 丁香影院在线 | 国色综合 | 久草在线手机视频 | 中文字幕资源站 | 免费69视频 | www操操操 | 久久欧美视频 | 欧美成人aa | 久久高清片| 亚洲综合色视频在线观看 | 日韩一级网站 | 午夜在线国产 | 久草99| 热热热热热色 | 国产高清无线码2021 | 亚洲精品videossex少妇 | 久久8| 亚洲午夜小视频 | 好看av在线 | 欧美一性一交一乱 | 青青河边草观看完整版高清 | 国产999精品视频 | 久久人人艹 | 精品国产大片 | 亚洲四虎影院 | 在线观看aaa | 亚洲免费小视频 | 在线观看免费视频你懂的 | 福利av在线| 六月丁香色婷婷 | 99精品在线直播 | 亚洲精品自拍 | 99久久久久免费精品国产 | 丝袜美女在线 | 亚洲成人家庭影院 | 九九免费精品 | 亚洲一区精品二人人爽久久 | 国产一线二线三线在线观看 | 日日夜夜天天久久 | 91视频这里只有精品 | 欧美日韩一区二区在线观看 | av千婊在线免费观看 | 五月婷婷六月丁香 | 国产成人精品女人久久久 | 日本中文字幕久久 | 成人免费 在线播放 | 欧美污污网站 | av线上看| 国产中文字幕一区 | 欧美日韩二三区 | 在线观看亚洲成人 | 国产精品免费高清 | 伊人丁香 | 国产一区在线观看免费 | 涩涩网站在线 | 99这里有精品 | 国产最顶级的黄色片在线免费观看 | 91av官网| 一本一道久久a久久综合蜜桃 | 精品毛片在线 | 欧美a级在线免费观看 | 国产一线二线三线在线观看 | 成人四虎影院 | 日本中文一区二区 | 国内精品久久久久影院日本资源 | 视频一区二区三区视频 | 99久久夜色精品国产亚洲96 | 99精品视频观看 | 精产嫩模国品一二三区 | 日韩理论片在线观看 | 一区二区三区国 | 国产精品原创 | 最新av免费在线 | 久久尤物电影视频在线观看 | 国产精品乱码久久久 | 成人久久久电影 | 日韩三级视频在线看 | 婷婷黄色片| 成人网444ppp| 激情婷婷av| 在线观看成人av | 日韩在线无 | 粉嫩aⅴ一区二区三区 | 人人爽夜夜爽 | 国产99区| www.伊人网 | 999成人 | 91成人小视频 | 超碰人人草人人 | 免费在线观看av不卡 | 国产黄色片久久 | 91大神dom调教在线观看 | 精品在线亚洲视频 | 99热在 | 日韩精品久久一区二区 | 国产精品嫩草55av | 久久国产精品一国产精品 | 亚洲国产免费网站 | 在线观看视频一区二区三区 | 日韩久久精品一区二区 | www.久久成人 | 91精品日韩 | 日日夜夜精品免费视频 | 国产精品v欧美精品v日韩 | 久久热首页 | 中文字幕免费在线看 | 九色视频自拍 | 国产一区二区三区高清播放 | 欧美日韩一区二区三区不卡 | 午夜体验区 | 日日夜夜操操操操 | 天天曰 | 97在线观看免费观看 | 高清不卡一区二区在线 | 五月视频 | 久久99在线视频 | 天天舔天天射天天操 | 日韩欧美高清一区二区 | 99精品视频播放 | 天天干夜夜想 | 午夜精品久久久久久久99 | 国际精品久久久 | 美女网站视频一区 | 国产精品无av码在线观看 | 日本午夜在线观看 | 在线视频麻豆 | 毛片www | 中文字幕在线观看免费高清电影 | 九九九免费视频 | 亚州精品国产 | 免费看一级一片 | 久久黄页 | 在线韩国电影免费观影完整版 | 操操日| 在线播放日韩 | 久久99国产精品自在自在app | 免费观看91视频 | 色婷婷亚洲 | 一区二区三区电影大全 | 成人精品电影 | 综合久久网站 | 国产91国语对白在线 | 美女在线国产 | 精品久久久久国产免费第一页 | 中文字幕一区二 | 久操视频在线免费看 | 麻豆传媒视频在线播放 | 国产精品免费久久久久久久久久中文 | 久久久久久久99精品免费观看 | 美女视频黄频大全免费 | 不卡av在线| 久章草在线 | 婷婷丁香国产 | 成人免费视频播放 | www色片 | 娇妻呻吟一区二区三区 | 毛片网站在线看 | 成人午夜黄色 | 久草在线手机观看 | 伊人伊成久久人综合网小说 | 日韩欧美在线观看一区二区三区 | 免费久久99精品国产婷婷六月 | 91在线看视频 | 久久久久久高潮国产精品视 | 日韩精品视频第一页 | 天天射天天爱天天干 | 日韩av进入 | 国产一区欧美二区 | 激情综合五月婷婷 | av片一区二区 | 久久你懂得 | 成人精品99 | 东方av在 | 69欧美视频 | 九九九热精品 | 麻豆视频国产 | 久久电影网站中文字幕 | 日日夜日日干 | 91在线蜜桃臀 | 一区二区av | av成人资源 | 久久这里只有精品9 | 中文字幕在线日本 | 久久午夜电影网 | 国产精品久久久久影院 | 精品久久一级片 | 日韩av一区二区在线播放 | 亚洲天堂在线观看完整版 | 国产美女被啪进深处喷白浆视频 | 免费网站看v片在线a | 成人99免费视频 | 激情综合五月天 | 久久精品精品电影网 | 亚洲91精品在线观看 | 久精品视频 | 奇米导航 | 亚洲精品国产欧美在线观看 | 久久精品视频中文字幕 | 精品久久在线 | 三上悠亚一区二区在线观看 | 在线观看国产一区二区 | 免费看一及片 | 日韩免费高清在线观看 | 亚洲精品一区二区三区新线路 | 久久艹免费| 久久99国产综合精品 | 久久字幕 | 国产精品99久久久久久久久 | 精品久久影院 | 三级黄色在线观看 | 精品国产一区二区三区四 | 网站免费黄 | 欧美黑人巨大xxxxx | 欧美一二三四在线 | 色综合天 | 激情五月色播五月 | 日韩极品在线 | 最新日韩在线观看视频 | 日韩中文字 | 中文字幕在线观看第一区 | 精品国自产在线观看 | 99精品小视频 | 午夜久久福利视频 | 国产成人一区二区三区在线观看 | 综合久久影院 | 天天亚洲 | 夜夜骑天天操 | 国产精品免费视频网站 | 中文字幕在线观看网址 | 亚洲精品高清视频在线观看 | 在线网站黄 | 999成人免费视频 | 久久精品视频在线播放 | 日韩在线第一 | 亚洲欧美视频一区二区三区 | 成人网在线免费视频 | 国产精品亚洲综合久久 | 日韩激情视频 | 日韩精品免费在线播放 | 国产在线一区二区 | 国产最新在线观看 | 国产九九热视频 | av一级片网站 | 国产精品久久电影观看 | 久久久私人影院 | 日韩视频欧美视频 | 久久久久久久综合色一本 | 丁香婷婷激情 | 久久久精品网站 | 久久伊人婷婷 | 日韩成人在线免费观看 | 综合黄色网 | 国产精品一区二区免费在线观看 | 婷婷综合伊人 | 蜜桃av综合网| 国产婷婷在线观看 | 不卡的av片 | 国产精品嫩草影视久久久 | 亚洲 中文字幕av | 视频国产精品 | 大胆欧美gogo免费视频一二区 | 久久久免费播放 | 亚洲精品中文字幕在线 | 亚洲女同ⅹxx女同tv | 欧美福利在线播放 | 菠萝菠萝蜜在线播放 | 国产精品成人av在线 | 国产精品久久久久久久午夜 | 国产精品久久网 | 成人欧美在线 | 99在线观看免费视频精品观看 | 亚洲欧美日韩一区二区三区在线观看 | 99在线视频观看 | 国内精品在线一区 | 美女黄频在线观看 | 免费网站看v片在线a | av观看网站 | 久久综合免费视频影院 | 在线免费观看视频 | 日韩欧美在线不卡 | 日韩国产欧美在线视频 | 一区二区三区免费在线观看视频 | 丰满少妇高潮在线观看 | 欧美日韩一区二区三区不卡 | 精品99久久久久久 | 亚洲九九| 激情五月婷婷综合网 | 国产自产高清不卡 | 国产剧在线观看片 | 亚洲国产精品99久久久久久久久 | 久久国产精品一区二区 | 国产精品成人免费精品自在线观看 | www.夜夜骑.com | 黄色一级免费 | 国产麻豆电影 | 人人揉人人揉人人揉人人揉97 | 久久影视精品 | 亚洲最大av网 | 久久久国产日韩 | 欧美日韩视频在线播放 | 一区二区三区视频 | 热re99久久精品国产66热 | 中文字幕一区三区 | 久久精品直播 | 久久综合色天天久久综合图片 | 天堂素人在线 | av超碰免费在线 | 免费美女久久99 | 97视频网址| 日三级在线 | 国产亚洲视频在线 | 激情综合网五月婷婷 | 国产香蕉97碰碰久久人人 | 国产综合精品一区二区三区 | 国产在线国偷精品产拍免费yy | 色偷偷人人澡久久超碰69 | 99精品久久久久久久久久综合 | 亚洲va天堂va欧美ⅴa在线 | 91色影院 | 日三级在线 | 国产精品男女视频 | 欧美三级免费 | av电影免费在线看 | 伊人婷婷网 | 国产成人精品免费在线观看 | 国产精品三级视频 | 国产精品福利午夜在线观看 | 国产精品久久麻豆 | 国产精品自产拍 | 九九热在线精品 | 国产经典av | 日韩中文字幕电影 | 在线观看国产区 | 国产成人av电影 | 国产一二区在线观看 | 国产一级特黄毛片在线毛片 | a在线播放 | 欧美-第1页-屁屁影院 | 91av欧美| 日本精品视频在线播放 | 在线精品在线 | 欧美一级片免费观看 | 欧美精品v国产精品 | 日韩免费观看视频 | 91丨九色丨丝袜 | 狠狠狠色狠狠色综合 | 欧美污在线观看 | 麻豆94tv免费版 | 国产精品毛片 | 天天射狠狠干 | 人人干狠狠干 | 色黄www小说| 精品色999| 成年人网站免费在线观看 | 中文字幕一二三区 | 毛片美女网站 | 一级黄色片毛片 | 久久免费中文视频 | 免费亚洲视频在线观看 | 麻豆小视频在线观看 | 国产亚洲精品久久19p | 午夜精品一区二区三区在线 | 97超碰人人爱 | 亚洲精品午夜久久久久久久久久久 | 亚洲免费黄色 | 欧美 亚洲 另类 激情 另类 | 日韩精品在线观看av | 9幺看片 | 一级片视频在线 |