JVM內(nèi)存模型及垃圾回收

1. 什么是JVM

? ??????JVM是我們運(yùn)行java程序所必須的虛擬機(jī)環(huán)境或南,也是java實(shí)現(xiàn)跨平臺(tái)原理的不可或缺的東西菩暗。“一次編譯授账,到處運(yùn)行”靠的就是JVM。

2. 為什么要JVM優(yōu)化

? ??????我們的代碼都是在JVM中運(yùn)行的惨驶,JVM有自己默認(rèn)的配置白热,但是許多情況下采用默認(rèn)配置并不是最好的選擇,并且有可能導(dǎo)致運(yùn)行效率更差粗卜。我們還是需要針對(duì)實(shí)際情況對(duì)其進(jìn)行一定的優(yōu)化使得程序運(yùn)行的更加順滑屋确。

3.?JVM組成

????????主要有四部分組成:運(yùn)行時(shí)數(shù)據(jù)區(qū)、類加載器子系統(tǒng)、本地方法庫攻臀、執(zhí)行引擎

3.1 類加載子系統(tǒng)

? ??????用于類加載的焕数。類加載的過程:

? ??????1.?加載:將字節(jié)碼文件加載到內(nèi)存中。加載方式分為顯示加載(new)以及隱式加載(反射)

????????2.?驗(yàn)證:驗(yàn)證加載的文件是否為字節(jié)碼文件刨啸,并且進(jìn)行一系列的安全驗(yàn)證

????????3.?準(zhǔn)備:對(duì)靜態(tài)變量分配內(nèi)存空間并且初始化賦值(0或者null)堡赔,如果想在這個(gè)階段為其賦明確值則需要為變量添加final修飾

????????4.?解析:將java符號(hào)引用替換為直接引用

????????5.?初始化:為變量進(jìn)行賦值

3.1.1?類與類加載器

? ??????每一個(gè)類,都需要和它的類加載器一起確定其在JVM中的唯一性.換句話來說,不同類加載器加載的同一個(gè)字節(jié)碼文件,得到的類都不相等.我們可以通過默認(rèn)加載器去加載一個(gè)類,然后new一個(gè)對(duì)象,再通過自己定義的一個(gè)類加載器,去加載同一個(gè)字節(jié)碼文件,拿前面得到的對(duì)象去instanceof,會(huì)得到的結(jié)果是false.

3.1.2?雙親委派機(jī)制

? ??????在java中包含有四種類加載器:?jiǎn)?dòng)類加載器、擴(kuò)展類加載器设联、應(yīng)用程序類加載器善已、自定義類加載器,前三種是必然存在的

類加載器

? ??????直接拿應(yīng)用程序類加載器舉例吧离例,它在要加載一個(gè)類的時(shí)候不會(huì)直接嘗試去加載换团,而是會(huì)委派上級(jí)擴(kuò)展類加載器加載,擴(kuò)展類加載器也會(huì)繼續(xù)委派上級(jí)啟動(dòng)類加載器加載宫蛆。接著啟動(dòng)類加載器進(jìn)行加載艘包,如果啟動(dòng)類加載器在自己的搜索范圍沒有發(fā)現(xiàn)對(duì)應(yīng)類則會(huì)讓擴(kuò)展類加載器加載,同樣的擴(kuò)展類加載器會(huì)在搜索范圍內(nèi)查找洒扎,如果沒有則繼續(xù)讓應(yīng)用程序類加載器加載辑甜,如果依舊沒有,此時(shí)就會(huì)拋出異常袍冷。

? ? ? ? 如上所說磷醋,每一個(gè)類加載器都有自己明確的加載范圍,啟動(dòng)類加載器負(fù)責(zé)加載JAVA_HOME/lib下的類胡诗;擴(kuò)展類加載器負(fù)責(zé)加載JAVA_HOME/lib/ext下的類邓线;應(yīng)用程序類加載器負(fù)責(zé)加載classpath下的類

? ? ? ? 那么這么復(fù)雜一個(gè)流程意義何在呢?

