理解jvm

一颜启、Java平臺(tái)的結(jié)構(gòu)圖


二偷俭、JVM與JRE、JDK關(guān)系
JVM:Java Virtual Machine負(fù)責(zé)執(zhí)行符合規(guī)范的Class文件
JRE:Java Runtime Environment(java運(yùn)行環(huán)境)缰盏,包含JVM和類庫(kù)
JDK:Java Development Kit(java開(kāi)發(fā)工具包)包含JRE和開(kāi)發(fā)工具包
三涌萤、JVM所處的位置

四、java運(yùn)行過(guò)程

即時(shí)編譯器(JIT)

五口猜、jvm結(jié)構(gòu)

image.png
  • 方法區(qū)(method area)

    • 類信息负溪、常量、精通變量济炎、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)川抡。方法區(qū)是全局共享的,在一定條件下它也會(huì)被GC须尚。
    • 當(dāng)方法區(qū)使用的內(nèi)存超過(guò)它允許的大小時(shí)崖堤,就會(huì)拋出OutOfMemory:PermGen Space異常。
    • JVM方法區(qū)的相關(guān)參數(shù)耐床,最小值:--XX:PermSize密幔;最大值 --XX:MaxPermSize。
  • 堆(heap)

    • 所有對(duì)象實(shí)例及數(shù)組撩轰,堆區(qū)是理解JavaGC機(jī)制最重要的區(qū)域胯甩。在JVM所管理的內(nèi)存中昧廷,堆區(qū)是最大的一塊,堆區(qū)也是JavaGC機(jī)制所管理的主要內(nèi)存區(qū)域偎箫,堆區(qū)由所有線程共享木柬,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。堆區(qū)用來(lái)存儲(chǔ)對(duì)象實(shí)例及數(shù)組值镜廉,可以認(rèn)為java中所有通過(guò)new創(chuàng)建的對(duì)象都在此分配弄诲。
    • 年輕代(Young Generation),對(duì)象在被創(chuàng)建時(shí)娇唯,內(nèi)存首先是在年輕代進(jìn)行分配(注意,大對(duì)象可以直接在老年代分配)寂玲。當(dāng)年輕代需要回收時(shí)會(huì)觸發(fā)Minor GC(也稱作Young GC)塔插。
      如果在執(zhí)行垃圾回收之后,仍沒(méi)有足夠的內(nèi)存分配拓哟,也不能再擴(kuò)展想许,將會(huì)拋出OutOfMemoryError:Java Heap Space異常。
    • 老年代(Old Generation)老年代用于存放在年輕代中經(jīng)多次垃圾回收仍然存活的對(duì)象断序,可以理解為比較老一點(diǎn)的對(duì)象流纹。當(dāng)老年代滿了的時(shí)候就需要對(duì)老年代進(jìn)行垃圾回收,老年代的垃圾回收稱作Major GC(也稱作Full GC)违诗。
  • 程序計(jì)數(shù)器(Program Counter Register)

    • 是一塊較小的內(nèi)存空間漱凝,指向當(dāng)時(shí)線程正在執(zhí)行的字節(jié)碼指令的地址
    • 此內(nèi)存區(qū)域是唯一一個(gè)在Java虛擬機(jī)規(guī)范中沒(méi)有規(guī)定任何OutMemoryError情況的區(qū)域
  • 本地方法棧(Native Method Stacks)

    • 虛擬機(jī)用到的本地方法,與虛擬機(jī)發(fā)揮的作用是非常相似的,其區(qū)別不過(guò)是虛擬機(jī)執(zhí)行Java方法(也就是字節(jié)碼)服務(wù)诸迟,而本地方法棧則是為虛擬機(jī)使用到的Native方法服務(wù)茸炒。
    • 與虛擬機(jī)棧一樣,本地方法區(qū)域也會(huì)拋出StackOverflowError和OutOfMemoryError異常
  • java虛擬機(jī)棧(Java Virtual Machine Stacks)

    • 當(dāng)前線程運(yùn)行方法時(shí)需要用到的局部變量表阵苇、操作數(shù)棧壁公、動(dòng)態(tài)鏈接、方法出口等绅项。
    • 在Java虛擬機(jī)規(guī)范中紊册,對(duì)這個(gè)區(qū)域規(guī)定了兩種異常情況:如果線程請(qǐng)求的棧深度大于虛擬機(jī)允許的深度,將拋出StackOverflowError異常快耿;如果虛擬機(jī)椖叶福可以動(dòng)態(tài)擴(kuò)展,當(dāng)擴(kuò)展時(shí)無(wú)法申請(qǐng)到足夠的內(nèi)存時(shí)會(huì)拋出OutOfMemoryError異常
  • 其中润努,方法區(qū)和堆是所有線程共享的关斜。

