JVM內(nèi)存管理總結(jié)

前言

“Write Once Run anywhere” 是得益于JVM昔案,工作了將近一年的時(shí)間也明白了咕痛,最重要的還是思想結(jié)構(gòu)和底層的實(shí)現(xiàn)麻惶,因?yàn)榫退阈录夹g(shù)層出不窮,它們也只不過(guò)是在錦上添花而已宪拥。
本文是我是從《深入理解Java虛擬機(jī)》總結(jié)而來(lái),如果有什么說(shuō)的不對(duì)的地方铣减,還請(qǐng)各位看官指出她君,我還進(jìn)行改正

正文

JDK,JRE葫哗,JVM三者之間的關(guān)系

JDK包含JRE缔刹,JRE包含JVM

內(nèi)存溢出診斷

通過(guò)一個(gè) VM argument進(jìn)行設(shè)置 -xx: +HeapDumpOutOfMemoryError

這個(gè)命令會(huì)導(dǎo)出一個(gè)分析文件,需要下載一些工具對(duì)這個(gè)文件加以分析劣针。

還可以通過(guò)JDK自帶的可視化工具 console.exe 進(jìn)行監(jiān)控校镐。

JVM分類

  • Sun Classical VM(已淘汰,第一臺(tái)商用的java虛擬機(jī))

    解釋器和編譯器不能一同執(zhí)行捺典。

    只能使用純解釋器的方式來(lái)執(zhí)行java代碼

  • Exact VM

    編譯器和解釋器混合工作即兩級(jí)及時(shí)編譯器

  • Hot Spot

    就是我們現(xiàn)在最普遍使用的虛擬機(jī)鸟廓。

JAVA虛擬機(jī)內(nèi)存管理

java虛擬機(jī)在執(zhí)行程序的時(shí)候會(huì)把它所管理的區(qū)域劃分成不同的數(shù)據(jù)區(qū)。

內(nèi)存區(qū)域可以分為兩個(gè)部分:

1.線程共享區(qū)

  • 方法區(qū)

  • Java堆

    • 新生代

      • Eden(伊甸園)

      • Survivor(存活區(qū))

    • 老年代

      • Tenured Gen

2.線程獨(dú)占區(qū)

  • 虛擬機(jī)棧

  • 本地方法棧

  • 程序計(jì)數(shù)器

內(nèi)存區(qū)域之程序計(jì)數(shù)器

是一塊較小的內(nèi)存空間襟己,是一個(gè)當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器
字節(jié)碼解釋器就是通過(guò)改變這個(gè)計(jì)數(shù)器的值來(lái)選取下一條需要執(zhí)行的字節(jié)碼指令
如果執(zhí)行的是線程的java方法引谜,計(jì)時(shí)器記錄的是虛擬機(jī)字節(jié)碼的指令地址,
如果執(zhí)行的是native方法擎浴,那么這個(gè)計(jì)數(shù)器的值是空的(Undefined)
那么另一個(gè)問(wèn)題:為什么需要用程序計(jì)數(shù)器保存執(zhí)行的行號(hào)呢员咽,是為了線程上下文切換,保證了線程不會(huì)錯(cuò)亂贮预,線程只是執(zhí)行操作贝室,而并不會(huì)保存數(shù)據(jù)。

內(nèi)存區(qū)域之虛擬機(jī)棧

描述的Java方法運(yùn)行的內(nèi)存模型

每一個(gè)方法的調(diào)用到完成都對(duì)應(yīng)著棧幀在虛擬機(jī)棧中入棧和出棧的過(guò)程仿吞。

  • 棧幀:每個(gè)方法執(zhí)行滑频,都會(huì)創(chuàng)建一個(gè)棧幀,伴隨著這個(gè)方法的產(chǎn)生與完成茫藏,用于存儲(chǔ)局部變量表(定長(zhǎng)為32)误趴,操作數(shù)棧,動(dòng)態(tài)鏈接(面向?qū)ο蟮亩鄳B(tài)性)务傲,方法出口(兩種出棧:1)return 2)exception)等凉当。

  • 局部變量表:存放的是編譯器,數(shù)據(jù)類型售葡,引用類型看杭,returnAddress類型

    (Tips:這個(gè)局部變量表,指的就是我們平常說(shuō)的棧)

