晋武帝去世,晋惠帝继位,司马炎的岳父杨骏托孤辅政,出汝南王镇守许昌。野心勃勃的皇后贾南风干政。当时杨骏执政,与贾后对立,杨骏为了巩固自身势力,任命其亲信掌管禁军,此举使宗室诸王与某些大臣不满。
291年贾后藉由楚王司马玮(司马炎之子)除去杨骏及其势力。任命汝南王司马亮(司马懿之子)与卫瓘掌政。不久贾后利用楚王司马玮与汝南王司马亮不合去除汝南王及卫瓘,再以伪诏杀司马玮,任命张华、裴頠及贾模等人掌政。
至此贾后夺权成功。所幸张华等人同心协力,尽忠职守,政局得以稳固。此时关中羌氐叛,294年匈奴郝散叛,不久平定。296年其弟郝度元以齐万年为首,联合西北马兰羌、卢水胡叛变。299年齐万年之乱平定。江统和郭钦都曾建议将胡族强制迁离,他所着《徙戎论》提出更完整的主张,晋室施行了优待少数民族的政策,代替过去的强制迁徙,但是没有对有野心的分裂贵族采取迁徙和防范措施。
由于太子司马遹非贾后亲生,贾后意图废除。300年太子被贾后污蔑谋反,被废。赵王司马伦采纳孙秀计,挑拨贾后杀掉太子。而后赵王伦联合齐王司马冏以替太子报仇为由发兵去除贾后及其党羽,赵王伦专政。
赵王司马伦自立为帝,改元建始,惠帝退位为太上皇。三月,齐王司马冏、河间王司马颙、成都王司马颖三王联合常山王司马乂(后封长沙王)伐赵王伦。五月去除赵王伦及其党羽,惠帝复位,齐王冏专政。302年成都王颖及河间王颙派军讨伐齐王冏,长沙王司马乂联合宫廷将领于京城洛阳响应。齐王司马冏及其党羽被除,长沙王司马乂掌政,被外戚羊玄之遥控。
303年成都王颖联合河间王颙率军攻击洛阳,讨伐羊玄之等人,但被长沙王乂屡屡击败。304年初洛阳城缺粮,宫廷将领逼东海王司马越奏免长沙王司马乂,开城投降。长沙王乂被河间王颙将领张方杀害,成都王颖迫惠帝立其为皇太弟,河间王颙为太宰,东海王越为尚书令。成都王颖胜利后,班师返邺,政治中心北移。而后宫廷将领陈轸集结各方兵力,挟惠帝讨伐成都王颖。最后失败,晋惠帝被俘,东海王越逃至其封国东海(今山东郯城北),河间王颙将领张方占领洛阳。
但不久司马越的亲弟并州刺史东瀛公司马腾及幽州刺史王浚联合异族鲜卑、乌桓等势力击败成都王颖。张方挟晋惠帝逃至洛阳,拥有关中及洛阳的河间王颙与东海王和解,最后成都王颖被废,河间王颙改立司马炽为皇太弟。
305年司马越在山东再次起兵,西向进攻关中。306年东海王越攻入长安。司马颙和司马颖败走,司马模占领长安。东海王司马越迎惠帝还洛阳,随后成都王被害,晋惠帝被司马越毒死,其弟豫章王司马炽继位,是少数民族又受到当时士族统治者极端压迫,内迁诸民族乘机举兵纷纷寻求独立谋生,造成五胡乱华,永嘉乱后士族百姓纷纷南渡自保。其中“能建邦命氏成为战国者”有十六国,分别是:成汉、前赵、后赵、前燕、前秦、前凉、后燕、后秦、西秦、后凉、南凉、南燕、西凉、北凉、大夏、北燕。后世由此称为五胡十六国时期。实际上先后还有冉魏、翟魏、西燕、桓楚、谯蜀、前后仇池等政权。
当时外族有匈奴、羯、鲜卑、氐、羌、卢水胡、乌桓、巴氐及高句丽。八王之乱期间,地方势力不断膨胀,少数民族中的分裂分子陆续叛变,氐族李雄在益州逐渐势大,于304年称王,两年后称帝,国号成,与罗尚在巴郡对峙。304年司马颖遭王浚和司马腾围攻,遣匈奴领袖刘渊回并州发兵支援,刘渊乘机宣布独立。308年刘渊称帝,国号汉,割据山西西南部。由于晋朝在中原解除武备,无力平定叛乱,加上严重的自然灾害,严重动摇了统治基础。晋室在八王之乱后面临一场覆亡危机。
刘渊为了要扩充版图,遣子刘聪攻打洛阳,多次被击败。石勒及王弥掠夺关东各州,石勒吞并王弥,脱离刘渊转战南下。310年刘渊去世,刘聪杀新帝刘和自立为帝。同年,石勒经宛城、襄阳,掠夺江汉一带,隔年北返。当时关东又有蝗灾,洛阳缺粮,鲜卑拓跋部猗卢等欲派兵防御洛阳,司马越以无粮推辞,并率朝中重臣及诸将东讨石勒,怀帝困于洛阳。
311年晋怀帝与司马越的矛盾爆发,密诏苟曦伐之,随后司马越病逝,王衍率军归葬封国。当他东行至苦县(今河南鹿邑县)时,遭石勒袭击,晋军精锐受屠尽亡,重臣降后被杀。此时洛阳空虚,被刘聪、王弥兵攻破,杀害官员百姓三万馀人,掳走晋怀帝,史称“永嘉之祸”。313年晋怀帝被杀,晋愍帝于长安继立帝位,刘聪派刘曜持续攻打。316年晋愍帝投降,最后受辱被杀,至此西晋亡。而后,各族陆续在北方建立国家,史称“五胡十六国”。
西晋亡后,在北方尚有多个忠于晋朝的地区,即并州北部刘琨、幽州段匹磾、冀州的邵续、青州的曹嶷、徐龛;东北还有慕容廆、段眷;北方还有代王;西北凉州还有张氏集团。然而,并州刘琨先被石勒击溃,投靠幽州段匹磾。段匹磾则奉东晋王敦密令将刘琨处死,之后段匹磾也被石勒击败。刘聪死后,部将分裂,叛逃的多达二十万户,晋军也一度攻打到离其都城不远的绛县,靳准杀刘粲,建立晋藩天王制度,向晋朝臣属,不久遇害。石勒占领了河东,刘曜也抛弃汉旗