jvm內(nèi)存分配&回收策略

前兩篇文章泉坐,我給大家分別介紹了jvm的內(nèi)存垃圾回收機制和gc算法以及jdk內(nèi)部現(xiàn)階段所有的gc回收器,接下來本來以為和大家一起直接介紹在web應(yīng)用中如何去做jvm的調(diào)優(yōu)實戰(zhàn),但是想了一下還有本篇文章的內(nèi)容,jvm內(nèi)存分配以及回收策略等方面的問題以及常見的面試題,在此荚恶,本篇文章為大家介紹一下!

jvm內(nèi)存分配&回收策略

jvm內(nèi)存結(jié)構(gòu)梅鹦,內(nèi)存模型以及jvm內(nèi)存調(diào)優(yōu)相比很多的java的程序員可能一味的覺得我現(xiàn)在懂很多的框架裆甩,像什么常見的企業(yè)級應(yīng)用框架ssh,ssm等齐唆;更何況這幾年比較盛行的分布式微服務(wù)框架像springBoot+spingCloud或者Dubbo+zookeeper嗤栓;以及圍繞著Base理論的數(shù)據(jù)最終一致性的服務(wù)器中轉(zhuǎn)軟件像redis,rabbitMQ,ES...等等等等這些更為的重要茉帅。在這里我表明自己的觀點叨叙,其實不然,框架我覺得是一位java程序員都應(yīng)當具備的應(yīng)用技能堪澎,在公司龐大的業(yè)務(wù)系統(tǒng)開發(fā)中擂错,你只會用框架,在項目生產(chǎn)中一但出現(xiàn)了問題樱蛤,那么你必然是知其然而不知其所以然钮呀,無法快速的解決問題。因此昨凡,所有編程語言的底層才是解決問題的最根本的手段爽醋,因此我們要熟練掌握,這樣在實際的開發(fā)過程中才能運籌帷幄便脊。

jvm內(nèi)存分配

談到j(luò)vm的內(nèi)存分配蚂四,在大部分的也就是說除了G1這一個垃圾回收器之外,首先大家還是要把這張圖一直銘記在自己的腦子中的哪痰!


jvm內(nèi)存分配圖

在java的jvm內(nèi)存結(jié)構(gòu)圖中遂赠,我們通常把內(nèi)存結(jié)構(gòu)統(tǒng)一的稱為運行時數(shù)據(jù)區(qū),當然為了更清晰的了解運行時數(shù)據(jù)區(qū)晌杰,我給大家做了清晰的劃分跷睦,當中存在我們常說的堆,棧這兩個重要的數(shù)據(jù)區(qū)域肋演!
-堆
如圖所示送讲,想要了解jvm的內(nèi)存分配就要熟悉堆空間,在堆中惋啃,我給大家劃分出了兩個大的部分:
1.那就是新生代和老年代
①.新生代主要是剛出生的對象,比如你代碼中經(jīng)常用的new ,以及Method.invoke()等操作监右,這些操作的對象都是在Eden去先分配出內(nèi)存边灭,然后等待gc的回收,那么在這個區(qū)域里面我也提交健盒,jvm主要做的回收就是MinorGC绒瘦,jvm默認的是假如一個對象在新生代的年齡到達15歲之后,將其晉升到老年代存儲扣癣。意思就是這個對象要在新生代中經(jīng)歷15次MinorGC之后不被回收惰帽,那么將進入老年代。當然不排除你自己的設(shè)定父虑,可以利用參數(shù)配置使大對象在Eden出生后直接進入老年代该酗。
大對象直接進入老年代:-XX:PretenureSizeThreshold=n(n代表你要限制的對象的字節(jié)數(shù)BIT)
②老年代主要存儲的都是一些老的油條對象,前幾篇文章我也都談到,在此內(nèi)存區(qū)域呜魄,是不可能采用標記復制算法的悔叽,因為那樣會減少一半的空間存儲量,降低程序的效率爵嗅。
2.新生代中又劃分出了三個區(qū)域
①Eden主要接受剛新生的對象
②Survivor0
③Survivor1
這兩個內(nèi)存區(qū)域主要是用于gc做垃圾回收算法時用到的娇澎,也就是MinorGC發(fā)生的主要內(nèi)存區(qū)域。
了解清楚新生代和老年代的主要作用之后睹晒,此時是我今年面試時趟庄,無意見面試官提到的一個面試題,原想我現(xiàn)在面試的崗位根本不能達到這樣的深度伪很,在此分享給大家戚啥!