棧的區(qū)域是固定的挟伙,當(dāng)我們不斷調(diào)用方法楼雹,就會(huì)不斷產(chǎn)生棧幀進(jìn)入棧中,如果超出了棧的大小,就會(huì)出現(xiàn)stackOverflow的異常贮缅,想象平常最容易出現(xiàn)的場(chǎng)景就是遞歸榨咐,如果沒(méi)寫(xiě)好的話,無(wú)止境的遞歸谴供。

內(nèi)存區(qū)域之本地方法棧

本地方法棧為虛擬機(jī)執(zhí)行native方法服務(wù)

而虛擬機(jī)棧為虛擬機(jī)執(zhí)行java方法服務(wù)

這就是二者唯一區(qū)別的區(qū)別块茁,在***hot spot VM中這兩個(gè)區(qū)域并沒(méi)有明顯的區(qū)分。
之所以開(kāi)辟這個(gè)區(qū)域桂肌,是為了方便和系統(tǒng)交互数焊,使用java和操作系統(tǒng)交互,有不便之處崎场,所以最頂層的ClassLoader采用的C++編寫(xiě)佩耳。

內(nèi)存區(qū)域之堆

內(nèi)存中最大的一塊。

存放對(duì)象的實(shí)例谭跨。

垃圾收集器管理的主要區(qū)域干厚,所以很多人稱之為GC堆

如果堆內(nèi)存溢出,會(huì)產(chǎn)生OutOfMemeory的Error

-Xmx -Xms饺蚊, 這兩個(gè)VM參數(shù)萍诱,可以修改堆大小

內(nèi)存區(qū)域之方法區(qū)

很多人稱之為永生代

垃圾收集在這個(gè)區(qū)域比較少見(jiàn)污呼。

存儲(chǔ)虛擬機(jī)加載的類信息(類的版本裕坊,字段,方法燕酷,接口)籍凝,常量,靜態(tài)變量苗缩,即時(shí)編譯器(JIT)編譯后的代碼等數(shù)據(jù)饵蒂。

可能出現(xiàn)OutOfMemory

運(yùn)行時(shí)常量池

屬于方法區(qū)的一部分

存放編譯時(shí)生成的字面量,以及符號(hào)引用

小例子:

String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");

在這里 a與b的地址是相同的酱讶,這收益于常量池退盯,而c與a,b是不相同的因?yàn)閚ew是直接在堆中開(kāi)辟了一條內(nèi)存空間泻肯,不受常量池影響的

直接內(nèi)存大多時(shí)候也被稱為堆外內(nèi)存渊迁,自從 JDK 引入 NIO 后,直接內(nèi)存的使用也越來(lái)越普遍灶挟。通過(guò) native 方法可以分配堆外內(nèi)存琉朽,通過(guò) DirectByteBuffer 對(duì)象來(lái)操作。

對(duì)象創(chuàng)建

給對(duì)象分配內(nèi)存的方式:

  • 指針碰撞

  • 空閑列表

具體使用哪一種方式稚铣,是由堆內(nèi)存是否規(guī)整決定的箱叁,是否規(guī)整是由垃圾回收機(jī)制決定的墅垮,如果垃圾回收會(huì)把區(qū)域變得相對(duì)完整則使用指針碰撞,如果是零散的耕漱,則使用空閑列表算色。

對(duì)象的結(jié)構(gòu)

對(duì)象的大小必須是八的整數(shù)倍。