? ? ? ? 首先煌恢,可以明確的是進(jìn)行這樣的從下到上再?gòu)纳系较碌碾p親委派是有意義的:

? ??????這是為了安全性著想骇陈,舉例來說:我們自定義一個(gè)Object類,放到自己的Classpath中瑰抵,如果沒有這種雙親委派機(jī)制則會(huì)直接通過應(yīng)用程序類加載器將該類加載到內(nèi)存中你雌,勢(shì)必會(huì)引發(fā)混亂的。但是如果有了雙親委派機(jī)制二汛,則按照層級(jí)婿崭,在啟動(dòng)類加載器中將正確的Object類加載到內(nèi)存,不會(huì)將我們自定義的Object加載肴颊,也就不會(huì)發(fā)生問題了

3.2 運(yùn)行時(shí)數(shù)據(jù)區(qū)

運(yùn)行時(shí)數(shù)據(jù)區(qū)組成

? ??????其中堆和方法區(qū)是所有線程共享的氓栈,其他的都是線程私有的。程序計(jì)數(shù)器是JVM中唯一一塊沒有OOM的區(qū)域婿着。

3.2.1?虛擬機(jī)棧

? ??????是線程私有的授瘦,每一個(gè)方法就會(huì)創(chuàng)建一個(gè)棧楨醋界,方法中的局部變量就存放在棧楨中,與它相關(guān)的錯(cuò)誤有:Stack Overflow以及OOM前者是因?yàn)檎{(diào)用的方法過多并且沒有彈出(例如遞歸調(diào)用方法并沒有出口)提完,后者是因?yàn)樵趧?chuàng)建對(duì)象申請(qǐng)新空間時(shí)不足或者循環(huán)遞歸調(diào)用過多對(duì)象形纺。

????????虛擬機(jī)會(huì)為每個(gè)線程分配一個(gè)虛擬機(jī)棧,每個(gè)虛擬機(jī)棧中都有若干個(gè)棧幀氯葬,每個(gè)棧幀中存儲(chǔ)了局部變量表挡篓、操作數(shù)棧、動(dòng)態(tài)鏈接帚称、返回地址等官研。一個(gè)棧幀就對(duì)應(yīng)Java代碼中的一個(gè)方法,當(dāng)線程執(zhí)行到一個(gè)方法時(shí)闯睹,就代表這個(gè)方法對(duì)應(yīng)的棧幀已經(jīng)進(jìn)入虛擬機(jī)棧并且處于棧頂?shù)奈恢孟酚穑恳粋€(gè)Java方法從被調(diào)用到執(zhí)行結(jié)束,就對(duì)應(yīng)了一個(gè)棧幀從入棧到出棧的過程楼吃。

3.2.2 本地方法棧

????????虛擬機(jī)棧執(zhí)行的是java方法始花,本地方法棧執(zhí)行的是本地(native)方法

3.2.3 方法區(qū)

? ??????在java1.7及以前方法區(qū)(永久代)屬于堆內(nèi)存上的一塊連續(xù)的區(qū)域。在jdk1.7之前用于存放類信息孩锡、常量池(包括字符常量池和class常量池)酷宵、編譯后的代碼、靜態(tài)變量躬窜;從1.7開始就準(zhǔn)備“去永久代”的規(guī)劃了浇垦,jdk1.7將字符常量池以及靜態(tài)變量放入到堆內(nèi)存中。1.8就沒有方法區(qū)了荣挨,取而代之的是在計(jì)算機(jī)內(nèi)存上的元空間

方法區(qū)

? ??????去永久代的原因男韧?

????????字符串容易導(dǎo)致永久代出現(xiàn)OOM

????????類及方法難以確定具體大小,指定永久代大小是個(gè)問題

????????永久代會(huì)為GC帶來不必要的復(fù)雜度默垄,且回收效率不高

3.2.4 堆內(nèi)存