五、jvm內(nèi)存模型

image.png

可見(jiàn)性
原子性

image.png

六铺浇、jvm類加載機(jī)制
虛擬機(jī)把描述類的數(shù)據(jù)從Class文件加載到內(nèi)存痢畜,并對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機(jī)直接使用的java類型丁稀,這就是類的加載機(jī)制吼拥。
在java語(yǔ)言里面,類型的加載和連接過(guò)程都是在程序運(yùn)行期完成的。

image.png

加載驳规、驗(yàn)證掰曾、準(zhǔn)備、初始化和卸載這五個(gè)階段的順序是確定的枯跑,類的加載過(guò)程必須按照這種順序按部就班的開(kāi)始,而解析階段則不一定:它在某些情況下可以在初始化階段之后再開(kāi)始白热,這是為了支持java語(yǔ)言的運(yùn)行時(shí)綁定敛助,這些階段通常都是互相交叉低混合式進(jìn)行的。

  • 類的加載過(guò)程

    • 加載:類加載過(guò)程的第一階段屋确,在加載階段纳击,虛擬機(jī)需要完成以下三件事情
      • 通過(guò)一個(gè)類的全限定名來(lái)獲取定義此類的二進(jìn)制字節(jié)流。
      • 講這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)
      • 在java堆中生成一個(gè)代表這個(gè)類的ava.lang.Class對(duì)象攻臀,作為方法區(qū)這些數(shù)據(jù)的訪問(wèn)入口
  • 驗(yàn)證:驗(yàn)證是連接階段的第一步焕数,這一階段的目的是為了確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會(huì)危害虛擬機(jī)的安全

    • 文件格式驗(yàn)證
    • 元數(shù)據(jù)驗(yàn)證
    • 字節(jié)碼驗(yàn)證
    • 符號(hào)引用驗(yàn)證
  • 準(zhǔn)備:為類變量分配內(nèi)存并設(shè)置類變量初始值的階段刨啸,這些內(nèi)存都將在方法區(qū)中進(jìn)行分配堡赔。

  • 解析:解析階段是虛擬機(jī)將常量池內(nèi)的符號(hào)引用替換為直接引用的過(guò)程

    • 類或接口的解析
    • 字段解析
    • 類方法解析
    • 接口方法解析
  • 初始化:類初始化階段是類加載過(guò)程的最后一步,這個(gè)階段才真正開(kāi)始執(zhí)行類定義的java程序代碼(字節(jié)碼)

七呜投、jvm類加載器

  • 類與類加載器:類加載器用于實(shí)現(xiàn)類的加載動(dòng)作加匈,任意一個(gè)類都需要由加載它的類加載器和這個(gè)類本身一同確立其在java虛擬機(jī)中的唯一性

  • 雙親委派模型:java虛擬機(jī)存在兩種不同的類加載器,一是啟動(dòng)類加載器(Bootstrap ClassLoader)仑荐,這個(gè)類加載器使用C++語(yǔ)言實(shí)現(xiàn)雕拼,是虛擬機(jī)的一部分。另一種就是其他類加載器粘招,由java語(yǔ)言實(shí)現(xiàn)啥寇,獨(dú)立于虛擬機(jī)外部,并且全部繼承自抽象類java.lang.ClassLoader

    image.png
  • 破壞雙親委派模型

    • 第一次被破壞發(fā)生在雙親委派模型出現(xiàn)之前(JDK1.2發(fā)布之前)
      • JDK1.2之后java.lang.ClassLoader添加了一個(gè)新的protected方法洒扎,findClass()
    • 第二次破壞是由這個(gè)模型自身的缺陷所導(dǎo)致的辑甜,基礎(chǔ)類如果又要調(diào)回用戶的代碼會(huì)出問(wèn)題,為了解決這個(gè)問(wèn)題袍冷,java設(shè)計(jì)團(tuán)隊(duì)引入線程上下文加載器(Thread ClassLoader)磷醋。這個(gè)類加載器可以通過(guò)java.lang.Thread類的setContextClassLoader()方法設(shè)置,如果創(chuàng)建線程時(shí)沒(méi)設(shè)置胡诗,它將會(huì)從父線程中繼承一個(gè)邓线;如果在應(yīng)用程序的全局范圍內(nèi)都沒(méi)設(shè)置過(guò)淌友,那么這個(gè)類加載器默認(rèn)就是應(yīng)用程序類加載器
    • 第三次破壞是由于用戶對(duì)程序動(dòng)態(tài)性的追求而導(dǎo)致的。在OSGi環(huán)境下骇陈,類加載器不再是雙親委派模型中的樹(shù)狀結(jié)構(gòu)震庭,而是進(jìn)一步發(fā)展為網(wǎng)狀結(jié)構(gòu)。