對(duì)象結(jié)構(gòu):

  • Header (自身運(yùn)行時(shí)數(shù)據(jù)螟够,類型指針)

    • markword(自身運(yùn)行時(shí)數(shù)據(jù))

      第一部分markword,用于存儲(chǔ)對(duì)象自身的運(yùn)行時(shí)數(shù)據(jù)剃允,如哈希碼(HashCode)、GC分代年齡齐鲤、鎖狀態(tài)標(biāo)志、線程持有的鎖椒楣、偏向線程ID给郊、偏向時(shí)間戳等,這部分?jǐn)?shù)據(jù)的長(zhǎng)度在32位和64位的虛擬機(jī)(未開(kāi)啟壓縮指針)中分別為32bit和64bit捧灰,官方稱它為“MarkWord”淆九。

    • klass(類型指針)

      這個(gè)區(qū)域存放的是klass類型的指針,這個(gè)指針說(shuō)明了當(dāng)前這個(gè)對(duì)象是哪個(gè)類的實(shí)例毛俏。

    • 數(shù)組長(zhǎng)度(只有數(shù)組對(duì)象有)

      記錄了數(shù)組的長(zhǎng)度炭庙,所以我們才可以通過(guò)length調(diào)用長(zhǎng)度

  • instanceData

    這個(gè)區(qū)域是真實(shí)存儲(chǔ)信息的地方,不管是從父類繼承來(lái)的還是自己所有的煌寇,都需要進(jìn)行記錄焕蹄。

  • padding 填充內(nèi)存的作用,因?yàn)閷?duì)象分配的內(nèi)存必須是八的整數(shù)倍阀溶,所以如果在instanceData并沒(méi)有對(duì)齊的情況下腻脏,便會(huì)填充

對(duì)象的訪問(wèn)定位

  • 使用句柄:有點(diǎn)像是一種間接尋址的感覺(jué)在堆內(nèi)存中,存在一個(gè)句柄池银锻,引用指向了句柄池中的一塊地址永品,然后句柄池再指向堆內(nèi)存,使用這種方法最大的好處就是存儲(chǔ)的是穩(wěn)定的句柄地址击纬。

  • 使用指針:引用直接指向堆內(nèi)存鼎姐。最大的好處就是速度快,節(jié)省了一次指針定位的開(kāi)銷

虛擬機(jī)參數(shù)

1.-Xms 設(shè)置堆的最小值

2.-Xmx 設(shè)置堆的最大值

3.-Xss 設(shè)置棧容量

垃圾回收

打印GC的詳細(xì)信息 需要在VM 參數(shù)中加入下面兩個(gè)參數(shù):-verbose:gc -xx:PrintGCDetail

如何判定對(duì)象為垃圾對(duì)象更振?

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

在對(duì)象中添加一個(gè)引用計(jì)數(shù)器炕桨,當(dāng)有地方引用時(shí)+1,當(dāng)引用失效-1殃饿。
但是一般并不使用,因?yàn)槿绻嬖谝玫南嗷ヒ蕾嚹敲匆糜?jì)數(shù)法將會(huì)失效谋作。

2.可達(dá)性分析

從GC root 節(jié)點(diǎn),向下搜索乎芳,如果一個(gè)地址對(duì)于GC root對(duì)象(包括 虛擬機(jī)棧中的局部常量表中的引用的對(duì)象遵蚜,方法區(qū)中類靜態(tài)屬性引用的對(duì)象帖池,方法區(qū)中常量所引用的的對(duì)象,本地方法棧中引用的對(duì)象)吭净,再也沒(méi)有任何可走的路徑睡汹,那么將會(huì)把在堆中的整個(gè)內(nèi)存都給回首掉。

