JVM知識(shí)點(diǎn)總結(jié)梳理闽晦,全方面解析

前言

現(xiàn)在流行的框架越來(lái)越多,封裝的也越來(lái)越完善提岔,各種框架可以搞定一切仙蛉,幾乎不用關(guān)注底層的實(shí)現(xiàn),初級(jí)程序員只要熟悉基本的使用方法碱蒙,便可以快速的開(kāi)發(fā)上線(xiàn)荠瘪;但對(duì)于高級(jí)程序員來(lái)講,內(nèi)功的修煉卻越發(fā)的重要赛惩,比如算法哀墓、設(shè)計(jì)模式、底層原理等喷兼,只有把這些基礎(chǔ)熟練之后篮绰,才能在開(kāi)發(fā)過(guò)程中知其然知其所以然,出現(xiàn)問(wèn)題時(shí)能快速定位到問(wèn)題的本質(zhì)季惯。

對(duì)于Java程序員來(lái)講吠各,spring全家桶幾乎可以搞定一切,spring全家桶便是精妙的招式勉抓,jvm就是內(nèi)功心法很重要的一塊贾漏,線(xiàn)上出現(xiàn)性能問(wèn)題,jvm調(diào)優(yōu)更是不可回避的問(wèn)題琳状。因此JVM基礎(chǔ)知識(shí)對(duì)于高級(jí)程序員的重要性不必言語(yǔ)磕瓷,公司在面試高級(jí)開(kāi)發(fā)的時(shí)候,jvm相關(guān)知識(shí)也必定是考核的標(biāo)準(zhǔn)之一念逞。以下梳理出jvm需要關(guān)注的所有考察點(diǎn)困食。

jvm 總體梳理

jvm體系總體分四大塊:

類(lèi)的加載機(jī)制

jvm內(nèi)存結(jié)構(gòu)

GC算法 垃圾回收

GC分析 命令調(diào)優(yōu)

當(dāng)然這些知識(shí)點(diǎn)在之前的文章中都有詳細(xì)的介紹,這里只做主干的梳理

這里畫(huà)了一個(gè)思維導(dǎo)圖翎承,將所有的知識(shí)點(diǎn)進(jìn)行了陳列硕盹,因?yàn)閳D比較大可以點(diǎn)擊右鍵下載了放大查看。

類(lèi)的加載機(jī)制

主要關(guān)注點(diǎn):

什么是類(lèi)的加載

類(lèi)的生命周期

類(lèi)加載器

雙親委派模型

什么是類(lèi)的加載

類(lèi)的加載指的是將類(lèi)的.class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中叨咖,將其放在運(yùn)行時(shí)數(shù)據(jù)區(qū)的方法區(qū)內(nèi)瘩例,然后在堆區(qū)創(chuàng)建一個(gè)java.lang.Class對(duì)象,用來(lái)封裝類(lèi)在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)甸各。類(lèi)的加載的最終產(chǎn)品是位于堆區(qū)中的Class對(duì)象垛贤,Class對(duì)象封裝了類(lèi)在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu),并且向Java程序員提供了訪(fǎng)問(wèn)方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)的接口趣倾。

類(lèi)的生命周期

類(lèi)的生命周期包括這幾個(gè)部分聘惦,加載、連接儒恋、初始化善绎、使用和卸載黔漂,其中前三部是類(lèi)的加載的過(guò)程,如下圖;

加載禀酱,查找并加載類(lèi)的二進(jìn)制數(shù)據(jù)炬守,在Java堆中也創(chuàng)建一個(gè)java.lang.Class類(lèi)的對(duì)象

連接,連接又包含三塊內(nèi)容:驗(yàn)證剂跟、準(zhǔn)備减途、初始化。1)驗(yàn)證曹洽,文件格式观蜗、元數(shù)據(jù)、字節(jié)碼衣洁、符號(hào)引用驗(yàn)證墓捻;2)準(zhǔn)備,為類(lèi)的靜態(tài)變量分配內(nèi)存坊夫,并將其初始化為默認(rèn)值砖第;3)解析,把類(lèi)中的符號(hào)引用轉(zhuǎn)換為直接引用