八你雌、JVM GC機(jī)制
Java GC(Garbage Collection器联,垃圾收集,垃圾回收)機(jī)制

  • JVM通過(guò)GC來(lái)回收堆和方法區(qū)中的內(nèi)存婿崭,這個(gè)過(guò)程是自動(dòng)執(zhí)行的拨拓。說(shuō)到Java GC機(jī)制,其主要完成3件事:

    • 確定哪些內(nèi)存需要回收氓栈;
    • 確定什么時(shí)候需要執(zhí)行GC千元;
    • 如何執(zhí)行GC。
  • 垃圾檢測(cè)颤绕、回收算法:垃圾收集器一般必須完成兩件事:檢測(cè)出垃圾;回收垃圾祟身。怎么檢測(cè)出垃圾奥务?一般有以下幾種方法

    • 引用計(jì)數(shù)法:給一個(gè)對(duì)象添加引用計(jì)數(shù)器,每當(dāng)有個(gè)地方引用它袜硫,計(jì)數(shù)器就加1氯葬;引用失效就減1。如果我有兩個(gè)對(duì)象A和B婉陷,互相引用帚称,除此之外,沒(méi)有其他任何對(duì)象引用它們秽澳,實(shí)際上這兩個(gè)對(duì)象已經(jīng)無(wú)法訪問(wèn)闯睹,即是我們說(shuō)的垃圾對(duì)象。但是互相引用担神,計(jì)數(shù)不為0楼吃,導(dǎo)致無(wú)法回收。
    • 根搜索算法(GC Roots Tracing)
      • 這個(gè)算法的基本思路就是通過(guò)一系列的名為“GC Roots”的對(duì)象做起點(diǎn)妄讯,從這些節(jié)點(diǎn)開(kāi)始向下搜索孩锡,搜索所走過(guò)的路徑成為引用鏈(Reference Chain),當(dāng)一個(gè)對(duì)象到GC Roots沒(méi)有任何引用鏈相連時(shí)亥贸,則證明此對(duì)象是不可用的躬窜。

      • 在Java語(yǔ)言里,可作為GC Roots的對(duì)象包括下面幾種:

        • 虛擬機(jī)棧(棧幀中的本地變量表)中的引用對(duì)象
        • 方法區(qū)中的類靜態(tài)屬性引用的對(duì)象
        • 方法區(qū)中的常量引用對(duì)象
        • 本地方法棧中JNI(即一般說(shuō)的Native方法)的引用對(duì)象
  • 總之炕置,JVM在做垃圾回收的時(shí)候荣挨,會(huì)檢查堆中的所有對(duì)象是否會(huì)被這些根集對(duì)象引用男韧,不能夠被引用的對(duì)象就會(huì)被垃圾收集器回收。一般回收算法也有如下幾種:

    • 標(biāo)記-清除算法(Mark-sweep)
      • 算法和名字一樣垦沉,分為兩個(gè)階段:標(biāo)記和清除煌抒。標(biāo)記所有需要回收的對(duì)象,然后統(tǒng)一回收厕倍。這是最基礎(chǔ)的算法寡壮,后續(xù)的收集算法都是基于這個(gè)算法擴(kuò)展的。
      • 不足:效率低讹弯;標(biāo)記清除之后會(huì)產(chǎn)生大量碎片况既。
    • 復(fù)制算法(Copying)
      • 此算法把內(nèi)存空間劃為兩個(gè)相等的區(qū)域,每次只使用其中一個(gè)區(qū)域组民。垃圾回收時(shí)棒仍,遍歷當(dāng)前使用區(qū)域,把正在使用中的對(duì)象復(fù)制到另外一個(gè)區(qū)域中臭胜。
      • 此算法每次只處理正在使用中的對(duì)象莫其,因此復(fù)制成本比較小,同時(shí)復(fù)制過(guò)去以后還能進(jìn)行相應(yīng)的內(nèi)存整理耸三,不會(huì)出現(xiàn)“碎片”問(wèn)題乱陡。當(dāng)然,此算法的缺點(diǎn)也是很明顯的仪壮,就是需要兩倍內(nèi)存空間憨颠。
    • 標(biāo)記-整理算法(Mark-Compact)
      • 此算法結(jié)合了“標(biāo)記-清除”和“復(fù)制”兩個(gè)算法的優(yōu)點(diǎn)。也是分兩階段积锅,第一階段從根節(jié)點(diǎn)開(kāi)始標(biāo)記所有被引用對(duì)象爽彤,第二階段遍歷整個(gè)堆,把清除未標(biāo)記對(duì)象并且把存活對(duì)象“壓縮”到堆的其中一塊缚陷,按順序排放适篙。
      • 此算法避免了“標(biāo)記-清除”的碎片問(wèn)題,同時(shí)也避免了“復(fù)制”算法的空間問(wèn)題蹬跃。
    • 分代收集算法(Generational Collection)
      • 這是當(dāng)前商業(yè)虛擬機(jī)常用的垃圾收集算法匙瘪。分代的垃圾回收策略,是基于這樣一個(gè)事實(shí):不同的對(duì)象的生命周期是不一樣的蝶缀。因此丹喻,不同生命周期的對(duì)象可以采取不同的收集方式,以便提高回收效率翁都。
  • 垃圾收集器