? ??????堆內(nèi)存是用于存放對(duì)象及數(shù)組的區(qū)域此虑,是GC主要光顧的地方,是所有線程共享的口锭。分為新生代朦前、老年代。新生代主要用于存放剛創(chuàng)建的對(duì)象鹃操,是Mintor GC主要光顧的地方况既,由于采用分代GC算法,所以新生代又細(xì)分為Eden组民、S0、S1(標(biāo)記復(fù)制算法)悲靴,剛創(chuàng)建的對(duì)象會(huì)放在Eden中臭胜,當(dāng)經(jīng)歷一次GC之后存活的對(duì)象會(huì)被放入到survivor區(qū)莫其,默認(rèn)經(jīng)歷15次GC之后會(huì)放入到老年代(當(dāng)survivor區(qū)滿了的時(shí)候會(huì)直接放入到老年代),老年代是fullGC光顧耸三,間隔久乱陡,頻率不高。

4.?JVM垃圾回收

? ? ? ? 進(jìn)行垃圾回收需要做到的幾點(diǎn):

? ? ? ? ????如何判斷垃圾對(duì)象仪壮?

? ? ? ? ? ? 什么時(shí)候回收垃圾對(duì)象憨颠?

? ? ? ? ? ? 怎么回收垃圾對(duì)象?

4.1?判斷一個(gè)對(duì)象是否屬于待回收狀態(tài)有兩種方法

4.1.1 引用計(jì)數(shù)法

? ? ? ? 每個(gè)對(duì)象都會(huì)有一個(gè)引用計(jì)數(shù)器积锅,當(dāng)有外部引用或者其他對(duì)象引用該對(duì)象時(shí)爽彤,會(huì)將引用計(jì)數(shù)器+1,當(dāng)失去引用時(shí)則-1缚陷,當(dāng)對(duì)象引用計(jì)數(shù)器為0時(shí)則表示當(dāng)前對(duì)象處于待回收狀態(tài)适篙。

? ??????缺點(diǎn):

? ??????可能存在已沒有外部引用(對(duì)象實(shí)際應(yīng)處于待回收狀態(tài)),但是有其他對(duì)象引用了該對(duì)象箫爷,并且該對(duì)象也引用了它(內(nèi)部對(duì)象間互相引用)嚷节,使得雙方引用計(jì)數(shù)器不為0,導(dǎo)致不會(huì)被回收


引用計(jì)數(shù)1


引用計(jì)數(shù)2


引用計(jì)數(shù)3


引用計(jì)數(shù)4

????????如圖1所示虎锚,現(xiàn)在兩個(gè)實(shí)例對(duì)象的引用計(jì)數(shù)都為1硫痰,屬于非回收對(duì)象,當(dāng)外部不在引用實(shí)例對(duì)象1時(shí)窜护,其引用計(jì)數(shù)-1變?yōu)?效斑,此時(shí)實(shí)例對(duì)象1處于待回收狀態(tài),如圖2所示柄慰。

? ? ? ? ? ?但是鳍悠,如果出現(xiàn)圖3所示情況,即實(shí)例對(duì)象之間互相進(jìn)行了引用坐搔,此時(shí)實(shí)例對(duì)象1和2的引用計(jì)數(shù)都是為2的藏研。此時(shí),外部不在引用這兩個(gè)對(duì)象時(shí)概行,由于它們自身之間進(jìn)行了互相引用蠢挡,導(dǎo)致引用計(jì)數(shù)為1,所以不會(huì)被標(biāo)記為待回收狀態(tài)凳忙。

4.1.2?可達(dá)性分析法

? ??????通過GCRoots實(shí)現(xiàn)业踏,GCRoots是垃圾回收的起點(diǎn),當(dāng)一個(gè)對(duì)象到GCRoot沒有任何引用鏈時(shí)(GCRoots到這個(gè)對(duì)象不可達(dá))涧卵,則當(dāng)前對(duì)象處于待回收狀態(tài)勤家。