面試題

這樣的一個場景,假設(shè)我現(xiàn)在堆內(nèi)存給的是100m是掰,新生代給的是10m虑鼎,那么Survivor0或者Survivor1是多少M
這樣的一個問題,在此也給大家簡單的用jvm參數(shù)解讀一下键痛,就是-Xms100m -Xmx100m -Xmn10m 這樣的一個簡單的jvm配置參數(shù)炫彩。

解讀

想要給面試官解答清楚這樣一個面試題的重要點就是,最少你要清楚這些配置參數(shù)代表什么意思絮短,面試題沒我我給的上述場景分析江兢,只有配置參數(shù),其二也就是在jvm底層針對Eden:Survivor0:Survivor1有一個默認的比例那就是8:1:1丁频。(我們也可以用-XX:SurvivorRatio參數(shù)控制比例)有了這樣的基礎(chǔ)之后杉允,就是簡單的計算問題了,新生代10m問s0或者s1多少m席里,按照比例關(guān)系叔磷,很清晰的回答都是1m!
-棧
棧這個內(nèi)存區(qū)域奖磁,大家可能不會太陌生改基,畢竟web程序中最多的就是一些邏輯業(yè)務(wù),那么棧的作用主要就是為了存儲臨時變量咖为,動態(tài)鏈接秕狰,以及Method return adress等等,后續(xù)會為大家畫出圖躁染,供大家理解鸣哀!


虛擬機棧結(jié)構(gòu)圖.png

在此有兩個面試題需要注意:
①普通的mvc三層業(yè)務(wù)Controller->service->dao,假設(shè)這樣一個用戶線程這樣的去三成執(zhí)行業(yè)務(wù)吞彤,那么在棧中三個方法是怎樣存儲的我衬!
答:棧大家也清楚理解,里面是有很多的棧幀排布的,遵循棧的數(shù)據(jù)結(jié)構(gòu)得知低飒,先進的元素最后出去许昨,那么必定Controller層的業(yè)務(wù)方法一定是在棧底的。dao的業(yè)務(wù)一定是在棧頂?shù)摹?br> ②是什么造成的棧溢出褥赊。java.lang.StackOverflowError
大家分析一下糕档,棧內(nèi)一般存儲的是什么東西,也無非就是一些臨時變量拌喉,方法返回值以及動態(tài)鏈表的引用等數(shù)據(jù)速那,那么造成棧溢出的最常見的可能就是運算分死循環(huán)或者說是一種遞歸調(diào)用!

jvm內(nèi)存回收策略
jvm回收策略.png

jvm的回收策略的話尿背,我是相對清晰的端仰,因為自己學這個也有從去年年底開始也有一部分時間,近階段在公司也碰巧用會這些也就實戰(zhàn)了一把田藐!
jvm的回收策略大致分為四大模塊:
1.大對象直接進入老年代
大對象直接進入老年代荔烧,這個意思根據(jù)你的項目內(nèi)存分析,配置jvm參數(shù)汽久,當對象的創(chuàng)建大小大于這個閾值的時候鹤竭,對象將不再新生代存活,直接進入老年代景醇。
配置參數(shù):-xx:PretenureSizeThreshold=n(單位bit)
在此臀稚,為大家寫一個例子
在此之前先為大家介紹一下查看jvm參數(shù)的基本的一下參數(shù)配置:
-XX:+PrintGCDetails --->這個參數(shù)是輸出jvm對的內(nèi)存參數(shù)詳情打印Console
-XX:+PrintCommandLineFlags -version --->這個主要是獲取jvm的版本和默認的gc垃圾回收器以及默認的參數(shù)配置等