HotSpot 虛擬機(jī)1.6版Update22

九碍论、JVM性能監(jiān)控工具

  • Jps(JVM Process Status Tools)
    • Jps是參照Unix系統(tǒng)的取名規(guī)則命名的,而他的功能和ps的功能類似柄慰,可以列舉正在運(yùn)行的餓虛擬機(jī)進(jìn)程并顯示虛擬機(jī)執(zhí)行的主類以及這些進(jìn)程的唯一ID(LVMID鳍悠,對(duì)應(yīng)本機(jī)來(lái)說(shuō)和PID相同)
  • jstat(JVM Statistics Monitoring Tools)
    • Jstat主要用于監(jiān)控虛擬機(jī)的各種運(yùn)行狀態(tài)信息税娜,如類的裝載、內(nèi)存藏研、垃圾回收敬矩、JIT編譯器等,在沒(méi)有GUI的服務(wù)器上蠢挡,這款工具是首選的一款監(jiān)控工具
  • jinfo(JVM configuration Info for Java)
    • Jinfo的作用是實(shí)時(shí)查看虛擬機(jī)的各項(xiàng)參數(shù)信息jps –v可以查看虛擬機(jī)在啟動(dòng)時(shí)被顯式指定的參數(shù)信息
  • jmap(JVM Memory Map for Java)
    • Jmap用于生成堆快照(heapdump)
  • jhat(JVM Heap Analysis Tool)
    • Jhat是用來(lái)分析dump文件的一個(gè)微型的HTTP/HTML服務(wù)器弧岳,它能將生成的dump文件生成在線的HTML文件,讓我們可以通過(guò)瀏覽器進(jìn)行查閱业踏,然而實(shí)際中我們很少使用這個(gè)工具禽炬,因?yàn)橐话惴?wù)器上設(shè)置的堆、棧內(nèi)存都比較大勤家,生成的dump也比較大腹尖,直接用jhat容易造成內(nèi)存溢出,而是我們大部分會(huì)將對(duì)應(yīng)的文件拷貝下來(lái)伐脖,通過(guò)其他可視化的工具進(jìn)行分析热幔。
  • jstack(JVM Stack Trace for java)
    • Jstack用于JVM當(dāng)前時(shí)刻的線程快照,又稱threaddump文件讼庇,它是JVM當(dāng)前每一條線程正在執(zhí)行的堆棧信息的集合断凶。生成線程快照的主要目的是為了定位線程出現(xiàn)長(zhǎng)時(shí)間停頓的原因,如線程死鎖巫俺、死循環(huán)、請(qǐng)求外部時(shí)長(zhǎng)過(guò)長(zhǎng)導(dǎo)致線程停頓的原因肿男。通過(guò)jstack我們就可以知道哪些進(jìn)程在后臺(tái)做些什么介汹?在等待什么資源等!
  • JConsole(JVM Monitoring and management console)(可視化)
    • 執(zhí)行JConsole即可查看效果
  • VisualVM被成為是more in one的工具集(可視化)
    • 執(zhí)行jvisualvm即可查看效果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舶沛,一起剝皮案震驚了整個(gè)濱河市嘹承,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌如庭,老刑警劉巖叹卷,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異坪它,居然都是意外死亡骤竹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門往毡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蒙揣,“玉大人,你說(shuō)我怎么就攤上這事开瞭±琳穑” “怎么了罩息?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)个扰。 經(jīng)常有香客問(wèn)我瓷炮,道長(zhǎng),這世上最難降的妖魔是什么递宅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任娘香,我火速辦了婚禮,結(jié)果婚禮上恐锣,老公的妹妹穿的比我還像新娘茅主。我一直安慰自己,他們只是感情好土榴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布诀姚。 她就那樣靜靜地躺著,像睡著了一般玷禽。 火紅的嫁衣襯著肌膚如雪赫段。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天矢赁,我揣著相機(jī)與錄音糯笙,去河邊找鬼。 笑死撩银,一個(gè)胖子當(dāng)著我的面吹牛给涕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播额获,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼够庙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了抄邀?” 一聲冷哼從身側(cè)響起耘眨,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎境肾,沒(méi)想到半個(gè)月后剔难,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奥喻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年偶宫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片环鲤。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡读宙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出楔绞,到底是詐尸還是另有隱情结闸,我是刑警寧澤唇兑,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站桦锄,受9級(jí)特大地震影響扎附,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜结耀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一留夜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧图甜,春花似錦碍粥、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至矿瘦,卻和暖如春枕面,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缚去。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工潮秘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人易结。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓枕荞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親搞动。 傳聞我的和親對(duì)象是個(gè)殘疾皇子买猖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 一、前言 JAVA GC(Garbage Collection滋尉,垃圾回收)機(jī)制是區(qū)別C++的一個(gè)重要特征,C...
    EnjoyAndroid閱讀 1,406評(píng)論 0 3
  • Java與C++之間有一堵由內(nèi)存動(dòng)態(tài)分配和垃圾收集技術(shù)所圍成的“高墻”飞主,墻外面的人想進(jìn)去狮惜,墻里面的人卻想出來(lái)。 對(duì)...
    夢(mèng)工廠閱讀 3,582評(píng)論 3 44
  • 《深入理解Java虛擬機(jī)》筆記_第一遍 先取看完這本書(shū)(JVM)后必須掌握的部分碌识。 第一部分 走近 Java 從傳...
    xiaogmail閱讀 5,062評(píng)論 1 34
  • 原文閱讀 前言 這段時(shí)間懈怠了碾篡,罪過(guò)! 最近看到有同事也開(kāi)始用上了微信公眾號(hào)寫(xiě)博客了筏餐,挺好的~給他們點(diǎn)贊开泽,這博客我...
    碼農(nóng)戲碼閱讀 5,948評(píng)論 2 31
  • 感恩我的恩師,給予我智慧魁瞪,謝謝穆律。 感恩父母養(yǎng)育之恩惠呼,謝謝。 感恩孩子的陪伴峦耘,謝謝剔蹋。 感恩婆婆的幫助,謝謝辅髓。 感恩錢...
    莫水娥閱讀 70評(píng)論 0 1