這里說(shuō)的最多的字眼就是引用寂殉,Java 中一共包括四種引用方法:

  • 強(qiáng)引用
    垃圾回收器永遠(yuǎn)不會(huì)回收掉強(qiáng)引用的對(duì)象
  • 軟引用
    有用但是非必須囚巴,在內(nèi)存即將溢出之前如果有軟引用會(huì)調(diào)用第二次GC,如果還是溢出友扰,才會(huì)曝出異常彤叉。使用SoftReference來(lái)使用軟引用
  • 弱引用
    非必須的引用,只能存活到下一次GC之前村怪,無(wú)論內(nèi)存是否足夠秽浇,使用WeakReference 來(lái)使用弱引用。
  • 虛引用
    這種引用存在的目的是甚负,當(dāng)這個(gè)引用的對(duì)象被回收的時(shí)候柬焕,我們會(huì)得到一個(gè)通知,提供PhantomReference來(lái)實(shí)現(xiàn)虛引用梭域。

大多數(shù)情況下斑举,回收的都是堆區(qū),很少收集方法區(qū)病涨,那是因?yàn)檫@樣做性價(jià)比很低富玷。

如果回收方法區(qū)的話,主要回收兩種:廢棄常量既穆,無(wú)用的類凌彬。

回收策略:

  • 標(biāo)記-清除算法

    通過(guò)可達(dá)性分析算法,首先標(biāo)記有哪些是需要清理的循衰,然后再將它們進(jìn)行清除铲敛。這個(gè)算法簡(jiǎn)單,但是存在的問(wèn)題就是效率問(wèn)題和空間問(wèn)題会钝。被標(biāo)記可能十分分散伐蒋,清理后,在內(nèi)存里就會(huì)出現(xiàn)特別零散的空間迁酸,不利于日后開(kāi)辟空間使用先鱼。

  • 復(fù)制算法

    復(fù)制算法,將堆內(nèi)存劃分成兩份奸鬓,然后操作其中的一份焙畔,當(dāng)需要進(jìn)行垃圾回收的時(shí)候,復(fù)制算法會(huì)講沒(méi)有被回收的實(shí)例復(fù)制到另一份中去然后串远,將原來(lái)的所有的(不管有沒(méi)有被回收的都刪除掉)刪除掉宏多,然后在另一份中進(jìn)行繼續(xù)操作儿惫,下次在GC的時(shí)候,就和剛剛的操作一樣伸但,簡(jiǎn)單的說(shuō)就是兩個(gè)區(qū)域交替的工作肾请。這樣有效的解決了標(biāo)記-清除算法的效率問(wèn)題但是這個(gè)問(wèn)題更胖,造成了堆內(nèi)存中有空間浪費(fèi)的情況

    現(xiàn)在大多數(shù)虛擬機(jī)新生代都是采用了這種回收策略铛铁。

    多說(shuō)一點(diǎn),在hotspot中却妨,新生代會(huì)有一個(gè)eden區(qū)饵逐,兩個(gè)survior區(qū),比例為8:1彪标,每次一個(gè)eden區(qū)和一個(gè)survior區(qū)被占用梳毙,也就是說(shuō)只會(huì)有一個(gè)survior區(qū)被浪費(fèi)掉。

  • 標(biāo)記-整理算法

    一般應(yīng)用與老年代捐下,因?yàn)閺?fù)制算法消耗空間,可能需要內(nèi)存擔(dān)保萌业。

    這個(gè)算法是將不需要GC的對(duì)象移向內(nèi)存的一段坷襟,然后將除了一端區(qū)域界線外的對(duì)象全部清除掉

  • 分代收集算法

    根據(jù)不同的內(nèi)存區(qū)域(新生代,或者老年代)生年,選擇不同的GC算法婴程。

    新生代使用復(fù)制算法,而老年代時(shí)候標(biāo)記-清理抱婉,或標(biāo)記-整理档叔,可以做到每一塊都因地制宜。

垃圾回收器:

不同的垃圾回收器對(duì)應(yīng)不同的使用場(chǎng)景蒸绩。