實例1

先配置這樣的兩個參數(shù)進行分析


jvm參數(shù)參數(shù)分析.png

運行結(jié)果分析:


運行結(jié)果.png

①圖中,紅色為-XX:+PrintCommandLineFlags -version配置輸出
可以分析出:我們的jvm虛擬機版本是:

sun公司的HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)
此虛擬機默認的gc回收器是:-XX:+UseParallelGC
新聲代:Parellal Scavenge
老年代:Parellal Old這兩個gc回收器
②另一種顏色就是-XX:+PrintGCDetails輸出結(jié)果
從數(shù)據(jù)可以看出主要是:

Heap
 PSYoungGen      total 54272K, used 2796K [0x0000000783b80000, 0x0000000787800000, 0x00000007c0000000)
  eden space 46592K, 6% used [0x0000000783b80000,0x0000000783e3b038,0x0000000786900000)
  from space 7680K, 0% used [0x0000000787080000,0x0000000787080000,0x0000000787800000)
  to   space 7680K, 0% used [0x0000000786900000,0x0000000786900000,0x0000000787080000)
 ParOldGen       total 124416K, used 0K [0x000000070b200000, 0x0000000712b80000, 0x0000000783b80000)
  object space 124416K, 0% used [0x000000070b200000,0x000000070b200000,0x0000000712b80000)
 Metaspace       used 2250K, capacity 4480K, committed 4480K, reserved 1056768K
  class space    used 244K, capacity 384K, committed 384K, reserved 1048576K

我們不難看出三痰,因為對象想進入老年代的話吧寺,jvm默認是要經(jīng)歷15次MinorGC的,圖中我們沒有做堆內(nèi)存的限制散劫,因此程序比較小稚机,沒有發(fā)生gc回收的情況,接下來我們限制一下新生代的大小:

-Xms100m -Xmx100m -Xmn10m
參數(shù)配置.png

由于新生的對象會先進入Eden區(qū)获搏,這是我們的新生代Eden:s0:s0是8m:1m:1m;并且設(shè)置大對象直接進入老年代的閾值我們故意創(chuàng)建一個

/**
 * java
 *  gc   策略測試
 */
public class JavaGcDetails {

    private static final String GC_MAIN="gcDetails";

    private static final Integer _1MB =1024*1024;

    public void test(){
        System.out.printf("gc details");
    }

    /**
     * jvm 配置參數(shù) -Xms100m -Xmx100m -Xmn10m -XX:+PrintGCDetails -XX:SurvivorRatio=8
     * -XX:PretenureSizeThreshold=3145728
     * @param args
     */
    public static void main(String[] args) {
        String [] arg1,arg2,arg3;
        arg1 = new String [4 * _1MB];
    }

運行結(jié)果:


執(zhí)行結(jié)果.png

從結(jié)果中我們可以看出抒钱,這個對象進入了老年代!
2.不死小強進入老年代(長期存活的對象進入老年代)
長期存活對象進入老年代颜凯,用此參數(shù)限制
-XX:MaxTenuringThreshold=n
配置之后表示 新生代經(jīng)歷了多少次MinorGC之后的對象進入老年代

/**
 * java
 *  gc   策略測試
 */
public class JavaGcDetails {

    private static final String GC_MAIN="gcDetails";

    private static final Integer _1MB =1024*1024;

    public void test(){
        System.out.printf("gc details");
    }

