291年,晋惠帝司马衷的皇后贾南风和楚王司马玮合谋,杀掉了当时掌权的杨骏。杨骏是杨太后的哥哥,非常受武帝司马炎的信任,从武帝后期开始便主持国家大事,和两个弟弟杨珧杨济一起,被称为“三杨”。惠帝继位后,杨骏以太尉的身份主理军国大事,独揽大权,结果引起了司马氏皇族和皇后贾南风的不满,贾南风突然袭击,以谋反罪把“三杨”和他们的全家抓起来杀掉,把杨太后关进冷宫饿死。任用汝南王司马亮和太保卫管理政事,又让杀杨骏有功的楚王司马玮管禁军。司马玮目中无人,横行霸道,听说卫要夺自己的兵权,便和贾南风合计,以汝南王司马亮和卫合谋造反为名,杀了司马亮和卫,贾南风独掌了朝政大权。
贾南风没生皇子,当时的太子不是自己生的,于是她把太子先废掉后又杀死。赵王司马伦乘机和梁王司马肜发动兵变,把贾南风捉了起来,废掉了她的皇后位置。
赵王司马伦很有心计,他先前总是拍贾南风的马屁,取得了贾南风的信任,人们都把他当成贾南风的死党看待,实际上他野心很大,当贾南风废杀太子时,他默不作声,等太子被杀死,他突然起兵,废除贾后,自封为相国。在301年,又废除惠帝司马衷,自己当了皇帝。
司马伦自立为帝一事,引起了分封在各地的王侯的极大不满。镇东大将军司马首先领兵举事,要讨伐司马伦,恢复晋惠帝的位置,他通知成都王司马颖,河间王司马一同起兵,司马伦也通知河间王司马就地讨伐司马,司马见司马和司马颖的势力强大,于是便倒戈讨伐司马伦。三个王侯的大兵打进京城,杀掉了司马伦和他的亲信孙秀,将惠帝司马衷接进都城,恢复了皇帝位。
司马因恢复司马衷的帝位,功勋显赫,在朝中掌管大权,而司马却没得到多少好处,便联合长沙王司马,发兵讨伐司马。司马认为,司马的力量比不上司马,肯定会被司马打败,然后自己再打败司马,最后再废掉惠帝,换一个皇帝,自己来当宰相。哪知他的如意算盘落了空,司马发兵成功,司马被杀,惠帝因为司马有功,任命司马为太尉,总管军政大事,实权在握。司马又一无所得,便再次联合成都王司马颖共同攻击司马,结果接连被打败,司马准备退军算了,却突然传来好消息,东海王司马越和禁军将领朱默合谋,夜中捉住了司马,用火把他烧死了。成都王司马颖被任为丞相,住在邺城,遥控朝政。司马被任为太宰,居住在长安。
304年,东海王司马越对司马颖独掌大权越来越不满,以皇帝的名义,发兵攻击司马颖,结果连连吃败仗,只得逃回自己的封地去了,司马颖便把惠帝劫持到邺城,由自己控制起来。
皇帝被劫持到邺城,司马的大将张方乘虚占据了洛阳。不久,安北将军王浚和司马越的弟弟司马腾联合起来大胜司马颖,司马颖大败,带着晋惠帝司马衷一道逃到洛阳。洛阳守将张方又逼惠帝和司马颖迁居长安,接受司马的管辖,司马削掉了司马颖的官职,自己以太宰的身份主管全国军事。
305年,东海王司马越再次发兵进攻司马,这时候,司马颖的部下将军汲桑等人攻下了邺城,将司马颖接回邺城。司马不敌许多诸侯的进攻,丢下晋惠帝独自逃跑,晋惠帝这才被司马越再一次接回洛阳,仍然当他的皇帝。惠帝任司马越为太傅,总管大权。司马越派人找到司马,请他回朝,让他当司空,司马信以为真,在回洛阳的途中不明不白地被人杀死。
掌权后的司马越,不满意司马衷,便将司马衷毒死,然后立司马炎的第二十五个儿子司马炽为皇帝,这就是晋怀帝,到这时候,“八王之乱”宣告结束。
所谓“八王之乱”,指的就是从303年到305年这一段时间内,诸侯王互相攻杀的事件,这八个王分别是:汝南王司马亮、楚王司马玮、齐王司马、赵王司马伦、长沙王司马、河间王司马、东海王司马越、成都王司马颖。实际上,参加“八王之乱”的诸侯王不止八个,《晋书》将这八个人合为一篇传记,统称八王,后代将这一事件通称为“八王之乱”。