Faits : A. A.a. A.A._ et son épouse B.A._ sont depuis juillet 1990 locataires d'un appartement de six pièces au septième étage d'un immeuble en ville de Genève. En 1999, les locataires ont exigé la rénovation complète de l'appartement, sans succès. En 2001, ils ont demandé divers travaux. La bailleresse B._ a accepté de procéder à la réfection complète des peintures et de poncer le parquet dans deux pièces, moyennant la conclusion d'un nouveau contrat qui a pris effet en juillet 2002. Le loyer a été fixé à 1'515 fr. par mois, charges comprises, soit 18'180 fr. par an. En juin 2002, les locataires ont changé à leurs frais l'agencement de la cuisine. A.b. Par courrier du 16 février 2011, la bailleresse a informé les locataires qu'elle allait rénover entièrement la salle de bain et les WC; les travaux devaient durer environ un mois, pendant lequel il serait impossible d'utiliser ces pièces. Elle précisait que le loyer ne serait pas augmenté, mais qu'aucune indemnité ne serait allouée pour la gêne occasionnée. Les locataires ont contresigné la missive pour accord. Le 22 mars 2011, les locataires ont annoncé divers dégâts intervenus pendant les travaux et évoqué d'autres défauts. La bailleresse a accepté de faire quelques retouches de peinture, mais a refusé d'entrer en matière pour le reste. En avril 2011, les locataires ont fait poser de nouveaux papiers peints dans différentes pièces. A.c. Le 26 février 2012, les locataires ont derechef demandé des travaux, dont un nouvel agencement de la cuisine. Ils se disaient disposés à accepter une augmentation de loyer si la cuisine était entièrement refaite. Ils menaçaient de consigner le loyer s'ils n'obtenaient pas une réponse favorable dans les trente jours. La régie immobilière représentant la bailleresse a répondu le 28 mars 2012 que l'appartement était en bon état et ne nécessitait pas de travaux de rafraîchissement; elle se référait au constat effectué dans l'appartement par ses collaborateurs en date du 22 mars 2012. Elle avait néanmoins mandaté deux entreprises pour remettre en état le parquet d'une pièce et procéder au réglage d'une porte. La bailleresse a fait surveiller l'appartement des locataires par une société d'investigation entre le 29 mars et le 30 avril 2012. L'enquêtrice privée a constaté que les locataires ne vivaient plus dans cet appartement; il était occupé par leur fils et son épouse, dont les noms figuraient sur la boîte aux lettres. Les locataires vivaient depuis plusieurs mois en France, dans un appartement qu'ils auraient acquis en 2010. B. B.a. Par avis officiels du 10 mai 2012 notifiés séparément à chaque locataire, la bailleresse a résilié leur bail pour le 30 juin 2013. A la requête des locataires, elle a motivé le congé par la volonté d'attribuer l'appartement au locataire de son choix, dès lors que les deux intéressés ne l'occupaient plus à titre personnel. Les locataires ont saisi l'autorité de conciliation le 8 juin 2012, puis ont porté l'action devant le Tribunal des baux et loyers du canton de Genève. Ils ont conclu à ce que le congé soit déclaré nul, subsidiairement à ce qu'il soit annulé. La bailleresse a allégué dans sa réponse qu'elle entendait attribuer l'appartement à une famille de quatre personnes au moins, choisie autant que possible dans le cercle de ses assurés. Par jugement du 18 décembre 2013, le Tribunal des baux a déclaré le congé valable, à la forme et sur le fond; il a refusé toute prolongation. Contrairement à ce que soutenaient les locataires, le congé n'était pas une mesure de représailles consécutive à la demande de travaux qu'ils avaient formulée en février 2012; le congé était motivé par le fait que les locataires n'habitaient plus l'appartement. La volonté qu'avait la bailleresse d'attribuer le logement à une famille de quatre personnes ne reflétait pas une disproportion manifeste des intérêts en présence. Les locataires avaient sous-loué les locaux de façon abusive, échouant à prouver qu'ils avaient l'intention de réintégrer les locaux. B.b. Les locataires ont formé appel en concluant à la nullité du congé, subsidiairement à son annulation. Par arrêt du 10 novembre 2014, la Cour de justice genevoise a confirmé la décision attaquée. Elle a relevé que la bailleresse, à la suite de la demande de travaux présentée en février 2012, avait été amenée à constater que les locataires n'occupaient plus l'appartement loué; elle avait alors décidé de résilier le bail qui ne présentait selon elle plus d'utilité pour les locataires. Il s'agissait-là d'un motif de congé valable. Rien ne permettait de retenir que la bailleresse avait d'autres intentions que d'attribuer le logement à une famille de quatre personnes. La résiliation ne consacrait aucune disproportion grossière des intérêts en présence, les locataires congédiés étant propriétaires d'un logement approprié. C. Les locataires, qui procèdent sans avocat, ont déposé devant l'autorité de céans un recours en matière civile dans lequel ils concluent à l'annulation du congé, subsidiairement à une prolongation de bail pour une durée de quatre ans, plus subsidiairement au renvoi de la cause à l'autorité précédente pour qu'elle complète l'instruction et déclare le congé inefficace. Ils ont en outre demandé l'effet suspensif. La bailleresse a conclu au rejet du recours, tandis que l'autorité précédente s'est référée à son arrêt. L'une et l'autre s'en sont remises à justice quant à l'effet suspensif.