????????進(jìn)行可達(dá)性分析后對(duì)象和GC Roots之間沒有引用鏈相連時(shí),對(duì)象將會(huì)被進(jìn)行一次標(biāo)記柳恐,接著會(huì)判斷如果對(duì)象沒有覆蓋Object的finalize()方法或者finalize()方法已經(jīng)被虛擬機(jī)調(diào)用過伐脖,那么它們就會(huì)被行刑(清除)热幔;如果對(duì)象覆蓋了finalize()方法且還沒有被調(diào)用,則會(huì)執(zhí)行finalize()方法中的內(nèi)容讼庇,所以在finalize()方法中如果重新與GC Roots引用鏈上的對(duì)象關(guān)聯(lián)就可以拯救自己绎巨,但是一般不建議這么做.


可達(dá)性1


可達(dá)性2

4.2 什么時(shí)候回收

? ? ? ? 每次垃圾回收的時(shí)候,都會(huì)將整個(gè)JVM暫停蠕啄,回收完成后再繼續(xù)场勤。這里涉及兩個(gè)概念:安全點(diǎn)、安全區(qū)

4.2.1 安全點(diǎn)

? ? ? ? 用白話解釋歼跟,舉例:媽媽正要進(jìn)行掃地和媳,但是小紅此時(shí)告訴媽媽:“我正在吃蘋果,還沒有吃完呢嘹承,你等我吃完再掃”窗价,媽媽就得等待小紅吃完蘋果再掃。那么此時(shí)小紅吃完蘋果時(shí)就是安全點(diǎn)叹卷,到那時(shí)媽媽就可以安心的進(jìn)行掃地了撼港。

? ??????從線程角度看,safepoint可以理解成是在代碼執(zhí)行過程中的一些特殊位置骤竹,當(dāng)線程執(zhí)行到這些位置的時(shí)候帝牡,說明虛擬機(jī)當(dāng)前的狀態(tài)是安全的,如果有需要蒙揣,可以在這個(gè)位置暫停靶溜,比如發(fā)生GC時(shí),需要暫停所有活動(dòng)線程懒震,但是該線程在這個(gè)時(shí)刻罩息,還沒有執(zhí)行到一個(gè)安全點(diǎn),所以該線程應(yīng)該繼續(xù)執(zhí)行个扰,到達(dá)下一個(gè)安全點(diǎn)的時(shí)候暫停瓷炮,然后才開始GC,該線程等待GC結(jié)束递宅。參考原文鏈接:https://blog.csdn.net/u014590757/article/details/79855223

4.2.2 安全區(qū)

? ? ? ? 同樣的舉例:媽媽掃地娘香,此時(shí)小紅告訴媽媽:“沒事兒,媽媽你掃吧办龄,我等十分鐘再吃蘋果”烘绽,那么媽媽就會(huì)進(jìn)行掃地。此時(shí)這十分鐘就屬于安全區(qū)俐填,在這期間媽媽不用擔(dān)心掃地會(huì)影響到小紅安接。

? ??????安全區(qū)域是指在一段代碼片段中,引用關(guān)系不會(huì)發(fā)生變化英融,在該區(qū)域的任何地方發(fā)生gc都是安全的赫段。當(dāng)代碼執(zhí)行到安全區(qū)域時(shí)呀打,首先標(biāo)示自己已經(jīng)進(jìn)入了安全區(qū)域,那樣如果在這段時(shí)間里jvm發(fā)起gc糯笙,就不用管標(biāo)示自己在安全區(qū)域的那些線程了,在線程離開安全區(qū)域時(shí)撩银,會(huì)檢查系統(tǒng)是否正在執(zhí)行g(shù)c给涕,如果是那么就等到gc完成后再離開安全區(qū)域。

4.3 怎么回收垃圾

?4.3.1 常用回收算法

? ?1.?標(biāo)記-清除

????????首先標(biāo)記出所有要回收的對(duì)象额获,標(biāo)記完成之后統(tǒng)一回收够庙。

????????缺點(diǎn):效率不高,并且會(huì)導(dǎo)致出現(xiàn)內(nèi)存空間不連續(xù)抄邀,之后如要存放大對(duì)象則不好存放

