본관은 청풍(淸風). 자는 원회(元會), 호는 감지당(坎止堂). 김계(金繼)의 증손으로, 할아버지는 김인백(金仁伯)이고, 아버지는 공조정랑 김극형(金克亨)이며, 어머니는 정호(鄭頀)의 딸이다. 어릴 때 이식(李植)에게 글을 배웠고, 그 뒤 송준길(宋浚吉)의 문인이 되었다.
1650년(효종 1) 생원시에 합격하고, 1652년 증광 문과에 병과로 급제하여 학유(學諭)·주서(注書)·병조좌랑·정언(正言) 등을 역임하면서 과감하게 언론을 행사하여, 높은 관리들에게 미움을 받아 어천찰방(魚川察訪)으로 전임되었다.
1656년 홍관(虹貫)의 변으로 만언(萬言)의 봉사책(封事策)을 상소하였고, 또 관서지방의 적폐(積弊: 쌓인 폐단)를 고쳐야 한다고 주장하기도 하였다. 1660년(현종 1) 강진현감으로 재직할 때에는 향리를 단속하고 백성들을 편안케 하는 데 힘썼으며, 1661년 병조에서 황해도사, 1666년 정언·장령(掌令)·헌납(獻納) 등 언관을 다시 역임하였다.
이듬해 정월 헌납에 있으면서 장령 신명규(申命圭) 등 여섯 명과 함께 영의정 정태화(鄭太和)와 좌의정 홍명하(洪命夏)의 죄를 논핵하였다가 왕의 노여움을 사서 벽동(碧潼)에 유배되었다. 1668년 직강(直講)이 되고, 시강원문학, 사간·동부승지를 거쳐 1670년 전라도관찰사가 되었다.
이때 어머니의 회갑잔치를 검소하게 하였는데도 수령들로부터 많은 뇌물을 받았다는 헌납 김석주(金錫胄)와 대사간 김우형(金宇亨)의 탄핵을 받고 의금부에 투옥, 배천(白川)에 유배되었다. 1672년 풀려나 강음(江陰)·광주(廣州) 등지에서 여생을 보냈다.