初始化环凿,為類(lèi)的靜態(tài)變量賦予正確的初始值

使用梧兼,new出對(duì)象程序中使用

卸載,執(zhí)行垃圾回收

幾個(gè)小問(wèn)題智听?

1羽杰、JVM初始化步驟 ? 2到推、類(lèi)初始化時(shí)機(jī) 考赛?3、哪幾種情況下莉测,Java虛擬機(jī)將結(jié)束生命周期颜骤?

答案參考Java 類(lèi)的加載機(jī)制

類(lèi)加載器


啟動(dòng)類(lèi)加載器:Bootstrap ClassLoader,負(fù)責(zé)加載存放在JDK\jre\lib(JDK代表JDK的安裝目錄捣卤,下同)下忍抽,或被-Xbootclasspath參數(shù)指定的路徑中的,并且能被虛擬機(jī)識(shí)別的類(lèi)庫(kù)

擴(kuò)展類(lèi)加載器:Extension ClassLoader董朝,該加載器由sun.misc.Launcher$ExtClassLoader實(shí)現(xiàn)鸠项,它負(fù)責(zé)加載DK\jre\lib\ext目錄中,或者由java.ext.dirs系統(tǒng)變量指定的路徑中的所有類(lèi)庫(kù)(如javax.*開(kāi)頭的類(lèi))子姜,開(kāi)發(fā)者可以直接使用擴(kuò)展類(lèi)加載器祟绊。

應(yīng)用程序類(lèi)加載器:Application ClassLoader,該類(lèi)加載器由sun.misc.Launcher$AppClassLoader來(lái)實(shí)現(xiàn),它負(fù)責(zé)加載用戶(hù)類(lèi)路徑(ClassPath)所指定的類(lèi)久免,開(kāi)發(fā)者可以直接使用該類(lèi)加載器

類(lèi)加載機(jī)制

全盤(pán)負(fù)責(zé),當(dāng)一個(gè)類(lèi)加載器負(fù)責(zé)加載某個(gè)Class時(shí)扭弧,該Class所依賴(lài)的和引用的其他Class也將由該類(lèi)加載器負(fù)責(zé)載入阎姥,除非顯示使用另外一個(gè)類(lèi)加載器來(lái)載入

父類(lèi)委托,先讓父類(lèi)加載器試圖加載該類(lèi)鸽捻,只有在父類(lèi)加載器無(wú)法加載該類(lèi)時(shí)才嘗試從自己的類(lèi)路徑中加載該類(lèi)

緩存機(jī)制呼巴,緩存機(jī)制將會(huì)保證所有加載過(guò)的Class都會(huì)被緩存,當(dāng)程序中需要使用某個(gè)Class時(shí)御蒲,類(lèi)加載器先從緩存區(qū)尋找該Class衣赶,只有緩存區(qū)不存在,系統(tǒng)才會(huì)讀取該類(lèi)對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)厚满,并將其轉(zhuǎn)換成Class對(duì)象府瞄,存入緩存區(qū)。這就是為什么修改了Class后碘箍,必須重啟JVM遵馆,程序的修改才會(huì)生效

jvm內(nèi)存結(jié)構(gòu)

主要關(guān)注點(diǎn):

jvm內(nèi)存結(jié)構(gòu)都是什么

對(duì)象分配規(guī)則

jvm內(nèi)存結(jié)構(gòu)

方法區(qū)和對(duì)是所有線(xiàn)程共享的內(nèi)存區(qū)域;而java棧丰榴、本地方法棧和程序員計(jì)數(shù)器是運(yùn)行是線(xiàn)程私有的內(nèi)存區(qū)域货邓。

Java堆(Heap),是Java虛擬機(jī)所管理的內(nèi)存中最大的一塊。Java堆是被所有線(xiàn)程共享的一塊內(nèi)存區(qū)域四濒,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建换况。此內(nèi)存區(qū)域的唯一目的就是存放對(duì)象實(shí)例,幾乎所有的對(duì)象實(shí)例都在這里分配內(nèi)存盗蟆。

