晉武帝司馬炎在奪得政權以後,為了保住司馬氏的天下,曾經大封自己的子侄兄弟做王,叫他們像眾星拱月一樣來拱衛皇室。當時分封的王有二十七個之多,其中有名的、勢力較大的有楚王司馬瑋、汝南王司王亮、趙王司馬倫、齊王司馬同、成才王司馬穎、河間王司馬頁、長沙王司馬義、東海王司馬越八人。
因為晉惠帝司馬哀是個白癡,不會管理國家大事,所以他父親晉武帝司馬炎臨死的時候,把大事托付給太尉楊駿,叫他輔佐皇帝,掌管軍政大權。
楊駿是晉武帝的老婆楊皇後的父親,是晉惠帝的外公,所以就倚老賣老,專權起來。可是晉惠帝的皇後賈南風,也是一個喜歡抓權的潑女人,不甘心讓楊家的人掌權。公元291年,她命令司馬瑋帶兵入朝,殺了楊駿,滅了他的三族;還殺了楊太後。楊駿一死,賈皇後請汝南王司馬亮來輔政。司馬亮也是喜歡抓權的人,他不願意做賈皇後的傀儡,於是賈皇後讓晉惠帝派司馬瑋去殺司馬亮,等殺了司馬亮以後,賈皇後又叫惠帝否認下過命令,反而說司馬瑋假傳聖旨,把司馬瑋也殺了。這樣,八個王被除掉了兩個,賈皇後就奪得了全部大權。
可是賈皇後沒有生兒子,她怕大權將來還要旁落,就假裝懷孕,暗地裏把妹夫韓壽的兒子抱來,當作自己生的兒子。有了這個抱來的兒子,賈皇後就廢除原來晉惠帝已經立了的太子,並派人把他毒死,立自己抱來的兒子做了太子。這個消息傳出以後,宗室群情激憤,都說賈皇後想篡奪司馬氏的天下,就起來反對她。趙王司馬倫借口賈皇後廢殺太子,帶兵入朝,殺死了賈皇後。接著,他又廢掉惠帝,自己稱帝。
鎮守許昌的齊王司馬同,聽說趙王司馬倫廢了惠帝,奪得了皇位,心裏很不服氣,就向各處發出討伐司馬倫的檄文,號召大家起兵。成都王司馬穎、河間王司馬頁也有奪取政權的野心,他們和齊王司馬同聯合起來,共同攻打司馬倫。爭權奪利的鬥爭在四個王之間展開了。經過兩個多月的廝殺,犧牲了十萬人的生命,最後司馬倫兵敗被殺。齊王司馬同進入洛陽,他怕司馬穎和司馬頁來跟他爭權,就假裝讓惠帝恢複皇位,叫惠帝封他為大司馬,在幕後操縱政局。
河間王司馬頁看穿了司馬同的鬼把戲,就派兵兩萬,進攻洛陽,長沙王司馬義也是一個有政治野心的人,他假裝起兵響應司馬頁,看準一個有利的時機,選派一百多名騎兵,進洛陽,殺了司馬同,控製了朝政大權。這時候,八個王已經死了四個,而爭權奪利的鬥爭又在長沙王司馬義、成都王司馬穎,河間王司馬頁之間,繼續展開了。
司馬頁和司馬穎聯合,共同對付司馬義。他們一個從西麵,一個從北麵,進攻洛陽。司馬義牢牢控製住惠帝,派兵抵抗。雙方打得難解難分的時候,正在洛陽城裏的東海王司馬越,想乘機撈一把,就利用皇城的禁衛軍,在夜裏捉住司馬義,把他用火燒死。而司馬穎也就乘機進入洛陽,做丞相,控製了政權。
東海王司馬越認為自己殺死司馬義有功,卻沒有得到什麼好處,很不甘心,就假借惠帝的名義,起兵討伐司馬穎,結果被司馬穎打敗,隻好逃回東海郡。
這時候,跟司馬穎有仇的幽州刺史王浚,不甘心讓司馬穎控製政權,就聯合鮮卑族、烏桓族,起兵攻打司馬穎。司馬穎見王浚的力量大,就派人去匈奴,請匈奴左賢王劉淵來助戰。結果,王浚還是打敗了司馬穎。司馬穎挾持著惠帝,到了長安。長安是在河間王司馬頁的掌握之中,他當初雖然和司馬穎聯合過,可現在看到司馬穎兵敗勢窮,就乘機排擠司馬穎,把惠帝控製在自己手裏,獨攬朝政大權。
被司馬穎打敗逃走的東海王司馬越,見王浚的勢力大,就聯合王浚攻打關中。他打敗司馬頁以後,進入長安,把惠帝和司馬穎、司馬頁全都帶回到洛陽。不久,司馬越殺死了司馬穎、司馬頁,毒死了惠帝,擁立司馬熾做皇帝,即晉懷帝。晉懷帝把即位的這一年改號為永嘉元年。至此,八個王在自相殘殺的過程中,死了七個,一場混戰才告結束。
“八王之亂”的時間長達十六年,戰爭不斷,民不聊生,嚴重削弱了西晉的統治。這場大亂以後,沒有多少年,各地人民和從西部、北部內遷到黃河流域來的少數民族,都紛紛起兵反抗,西晉終於一步步走向滅亡。