    /**
     * jvm 配置參數(shù) -Xms100m -Xmx100m -Xmn10m -XX:+PrintGCDetails -XX:SurvivorRatio=8
     * -XX:PretenureSizeThreshold=3145728
     * -XX:MaxTenuringThreshold=1
     * @param args
     */
    public static void main(String[] args) {
        String [] arg1,arg2,arg3;
        arg1 = new String [4 * _1MB];
        arg2 = new String [4 * _1MB];
        arg3 = new String [4 * _1MB];
    }

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


執(zhí)行結(jié)果.png

3.對象年齡的動態(tài)判斷
如果在Survivor空間中相同年齡所有對象大小的總和大于Survivor空間的一半,年齡大于或等于該年齡的對象就可以直接進入老年代仗扬,無須等到MaxTenuringThreshold中要求的年齡症概。
4.空間分配擔保
HandlePromotionFailure,檢查老年代最大可用的連續(xù)空間是否大于歷次晉升到老年代對象的平均大小早芭,如果大于彼城,將嘗試著進行一次Minor GC;如果小于,或者設(shè)置不允許冒險募壕,那這時也要改為進行一次Full GC调炬。
① 在MinorGC之前,檢查老年代最大可用連續(xù)空間是否大于新生代所有對象的大小舱馅。
② 執(zhí)行MinorGC
③ 如果空間不夠缰泡。
④ 檢查HandlePromotionFailure是否開啟。
⑤ 如果沒有開啟代嗤。這個時候執(zhí)行Full GC棘钞。
⑥ 如果這個參數(shù)開啟,檢查檢查老年代最大可用的連續(xù)空間是否大于歷次晉升到老年代對象的平均大小干毅。
⑦ 如果大于宜猜,試著執(zhí)行MinorGC。
⑧ 如果小于硝逢,執(zhí)行Full GC姨拥。


空間分配擔保.png

在此基礎(chǔ)之上大家就可以針對web工程進行內(nèi)存的分析和漫長的調(diào)優(yōu)過程了,給大家附上一張渠鸽,我整理的jvm內(nèi)存參數(shù)表叫乌,大家可以對應(yīng)沒事檢測使用!

內(nèi)存管理參數(shù)
DisableExplicitGC   默認關(guān)閉    忽略來自System.gc()方法觸發(fā)的垃圾收集
ExplicitGCInvokesConcurrent 默認關(guān)閉    當收到System.gc()方法提交的來機收集申請時,使用CMS收集器進行收集
UseSerialGC Client模式的虛擬機默認開啟,其他模式關(guān)閉 虛擬機運行在Client模式下的默認值,打開此開關(guān)后,使用Serial + Serial Old的收集器組合進行內(nèi)存回收
UseParNewGC 默認關(guān)閉    打開此開關(guān)后,使用ParNew + Serial Old的收集器組合進行內(nèi)存回收
UseConcMarkSweepGC  默認關(guān)閉    打開此開關(guān)后,使用ParNew + CMS + Serial Old的收集器組合進行內(nèi)存回收.如果CMS收集器出現(xiàn)Concurrent Mode Failure,則Serial Old收集器將作為后備收集器
UseParallelGC   Server模式的虛擬機默認開啟,其他模式關(guān)閉 虛擬機運行在Server模式下的默認值,打開此開關(guān)后,使用Parallel Scavenge + Serial Old的收集器組合進行內(nèi)存回收
UseParallelOldGC    默認關(guān)閉    打開此開關(guān)后,使用Parallel Scavenge + Parallel Old的收集器組合進行內(nèi)存回收
SurvivorRatio   默認為8    新生代中Eden區(qū)域與Survivor區(qū)域的容量比
PretenureSizeThreshold  無默認值    直接晉升到老年代的對象大小,設(shè)置這個參數(shù)后,大于這個參數(shù)的對象將直接在老年代分配
MaxTenuringThreshold    默認值為15  晉升到老年代的對象年齡,每個對象在堅持過一次Minor GC之后,年齡就+1,當超過這個參數(shù)值時就進入老年代
UseAdaptiveSizePolicy   默認開啟    動態(tài)調(diào)整java堆中各個區(qū)域的大小及進入老年代的年齡
HandlePromotionFailure  jdk1.5及以前是默認關(guān)閉,jdk1.6默認開啟   是否允許分配擔保失敗,即老年代的剩余空間不足以應(yīng)付新生代的整個Eden和Survivor區(qū)的所有對象都存活的極端情況
ParallelGCThreads   少于或等于8個CPU時默認值為CPU數(shù)量值,多于8個CPU時比CPU數(shù)量值小  設(shè)置并行GC時進行內(nèi)存回收的線程數(shù)
GCTimeRatio 默認值99   GC時間占總時間的比率.僅在使用Parallel Scavenge收集器時生效
MaxGCPauseMills 無默認值    設(shè)置GC最大停頓時間.僅在使用Parallel Scavenge收集器時生效
CMSInitiatingOccupancyFraction  默認值68   設(shè)置CMS收集器在老年代空間被使用多少后觸發(fā)垃圾收集
UseCMSCompactAtFullCollection   默認開啟    設(shè)置CMS收集器在完成垃圾收集后是否要進行一次內(nèi)存碎片整理
CMSFullGCsBeforeCompaction  無默認值    設(shè)置CMS收集器在進行若干次垃圾收集后再啟動一次內(nèi)存碎片整理
ScavengeBeforeFullGC    默認開啟    在Full GC發(fā)生之前觸發(fā)一次Minor GC
UseGCOverheadLimit  默認開啟    禁止GC過程無限制的執(zhí)行,如果過于頻繁,就直接發(fā)生OutOfMemory
UseTLAB Server模式默認開啟    優(yōu)先在本地線程緩沖區(qū)中分配對象,避免分配內(nèi)存時的鎖定過程
MaxHeapFreeRatio    默認值70   當Xmx值比Xms值大時,堆可以動態(tài)收縮和擴展,這個參數(shù)控制當堆空閑大于指定比率時自動收縮
MinHeapFreeRatio    默認值40   當Xmx值比Xms值大時,堆可以動態(tài)收縮和擴展,這個參數(shù)控制當堆空閑小于指定比率時自動收縮
MaxPermSize 大部分情況下默認值是64MB  永久代的最大值
即時編譯參數(shù)
CompileThreshold    Client模式下默認值1500,Server模式下默認值10000  觸發(fā)即時編譯的閾值
OnStackReplacePercentage    Client模式下默認值933,Server模式下140    OSR比率,它是OSR即時編譯閾值計算公司的一個參數(shù),用于代替BackEdgeThreshold參數(shù)控制回邊計數(shù)器的實際溢出閾值
ReservedCodeCacheSize   大部分情況下默認值32MB   即時編譯器編譯的代碼緩存使得最大值
類型加載參數(shù)
UseSplitVerifier    默認開啟    使用依賴StackMapTable信息的類型檢查代替數(shù)據(jù)流分析,以加快字節(jié)碼校驗速度
FailOverToOldVerifier   默認開啟    當類型校驗失敗時,是否允許回到老的類型推到校驗方式進行校驗,如果開啟則允許
RelaxAccessControlCheck 默認開啟    在校驗階段放松對類型訪問性的限制
多線程相關(guān)參數(shù)
UseSpinning jdk1.6默認開啟,jdk1.5默認關(guān)閉   開啟自旋鎖以免線程頻繁的掛起和喚醒
PreBolckSpin    默認值10   使用自旋鎖時默認的自旋次數(shù)
UseThreadPriorities 默認開啟    使用本地線程優(yōu)先級
UseBiasedLocking    默認開啟    是否使用偏向鎖,如果開啟則使用
UseFastAccessorMethods  默認開啟    當頻繁反射執(zhí)行某個方法時,生成字節(jié)碼來加快反射的執(zhí)行速度
性能參數(shù)
AggressiveOpts  jdk1.6默認開啟,jdk1.5默認關(guān)閉   使用激進的優(yōu)化特征,這些特征一般是具備正面和負面雙重影響的,需要根據(jù)具體應(yīng)用特點分析才能判定是否對性能有好處
UseLargePage    默認開啟    如果可能,使用大內(nèi)存分頁,這項特性需要操作系統(tǒng)的支持
LargePageSizeInBytes    默認值4MB  使用指定大小的內(nèi)存分頁,這項特性需要操作系統(tǒng)的支持
StringCache 默認開啟    是否使用字符串緩存,開啟則使用
調(diào)試參數(shù)
HeapDumpOnOutOfMemoryError  默認關(guān)閉    在發(fā)生內(nèi)存溢出異常時是否生成堆轉(zhuǎn)儲快照,關(guān)閉則不生成
OnOutOfMemoryError  無默認值    當虛擬機拋出內(nèi)存溢出異常時,執(zhí)行指令的命令
OnError 無默認值    當虛擬機拋出ERROR異常時,執(zhí)行指令的命令
PrintClassHistogram 默認關(guān)閉    使用[ctrl]-[break]快捷鍵輸出類統(tǒng)計狀態(tài),相當于jmap-histo的功能
PrintConcurrentLocks    默認關(guān)閉    打印J.U.C中的狀態(tài)
PrintCommandLineFlags   默認關(guān)閉    打印啟動虛擬機時輸入的非穩(wěn)定參數(shù)
PrintFlagsFinal ----    顯示所有可設(shè)置的參數(shù)及它們的值(***從JDK 6 update 21開始才可以用)
PrintFlagsInitial   ----    顯示在處理參數(shù)之前所有可設(shè)置的參數(shù)及它們的值拱绑,然后直接退出程序
PrintCompilation    默認關(guān)閉    打印方法即時編譯信息
PrintGC 默認關(guān)閉    打印GC信息
PrintGCDetails  默認關(guān)閉    打印GC的詳細信息
PrintGCTimeStamps   默認關(guān)閉    打印GC停頓耗時
PrintTenuringDistribution   默認關(guān)閉    打印GC后新生代各個年齡對象的大小
TraceClassLoading   默認關(guān)閉    打印類加載信息
TraceClassUnloading 默認關(guān)閉    打印類卸載信息
PrintInlining   默認關(guān)閉    打印方法內(nèi)聯(lián)信息
PrintCFGToFile  默認關(guān)閉    將CFG圖信息輸出到文件,只有DEBUG版虛擬機才支持此參數(shù)
PrintIdealGraphFile 默認關(guān)閉    將Ideal圖信息輸出到文件,只有DEBUG版虛擬機才支持此參數(shù)
UnlockDiagnosticVMOptions   默認關(guān)閉    讓虛擬機進入診斷模式,一些參數(shù)(如PrintAssembly)需要在診斷模式中才能使用
PrintAssembly   默認關(guān)閉    打印即時編譯后的二進制信息

上述給大家介紹了jvm內(nèi)存分配和回收策略综芥,歡迎打擊一起討論學習。
謝謝大家猎拨!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末膀藐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子红省,更是在濱河造成了極大的恐慌额各,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吧恃,死亡現(xiàn)場離奇詭異虾啦,居然都是意外死亡,警方通過查閱死者的電腦和手機痕寓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門傲醉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呻率,你說我怎么就攤上這事硬毕。” “怎么了礼仗?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵吐咳,是天一觀的道長逻悠。 經(jīng)常有香客問我,道長韭脊,這世上最難降的妖魔是什么童谒? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮沪羔,結(jié)果婚禮上饥伊,老公的妹妹穿的比我還像新娘。我一直安慰自己任内,他們只是感情好撵渡,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著死嗦,像睡著了一般趋距。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上越除,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天节腐,我揣著相機與錄音,去河邊找鬼摘盆。 笑死翼雀,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的孩擂。 我是一名探鬼主播狼渊,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼类垦!你這毒婦竟也來了狈邑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤蚤认,失蹤者是張志新(化名)和其女友劉穎米苹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砰琢,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蘸嘶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了陪汽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片训唱。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖挚冤,靈堂內(nèi)的尸體忽然破棺而出况增,到底是詐尸還是另有隱情,我是刑警寧澤你辣,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布巡通,位于F島的核電站,受9級特大地震影響舍哄,放射性物質(zhì)發(fā)生泄漏宴凉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一表悬、第九天 我趴在偏房一處隱蔽的房頂上張望弥锄。 院中可真熱鬧,春花似錦蟆沫、人聲如沸籽暇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戒悠。三九已至,卻和暖如春舟山,著一層夾襖步出監(jiān)牢的瞬間绸狐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工累盗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寒矿,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓若债,卻偏偏與公主長得像符相,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蠢琳,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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