方法區(qū)(Method Area),方法區(qū)(Method Area)與Java堆一樣戈二,是各個(gè)線(xiàn)程共享的內(nèi)存區(qū)域,它用于存儲(chǔ)已被虛擬機(jī)加載的類(lèi)信息喳资、常量挽拂、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)骨饿。

程序計(jì)數(shù)器(Program Counter Register),程序計(jì)數(shù)器(Program Counter Register)是一塊較小的內(nèi)存空間亏栈,它的作用可以看做是當(dāng)前線(xiàn)程所執(zhí)行的字節(jié)碼的行號(hào)指示器。

JVM棧(JVM Stacks),與程序計(jì)數(shù)器一樣宏赘,Java虛擬機(jī)棧(Java Virtual Machine Stacks)也是線(xiàn)程私有的绒北,它的生命周期與線(xiàn)程相同。虛擬機(jī)棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個(gè)方法被執(zhí)行的時(shí)候都會(huì)同時(shí)創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表察署、操作棧闷游、動(dòng)態(tài)鏈接、方法出口等信息。每一個(gè)方法被調(diào)用直至執(zhí)行完成的過(guò)程脐往,就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中從入棧到出棧的過(guò)程休吠。

本地方法棧(Native Method Stacks),本地方法棧(Native Method Stacks)與虛擬機(jī)棧所發(fā)揮的作用是非常相似的,其區(qū)別不過(guò)是虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法(也就是字節(jié)碼)服務(wù)业簿,而本地方法棧則是為虛擬機(jī)使用到的Native方法服務(wù)瘤礁。

對(duì)象分配規(guī)則

對(duì)象優(yōu)先分配在Eden區(qū),如果Eden區(qū)沒(méi)有足夠的空間時(shí)梅尤,虛擬機(jī)執(zhí)行一次Minor GC柜思。

大對(duì)象直接進(jìn)入老年代(大對(duì)象是指需要大量連續(xù)內(nèi)存空間的對(duì)象)。這樣做的目的是避免在Eden區(qū)和兩個(gè)Survivor區(qū)之間發(fā)生大量的內(nèi)存拷貝(新生代采用復(fù)制算法收集內(nèi)存)巷燥。

長(zhǎng)期存活的對(duì)象進(jìn)入老年代赡盘。虛擬機(jī)為每個(gè)對(duì)象定義了一個(gè)年齡計(jì)數(shù)器,如果對(duì)象經(jīng)過(guò)了1次Minor GC那么對(duì)象會(huì)進(jìn)入Survivor區(qū)缰揪,之后每經(jīng)過(guò)一次Minor GC那么對(duì)象的年齡加1陨享,知道達(dá)到閥值對(duì)象進(jìn)入老年區(qū)。

動(dòng)態(tài)判斷對(duì)象的年齡钝腺。如果Survivor區(qū)中相同年齡的所有對(duì)象大小的總和大于Survivor空間的一半霉咨,年齡大于或等于該年齡的對(duì)象可以直接進(jìn)入老年代。

空間分配擔(dān)保拍屑。每次進(jìn)行Minor GC時(shí)途戒,JVM會(huì)計(jì)算Survivor區(qū)移至老年區(qū)的對(duì)象的平均大小,如果這個(gè)值大于老年區(qū)的剩余值大小則進(jìn)行一次Full GC僵驰,如果小于檢查HandlePromotionFailure設(shè)置喷斋,如果true則只進(jìn)行Monitor GC,如果false則進(jìn)行Full GC。

如何通過(guò)參數(shù)來(lái)控制個(gè)各個(gè)內(nèi)存區(qū)域

參考JVM內(nèi)存結(jié)構(gòu)

GC算法 垃圾回收

主要關(guān)注點(diǎn):

對(duì)象存活判斷

GC算法