垃圾收集器的不斷推塵出新衙四,其實(shí)就是一個(gè)不斷縮短垃圾回收時(shí)間的過(guò)程。

  • Serial

    • 最基本

    • 單線程

      這就導(dǎo)致了一個(gè)問(wèn)題患亿,多線程并發(fā)運(yùn)行传蹈,但是需要垃圾回收了,那么所有線程都被阻塞步藕,只有垃圾回收線程在運(yùn)行惦界,直到回收完畢,其他線程才繼續(xù)運(yùn)行咙冗。

      這個(gè)回收器對(duì)于運(yùn)行在client端是一個(gè)好的選擇沾歪。

  • Parnew

    • 多線程

      開(kāi)多個(gè)線程"打掃衛(wèi)生",效率更高雾消,多個(gè)線程共同工作的時(shí)候灾搏,還是會(huì)導(dǎo)致阻塞挫望。

    • 復(fù)制算法(新生代收集器),可以與Cms(老年代收集器)共同使用

  • Parallel scavenge

    • 復(fù)制算法(新生代收集器)确镊,不可以與Cms共同使用

    • 多線程收集器

    • 達(dá)到可控制的吞吐量(吞吐量:cpu用于運(yùn)行用戶代碼的時(shí)間與cpu消耗的總時(shí)間的比值)

      吞吐量 = 執(zhí)行用戶代碼的時(shí)間/(執(zhí)行用戶代碼的時(shí)間 + 垃圾回收的時(shí)間)

  • Cms(Concurrent Mark sweep)

    可以邊扔垃圾邊打掃士骤。

    • 使用標(biāo)記-清理算法

    • 工作過(guò)程

      • 初始標(biāo)記
      • 并發(fā)標(biāo)記
      • 重新標(biāo)記
      • 并發(fā)清理
    • 優(yōu)點(diǎn)

      • 并發(fā)收集
      • 低停頓
    • 缺點(diǎn)

      • 占用大量CPU
      • 無(wú)法清理浮動(dòng)垃圾
  • G1

    • 使用標(biāo)記-整理算法
    • 優(yōu)點(diǎn)
      • 并行和并發(fā)
      • 分代收集
      • 空間整合
    • 工作過(guò)程
      • 初始標(biāo)記
      • 并發(fā)標(biāo)記
      • 最終標(biāo)記
      • 篩選回收
    • 工作原理
      • G1與其他的收集器在內(nèi)存布局上有很大的差別,它是將內(nèi)存劃分成了一塊一塊可以不連續(xù)的region蕾域,雖然保留新生代拷肌,老年代,但是已經(jīng)不在物理隔離旨巷。在后臺(tái)會(huì)維護(hù)一個(gè)優(yōu)先列表巨缘,每次根據(jù)允許的收集時(shí)間,回收掉價(jià)值最大的region區(qū)采呐,所以這個(gè)收集器叫 Garbage first若锁。

上面有一個(gè)概念,容易讓人混淆斧吐,那就是并發(fā)和并行又固,舉個(gè)例子,并行就是你去看病煤率,醫(yī)院有多個(gè)看病的醫(yī)生仰冠,而并發(fā)就是有多個(gè)病人找了同一個(gè)醫(yī)生。

內(nèi)存分配

