본관은 원주(原州). 자는 자장(子長), 호는 휴곡(休谷). 김두남(金斗南)의 증손으로, 할아버지는 병마절도사 김준용(金俊龍)이고, 아버지는 판관 김인문(金仁文)이며, 어머니는 부사 이성부(李聖符)의 딸이다.
1662년(현종 3) 정시 문과에 병과로 급제, 승문원부정자로 관직 생활을 시작하였다. 현종 연간에는 사헌부지평·사간원정언을 역임하면서 언관(言官)으로 활약하였다. 1675년(숙종 1)에 홍문록에 오르고, 사헌부장령에 임명되었다.
경신환국(庚申換局) 이전 남인 정권 하에서는 허목(許穆)을 지지하는 청남(淸南) 계열에 서서 당시의 권신인 허적(許積)의 비리를 공격하였다. 1680년 『현종실록(顯宗實錄)』의 개수 논의가 있자, 송대(宋代)의 왕안석(王安石)의 예를 들어 『신종실록(神宗實錄)』을 고친 것은 합당한 이유가 있었지만 현재의 개수 주장은 잘못이라고 반대하였다.
또한 지난날 척화를 주장하다가 청나라에 투옥된 바 있는 조경(趙絅)을 인조와 효종의 묘정에서 출향시키려는 논의에 반대하다가 파직되었으며, 복제 논쟁은 허목의 설을 따랐다.
이어 병조참판·형조참판으로서의 뛰어난 재주와 원만한 성품이 숙종에게 인정되어, 서인 정권이 들어서고 남인이 제거될 때에도 관직을 유지할 수 있었다. 이 시기에 한성판윤·경기감사·예조판서 등을 거쳤고, 1684년에는 사은부사(謝恩副使)로 연경에 갔다가 이듬해 돌아왔다.
기사환국으로 정권이 바뀌자 곧 우의정에 임명되어 정국을 주도했고, 실질적인 행정 업무를 전담하였다. 이 때 서인 세력의 회유에 노력했으나, 김수항(金壽恒) 등을 구할 수 있는 위치이면서도 살육을 방관했다 하여 뒷날 노론 세력으로부터 공격을 받았다. 인현왕후(仁顯王后)가 폐위되자 우의정을 사임하였다.
그 뒤 김춘택(金春澤)·한중혁(韓重赫)의 역모 사건이 숙종에 의해서 반전되면서 갑술환국으로 진전되자, 이를 반대하다가 제주도에 유배되었다. 4년 후 해남으로 이배(移配)되었다가 풀려났다. 황해도 해주에서 죽었으며, 1711년에 신원되었다.