垃圾回收器

對(duì)象存活判斷

判斷對(duì)象是否存活一般有兩種方式:

引用計(jì)數(shù):每個(gè)對(duì)象有一個(gè)引用計(jì)數(shù)屬性蒜茴,新增一個(gè)引用時(shí)計(jì)數(shù)加1星爪,引用釋放時(shí)計(jì)數(shù)減1,計(jì)數(shù)為0時(shí)可以回收粉私。此方法簡(jiǎn)單顽腾,無(wú)法解決對(duì)象相互循環(huán)引用的問(wèn)題。

可達(dá)性分析(Reachability Analysis):從GC Roots開(kāi)始向下搜索诺核,搜索所走過(guò)的路徑稱(chēng)為引用鏈抄肖。當(dāng)一個(gè)對(duì)象到GC Roots沒(méi)有任何引用鏈相連時(shí),則證明此對(duì)象是不可用的窖杀,不可達(dá)對(duì)象漓摩。

GC算法

GC最基礎(chǔ)的算法有三種:標(biāo)記 -清除算法、復(fù)制算法入客、標(biāo)記-壓縮算法管毙,我們常用的垃圾回收器一般都采用分代收集算法腿椎。

標(biāo)記 -清除算法,“標(biāo)記-清除”(Mark-Sweep)算法夭咬,如它的名字一樣啃炸,算法分為“標(biāo)記”和“清除”兩個(gè)階段:首先標(biāo)記出所有需要回收的對(duì)象,在標(biāo)記完成后統(tǒng)一回收掉所有被標(biāo)記的對(duì)象卓舵。

復(fù)制算法南用,“復(fù)制”(Copying)的收集算法,它將可用內(nèi)存按容量劃分為大小相等的兩塊边器,每次只使用其中的一塊。當(dāng)這一塊的內(nèi)存用完了托修,就將還存活著的對(duì)象復(fù)制到另外一塊上面忘巧,然后再把已使用過(guò)的內(nèi)存空間一次清理掉。

標(biāo)記-壓縮算法睦刃,標(biāo)記過(guò)程仍然與“標(biāo)記-清除”算法一樣砚嘴,但后續(xù)步驟不是直接對(duì)可回收對(duì)象進(jìn)行清理,而是讓所有存活的對(duì)象都向一端移動(dòng)涩拙,然后直接清理掉端邊界以外的內(nèi)存

分代收集算法际长,“分代收集”(Generational Collection)算法,把Java堆分為新生代和老年代兴泥,這樣就可以根據(jù)各個(gè)年代的特點(diǎn)采用最適當(dāng)?shù)氖占惴ā?/p>

垃圾回收器

Serial收集器工育,串行收集器是最古老,最穩(wěn)定以及效率高的收集器搓彻,可能會(huì)產(chǎn)生較長(zhǎng)的停頓如绸,只使用一個(gè)線(xiàn)程去回收。

ParNew收集器旭贬,ParNew收集器其實(shí)就是Serial收集器的多線(xiàn)程版本怔接。

Parallel收集器,Parallel Scavenge收集器類(lèi)似ParNew收集器稀轨,Parallel收集器更關(guān)注系統(tǒng)的吞吐量扼脐。

Parallel Old 收集器,Parallel Old是Parallel Scavenge收集器的老年代版本奋刽,使用多線(xiàn)程和“標(biāo)記-整理”算法

CMS收集器瓦侮,CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器。

G1收集器佣谐,G1 (Garbage-First)是一款面向服務(wù)器的垃圾收集器,主要針對(duì)配備多顆處理器及大容量?jī)?nèi)存的機(jī)器. 以極高概率滿(mǎn)足GC停頓時(shí)間要求的同時(shí),還具備高吞吐量性能特征

GC分析 命令調(diào)優(yōu)

主要關(guān)注點(diǎn):

GC日志分析

調(diào)優(yōu)命令

調(diào)優(yōu)工具

GC日志分析

摘錄GC日志一部分(前部分為年輕代gc回收脏榆;后部分為full gc回收):