內(nèi)存分配原則:

  • 優(yōu)先分配到Eden區(qū)蝶糯,當(dāng)Eden區(qū)內(nèi)存不足的時(shí)候洋只,會(huì)發(fā)生一次 Minor GC

  • 大對(duì)象直接分配到老年代昼捍,因?yàn)镋den區(qū)經(jīng)常出現(xiàn) Minor GC识虚,而且采用的是復(fù)制算法,如果把大對(duì)象放在其中不方便移動(dòng)妒茬,所以放在了GC不經(jīng)常發(fā)生的老年代担锤。發(fā)生在老年代的GC,我們稱之為 Full GC/Major GC乍钻,而且Full GC的速度要比 Minor GC 慢上10倍以上妻献。

    那什么是大對(duì)象呢?大對(duì)象指的是在內(nèi)存中需要大量的連續(xù)內(nèi)存团赁,例如說(shuō) 長(zhǎng)的字符串或者大的數(shù)組育拨。

  • 長(zhǎng)期存活的對(duì)象分配到老年代

    • 每個(gè)對(duì)象都會(huì)有一個(gè)年齡對(duì)象計(jì)數(shù)器,這個(gè)計(jì)數(shù)器會(huì)因?yàn)槊恳淮翁舆^(guò)了GC就會(huì)增加1欢摄,等到長(zhǎng)到15(默認(rèn)值)的時(shí)候熬丧,便會(huì)晉升到老年代。
  • 空間分配擔(dān)保

    • 例子:假如現(xiàn)在分別有2M,2M,2M,4M的對(duì)象怀挠,然后我們的Eden區(qū)設(shè)置為8M析蝴。
      那么前三個(gè)會(huì)首先進(jìn)入到Eden區(qū)域中害捕,但是卻發(fā)現(xiàn)4M對(duì)象放不進(jìn)去,那么會(huì)將之前的6M移到別的空閑區(qū)域中闷畸,然后在eden中放入4M對(duì)象尝盼,這個(gè)叫做 空間分配擔(dān)保
  • 動(dòng)態(tài)對(duì)象年齡判斷

    • 這是什么意思呢?當(dāng)對(duì)象的年齡還沒(méi)到進(jìn)入老年代的閥值(默認(rèn)15)的情況下佑菩,也是有可能進(jìn)入老年代的盾沫。那就是當(dāng)survivor區(qū)中同一年齡的所有對(duì)象的大小大于survivor內(nèi)存大小的一半的時(shí)候,大于或等于這個(gè)年齡的對(duì)象將至今進(jìn)入老年組殿漠。
  • 逃逸分析與棧上分配

    • 對(duì)象的作用域僅在方法中有效赴精,沒(méi)有發(fā)生逃逸,則把對(duì)象放到棧內(nèi)存中

      換句話說(shuō) 能使用局部變量绞幌,盡量使用局部變量

第四十九節(jié):虛擬機(jī)工具

虛擬機(jī)工具:

  • JPS:java process status

    • -m 運(yùn)行時(shí)傳入的參數(shù)

    • -v 虛擬機(jī)傳入的參數(shù)

    • -l 詳細(xì)的類信息蕾哟,或者jar包信息

  • Jstate:監(jiān)控虛擬機(jī)的各種運(yùn)行狀態(tài)的,例如類裝載莲蜘,內(nèi)存谭确,垃圾回收,JIT編譯等數(shù)據(jù)的

  • Jinfo:實(shí)時(shí)查看和調(diào)整虛擬機(jī)各項(xiàng)參數(shù)

    • -v可以查看在啟動(dòng)的時(shí)候票渠,指定的參數(shù)列表
  • Jmap:用于生成堆轉(zhuǎn)儲(chǔ)快照逐哈,一般稱為heapdump或dump

  • Jhat:結(jié)合jmap生成的文件進(jìn)行分析,形成可視化潔面

  • Jstack:生成當(dāng)前時(shí)刻線程快照

  • HSDIS:生成JIT的反編譯代碼

  • Jconsole:代替了JPS庄新,并且可以查看遠(yuǎn)程進(jìn)程的狀態(tài)。

  • VisualVM:多合一故障處理工具

性能調(diào)優(yōu)例子

問(wèn)題為將用戶績(jī)效考核信息處理為一個(gè)Excel薯鼠,但是時(shí)不時(shí)的不定時(shí)間會(huì)出現(xiàn)卡頓择诈。

解決思路:

  • 優(yōu)化sql ?

  • 監(jiān)控CPU ?

  • 監(jiān)控內(nèi)存 ?

    • 經(jīng)常Full GC ?