? ? 2. 標(biāo)記-復(fù)制

? ??????首先耘眨,將內(nèi)存空間分為兩部分,每次存儲(chǔ)中其中一塊境肾,當(dāng)一塊進(jìn)行GC時(shí)將存活對(duì)象復(fù)制到另一塊中剔难,同時(shí)把用過的那一塊中對(duì)象清除,如此反復(fù)

????????缺點(diǎn):空間利用率不高

? ? 3. 標(biāo)記-整理

? ??????邊標(biāo)記處理邊整理使得空間連續(xù)

? ? ? ? 缺點(diǎn):效率比較低

? ? 4. 分代回收算法

? ??????將堆內(nèi)存分為新生代和老年代奥喻,新生代又分為Eden偶宫、S0、S1环鲤,新生代對(duì)象一般存活時(shí)間較短纯趋,采用標(biāo)記-復(fù)制算法。老年代對(duì)象一般存活時(shí)間較長(zhǎng)冷离,會(huì)比較少次數(shù)的進(jìn)行回收吵冒,所以采用標(biāo)記-清除或者標(biāo)記-整理算法。

分代回收詳解:

? ? ● 大多數(shù)情況下西剥,新的對(duì)象都分配在Eden區(qū)痹栖,當(dāng)Eden區(qū)沒有空間進(jìn)行分配時(shí),將進(jìn)行一次Minor GC蔫耽,清理Eden區(qū)中的無用對(duì)象结耀。清理后,Eden和From Survivor中的存活對(duì)象如果小于To Survivor的可用空間則進(jìn)入To Survivor匙铡,否則直接進(jìn)入老年代)图甜;Eden和From Survivor中還存活且能夠進(jìn)入To Survivor的對(duì)象年齡增加1歲(虛擬機(jī)為每個(gè)對(duì)象定義了一個(gè)年齡計(jì)數(shù)器,每執(zhí)行一次Minor GC年齡加1)鳖眼,當(dāng)存活對(duì)象的年齡到達(dá)一定程度(默認(rèn)15歲)后進(jìn)入老年代黑毅,可以通過-XX:MaxTenuringThreshold來設(shè)置年齡的值。

? ??●??當(dāng)進(jìn)行了Minor GC后钦讳,Eden還不足以為新對(duì)象分配空間(那這個(gè)新對(duì)象肯定很大)矿瘦,新對(duì)象直接進(jìn)入老年代枕面。

? ??●??占To Survivor空間一半以上且年齡相等的對(duì)象,大于等于該年齡的對(duì)象直接進(jìn)入老年代缚去,比如Survivor空間是10M潮秘,有幾個(gè)年齡為4的對(duì)象占用總空間已經(jīng)超過5M,則年齡大于等于4的對(duì)象都直接進(jìn)入老年代易结,不需要等到MaxTenuringThreshold指定的歲數(shù)枕荞。

? ??●??在進(jìn)行Minor GC之前,會(huì)判斷老年代最大連續(xù)可用空間是否大于新生代所有對(duì)象總空間搞动,如果大于躏精,說明Minor GC是安全的,否則會(huì)判斷是否允許擔(dān)保失敗鹦肿,如果允許矗烛,判斷老年代最大連續(xù)可用空間是否大于歷次晉升到老年代的對(duì)象的平均大小,如果大于箩溃,則執(zhí)行Minor GC瞭吃,否則執(zhí)行Full GC。

? ??●??當(dāng)在java代碼里直接調(diào)用System.gc()時(shí)碾篡,會(huì)建議JVM進(jìn)行Full GC虱而,但一般情況下都會(huì)觸發(fā)Full GC,一般不建議使用开泽,盡量讓虛擬機(jī)自己管理GC的策略牡拇。