2016-07-05T10:43:18.093+0800:25.395: [GC [PSYoungGen: 274931K->10738K(274944K)] 371093K->147186K(450048K),0.0668480 secs] [Times: user=0.17sys=0.08, real=0.07secs] 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.75sys=0.02, real=0.68secs]

通過(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ù)

young gc 日志:

Full GC日志:

調(diào)優(yōu)命令

Sun JDK監(jiān)控和故障處理命令有jps jstat jmap jhat jstack jinfo

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

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

jmap,JVM Memory Map命令用于生成heap dump文件

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

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

jinfo潜索,JVM Configuration info 這個(gè)命令作用是實(shí)時(shí)查看和調(diào)整虛擬機(jī)運(yùn)行參數(shù)。

調(diào)優(yōu)工具

常用調(diào)優(yōu)工具分為兩類(lèi),jdk自帶監(jiān)控工具:jconsole和jvisualvm懂酱,第三方有:MAT(Memory Analyzer Tool)竹习、GChisto。

jconsole列牺,Java Monitoring and Management Console是從java5開(kāi)始整陌,在JDK中自帶的java監(jiān)控和管理控制臺(tái),用于對(duì)JVM中內(nèi)存瞎领,線(xiàn)程和類(lèi)等的監(jiān)控

jvisualvm泌辫,jdk自帶全能工具,可以分析內(nèi)存快照九默、線(xiàn)程快照震放;監(jiān)控內(nèi)存變化、GC變化等驼修。

MAT殿遂,Memory Analyzer Tool诈铛,一個(gè)基于Eclipse的內(nèi)存分析工具,是一個(gè)快速墨礁、功能豐富的Java heap分析工具幢竹,它可以幫助我們查找內(nèi)存泄漏和減少內(nèi)存消耗

GChisto,一款專(zhuān)業(yè)分析gc日志的工具

JVM總結(jié)就寫(xiě)到這啦恩静,了解更多JAVA知識(shí)可關(guān)注微信公眾號(hào)“老周扯IT”

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末焕毫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子驶乾,更是在濱河造成了極大的恐慌邑飒,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件级乐,死亡現(xiàn)場(chǎng)離奇詭異疙咸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)唇牧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)罕扎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)聚唐,“玉大人丐重,你說(shuō)我怎么就攤上這事「瞬椋” “怎么了扮惦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)亲桦。 經(jīng)常有香客問(wèn)我崖蜜,道長(zhǎng),這世上最難降的妖魔是什么客峭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任豫领,我火速辦了婚禮,結(jié)果婚禮上舔琅,老公的妹妹穿的比我還像新娘等恐。我一直安慰自己,他們只是感情好备蚓,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布课蔬。 她就那樣靜靜地躺著,像睡著了一般郊尝。 火紅的嫁衣襯著肌膚如雪二跋。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,549評(píng)論 1 312
  • 那天流昏,我揣著相機(jī)與錄音扎即,去河邊找鬼吞获。 笑死,一個(gè)胖子當(dāng)著我的面吹牛铺遂,可吹牛的內(nèi)容都是我干的衫哥。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼襟锐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼撤逢!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掠手,沒(méi)想到半個(gè)月后伟墙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粗井,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媳叨。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖关顷,靈堂內(nèi)的尸體忽然破棺而出糊秆,到底是詐尸還是另有隱情,我是刑警寧澤议双,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布痘番,位于F島的核電站,受9級(jí)特大地震影響平痰,放射性物質(zhì)發(fā)生泄漏汞舱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一宗雇、第九天 我趴在偏房一處隱蔽的房頂上張望昂芜。 院中可真熱鬧,春花似錦赔蒲、人聲如沸泌神。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)腻扇。三九已至,卻和暖如春砾嫉,著一層夾襖步出監(jiān)牢的瞬間幼苛,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工焕刮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舶沿,地道東北人墙杯。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像括荡,于是被迫代替她去往敵國(guó)和親高镐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

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