永安三年(306年),西晋“八王之乱”终于降下帷幕。东海王司马越取得最后的胜利。不久,司马越毒死惠帝,另立司马炽为帝,是为怀帝。第二年改元永嘉(307—313年)。永嘉时期,民族矛盾、阶级矛盾非常尖锐,自然灾难十分严重,西晋政权处于风雨飘摇之中。
永嘉元年(307年)二月,东莱豪族王弥从青、徐起兵反晋,自称为征东大将军。司马越派公车令鞠羡讨伐王弥,被王弥所杀。稍后,汲桑、石勒招集奴隶、囚徒和流民,队伍不断壮大,攻破邺城,杀西晋邺城都督、新蔡王司马腾。司马越令兖州刺史荀晞迎战,双方在阴平(今河北大名东)、平原(今山东平原)一带对垒数月,大小三十余战,互有胜负。由于荀晞实力雄厚,经验丰富,终于击溃汲桑、石勒。后汲桑战死。石勒投奔匈奴贵族刘渊建立的汉政权。王弥被晋将荀纯击败亦归附于汉。这时,西晋军队比反晋势力略占优势,但当晋军在战场上取得局部胜利后,统治者内部猜嫌又起。司马越因荀晞镇压汲、石有功,升其为抚军将军,都督青兖二州。于是,司马越拜荀晞征东大将军、开府仪同三司、侍中、假节、都督青州诸军事、青州刺史,又进其爵为东平郡公。荀晞立下大功,反失去兖州地盘,对司马越十分不满。到青州后,荀晞不再服从中央,而擅自置立参佐和守令。
永嘉二、三年(308—309年),北方各族反晋斗争力量都集中到汉王刘渊的旗帜下,反晋浪潮再度高涨,刘聪南据太行,石勒东下赵魏,王弥攻击青、徐、兖、豫等州。永定嘉三年秋冬,刘渊对洛阳发起两次攻击。九月,刘聪率军长驱至宜阳(今河南宜阳西)。自持兵强,懈怠不设备,遭到西晋弘农太守垣延的夜袭,大败而归。十一月,刘聪、王弥、刘曜等以精骑五万在前,呼延翼部以步卒后继,再次进攻洛阳。由于晋军顽强抵抗,呼延翼兵败,被部下杀死,汉军损失惨重。汉军两次失利,说明晋军尚有一定实力。但是,西晋统治者内部,尤其是司马越与怀帝之间的矛盾日益尖锐。怀帝稍亲政事,司马越立即流露出不悦之色,怀帝有心腹近臣缪播、缪胤、王延数人,司马越被诬犯上作乱,杀之于帝侧,怀帝亦悲亦惧,惟欷嘘叹息而已。后来,司马越悉数驱逐殿中武官,代之以东海国兵。
永嘉四年(310年)。汉军分兵消灭各地晋军有生力量,积聚粮食,扩大武装。八月,刘渊病死,刘聪篡夺大位。这年冬天,刘聪发起对洛阳的总攻,声势浩大。洛阳危如垒卵。司马越遣使征发各地援军,怀帝悲悲切切嘱咐使者转告各征镇说:“现在还有救,晚了就没救了。”可是使者如泥牛入海,杳无消息,始终不见各地都督、刺史发来一兵一卒。其时并州刘琨不能自保,王浚割据幽燕,或派不出兵,或按兵不动,荆湘交广四州都督山简“优游卒岁,惟酒是耽”,他派出的勤王之师在半路上就被打败。荆州刺史王澄也是只知纵酒,不亲庶事,他领着援军出来,听说山简败了,当即散众而还。洛阳文官武吏闻后都惶惶不安,很多人主张迁都避难。而身为宰辅与最高军事统帅的司马越既无退敌良策,又无坚守之志,竟以出讨或石勒借口,把皇帝扔在洛阳,而带领大军和一大批公卿官吏,匆匆出发。
司马越屯兵于项(今河南淮阳),留下潘滔为河南尹,总摄洛阳之事。潘滔不顾大局,再次挑起内部事端,诬害荀晞,荀晞兵力强盛,有恃无恐,岂能善罢甘休,上表强烈要求诛杀潘滔。司马越不许,荀晞更是怒不可遏,公开与司马越决裂,移文诸州郡列举自己的功绩与司马越的罪状。怀帝本来就憎恶司马越擅权,便诏令荀晞为大将军讨伐司马越,在汉军大兵压境的情况下,荀晞、司马越剑拔弩张,自相残杀。司马越心力交瘁,忧愤成疾。永嘉五年四月,病死于项。
司马越既死,众人推王衍为元帅,王衍不知所措,推让于襄阳王司马范,司马范也不敢接受,军中无人主事,乱作一团。他们置洛阳安危和怀帝的死活于不顾,扶司马越的灵柩回东海国,一二十万大军跟着向东逃跑。石勒闻报,立刻率轻骑追到苦县(今河南鹿邑东)、大败晋军,然后又指挥骑兵围攻晋军,乱箭齐发,晋军将士相互践踏,尸积如山,几无幸免者。王衍、司马范等王公贵族都束手就擒,石勒令对司马越剖棺焚尸,以示惩罚。又与王衍见面,王衍陈说西晋祸乱的原因,一再诉说自己不预政事,与己无关。为求活命,王衍劝石勒称帝。石勒怒喝道:“你名重天下,身居要职,且是少年登朝,直至白首,怎么能说不预政事?破坏天下,正是你的罪恶!”当晚,石勒派人推倒王衍等人住处的墙壁,把他们埋在残垣断壁里。
在洛阳危难中,荀晞曾建议迁都仓垣,又派兵迎搂怀帝,由于潘滔阻拦,也由于近臣贪恋洛阳财产,迁都没能实现,只能困守愁城。待到洛阳陷入绝境,宫廷侍卫或死或逃,没剩下几个人,车子也没有一辆。在几十名官吏的陪同下,怀帝步行走出宫门,准备逃离洛阳,一行人刚刚走到铜驼街,突然遇见一群拦路抢劫的饥民,只得退回宫中。七月,汉军呼延晏、刘曜、石勒、王弥等攻陷洛阳,俘获怀帝。汉军大肆烧杀掠夺,官吏百姓死者三万多人,城内一片大火,宫庙、官舍化为一片废墟。
汉帝被俘虏到平阳(今山西临汾),在他被杀之前,西晋各地的残余势力纷纷建立临时朝廷。司徒傅祗首先在洛阳建立行台,接着司空荀藩也在密县建立行台,奉秦王司马业为主,后徙屯许昌。同时,荀晞拥豫章王司马端为皇太子,而自命都督中外诸军事、录尚书事并在仓垣建行台,稍后,幽州王浚又立一个皇太子,这些临时朝廷的创立者或有复兴晋室的忠心,或有取代晋室的野心,但都维持不长。傅祗征兵四方,久候不至,自己染暴疾而亡。荀藩手下无兵,依赖阎鼎控聚的数千流民,反受阎鼎所制,荀晞骄奢苛暴,部众离叛,加上疫病饥馑,不久被石勒打败,他与司马端都当了俘虏。王浚局促于幽燕,调役繁重,属下不堪其命,鲜卑、乌桓都叛逃而走,兵势不断削弱,他所立的皇太子也莫名其妙地失踪了。
永嘉五年(311年)九月,刘曜占领长安,杀死守将南阳王司马模,其时关中诸郡,“百姓饥馑,白骨蔽野,百无一存”。晋安定太守贾疋,冯诩太守索綝,安夷护军鞠允,率领州刺史鞠特、扶风太守梁综合兵十五万围攻长安,屡败刘曜,刘曜不得不放弃长安,驱掠关中男女八万口退还平阳。时值阎鼎裹胁秦王司马业入关,贾疋迎之人居长安,立为皇太子。不久,贾疋战死,朝中诸将因争权大动干戈,阎鼎杀死梁综、鞠允、索綝等,又攻阎鼎,阎鼎出奔被杀。永喜七年(313年)五月,怀帝死讯传到长安,司马业继位为帝,他就是西晋的末代皇帝愍帝。这位13岁的皇帝即位时,“长安城中,户不盈百,蒿棘成林,公私有车四乘,百官无章服、印绶,惟桑版署号而已”。
鞠允在关中辅佐愍帝,艰苦地坚持了三年多,经常遭到刘聪、刘曜的攻击。建兴四年(316年),刘曜又攻入关中,进围长安。长安城中大饥,米一斗值黄金二两,人相食,死者大半。太仓中只余面饼数十个,鞠允磨为粉屑,熬粥以供帝室,很快也吃光了。十一月,愍帝出降刘曜,被送到平阳,次年被杀,西晋灭亡。