? ??●??永久代(方法區(qū))中用于存放類信息,jdk1.6及之前的版本永久代中還存儲(chǔ)常量穆律、靜態(tài)變量等惠呼,當(dāng)永久代的空間不足時(shí),也會(huì)觸發(fā)Full GC峦耘,如果經(jīng)過Full GC還無法滿足永久代存放新數(shù)據(jù)的需求剔蹋,就會(huì)拋出永久代的內(nèi)存溢出異常。

? ??●??大對(duì)象(需要大量連續(xù)內(nèi)存的對(duì)象)例如很長(zhǎng)的數(shù)組辅髓,會(huì)直接進(jìn)入老年代泣崩,如果老年代沒有足夠的連續(xù)大空間來存放,則會(huì)進(jìn)行Full GC洛口。

4.3.2 Minor GC和Full GC

? ??????在說這兩種回收的區(qū)別之前矫付,我們先來說一個(gè)概念,“Stop-The-World”第焰。

如字面意思买优,每次垃圾回收的時(shí)候,都會(huì)將整個(gè)JVM暫停,回收完成后再繼續(xù)杀赢。如果一邊增加廢棄對(duì)象烘跺,一邊進(jìn)行垃圾回收,完成工作似乎就變得遙遙無期了脂崔。

????????而一般來說滤淳,我們把新生代的回收稱為Minor GC,Minor意思是次要的砌左,新生代的回收一般回收很快娇钱,采用復(fù)制算法,造成的暫停時(shí)間很短绊困。而Full GC一般是老年代的回收,并伴隨至少一次的Minor GC适刀,新生代和老年代都回收秤朗,而老年代采用標(biāo)記-整理算法,這種GC每次都比較慢笔喉,造成的暫停時(shí)間比較長(zhǎng)取视,通常是Minor GC時(shí)間的10倍以上。

????????所以很明顯常挚,我們需要盡量通過Minor GC來回收內(nèi)存作谭,而盡量少的觸發(fā)Full GC。畢竟系統(tǒng)運(yùn)行一會(huì)兒就要因?yàn)镚C卡住一段時(shí)間奄毡,再加上其他的同步阻塞折欠,整個(gè)系統(tǒng)給人的感覺就是又卡又慢。

4.3.3 常見垃圾回收器

現(xiàn)在常見的垃圾收集器有如下幾種

新生代收集器:Serial吼过、ParNew锐秦、Parallel Scavenge

老年代收集器:Serial Old、CMS盗忱、Parallel Old

堆內(nèi)存垃圾收集器:G1

????鄙人學(xué)識(shí)尚淺,本文中如有不妥之處,請(qǐng)見諒蹬昌!也請(qǐng)指出!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末友多,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子闲昭,更是在濱河造成了極大的恐慌罐寨,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汤纸,死亡現(xiàn)場(chǎng)離奇詭異衩茸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門楞慈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幔烛,“玉大人,你說我怎么就攤上這事囊蓝《鲂” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵聚霜,是天一觀的道長(zhǎng)狡恬。 經(jīng)常有香客問我,道長(zhǎng)蝎宇,這世上最難降的妖魔是什么弟劲? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮姥芥,結(jié)果婚禮上兔乞,老公的妹妹穿的比我還像新娘。我一直安慰自己凉唐,他們只是感情好庸追,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著台囱,像睡著了一般淡溯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上簿训,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天咱娶,我揣著相機(jī)與錄音,去河邊找鬼煎楣。 笑死豺总,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的择懂。 我是一名探鬼主播喻喳,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼困曙!你這毒婦竟也來了表伦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤慷丽,失蹤者是張志新(化名)和其女友劉穎蹦哼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體要糊,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纲熏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片局劲。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡勺拣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鱼填,到底是詐尸還是另有隱情药有,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布苹丸,位于F島的核電站愤惰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赘理。R本人自食惡果不足惜宦言,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望商模。 院中可真熱鬧蜡励,春花似錦、人聲如沸阻桅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嫂沉。三九已至,卻和暖如春扮碧,著一層夾襖步出監(jiān)牢的瞬間趟章,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工慎王, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚓土,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓赖淤,卻偏偏與公主長(zhǎng)得像蜀漆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咱旱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355