根本原因?yàn)榘岩慌_(tái)tomcat的堆設(shè)置的太大,而且用戶生成excel的時(shí)間比較集中出皇,導(dǎo)致大對(duì)象不斷的生成羞芍,導(dǎo)致老年代告急,所以經(jīng)常Full GC郊艘,產(chǎn)生full gc后所有其他的工作線程被阻塞荷科,所以導(dǎo)致會(huì)有時(shí)間空檔期。

解決方案:在一臺(tái)服務(wù)器上部署多個(gè)服務(wù)器構(gòu)成集群纱注,每個(gè)集群的堆分配4G畏浆。

后記

在今后的不斷學(xué)習(xí)中,我會(huì)不斷的更新這篇文章狞贱。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刻获,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瞎嬉,更是在濱河造成了極大的恐慌蝎毡,老刑警劉巖厚柳,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異沐兵,居然都是意外死亡别垮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)扎谎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)碳想,“玉大人,你說(shuō)我怎么就攤上這事簿透∫婆郏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵老充,是天一觀的道長(zhǎng)葡盗。 經(jīng)常有香客問(wèn)我,道長(zhǎng)啡浊,這世上最難降的妖魔是什么觅够? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮巷嚣,結(jié)果婚禮上喘先,老公的妹妹穿的比我還像新娘。我一直安慰自己廷粒,他們只是感情好窘拯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著坝茎,像睡著了一般涤姊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗤放,一...
    開(kāi)封第一講書(shū)人閱讀 51,775評(píng)論 1 307
  • 那天思喊,我揣著相機(jī)與錄音,去河邊找鬼次酌。 笑死恨课,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的岳服。 我是一名探鬼主播剂公,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吊宋!你這毒婦竟也來(lái)了诬留?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎文兑,沒(méi)想到半個(gè)月后盒刚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绿贞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年因块,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片籍铁。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涡上,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拒名,到底是詐尸還是另有隱情吩愧,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布增显,位于F島的核電站雁佳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏同云。R本人自食惡果不足惜糖权,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望炸站。 院中可真熱鬧星澳,春花似錦、人聲如沸旱易。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)阀坏。三九已至如暖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間全释,已是汗流浹背装处。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工募谎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留穴亏,地道東北人蟀架。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像李命,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子箫老,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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

  • 原文閱讀 前言 這段時(shí)間懈怠了封字,罪過(guò)! 最近看到有同事也開(kāi)始用上了微信公眾號(hào)寫(xiě)博客了,挺好的~給他們點(diǎn)贊阔籽,這博客我...
    碼農(nóng)戲碼閱讀 5,979評(píng)論 2 31
  • 內(nèi)存溢出和內(nèi)存泄漏的區(qū)別 內(nèi)存溢出:out of memory流妻,是指程序在申請(qǐng)內(nèi)存時(shí),沒(méi)有足夠的內(nèi)存空間供其使用笆制,...
    Aimerwhy閱讀 743評(píng)論 0 1
  • 這篇文章是我之前翻閱了不少的書(shū)籍以及從網(wǎng)絡(luò)上收集的一些資料的整理绅这,因此不免有一些不準(zhǔn)確的地方,同時(shí)不同JDK版本的...
    高廣超閱讀 15,615評(píng)論 3 83
  • Java和C++之間有一堵由內(nèi)存動(dòng)態(tài)分配和垃圾收集技術(shù)所圍成的“高墻”在辆,墻外面的人想進(jìn)來(lái)证薇,墻里面的人想出來(lái)。 對(duì)象...
    胡二囧閱讀 1,091評(píng)論 0 4
  • JVM架構(gòu) 當(dāng)一個(gè)程序啟動(dòng)之前匆篓,它的class會(huì)被類裝載器裝入方法區(qū)(Permanent區(qū))浑度,執(zhí)行引擎讀取方法區(qū)的...
    cocohaifang閱讀 1,667評(píng)論 0 7