Mesut Ozil got the Gunners back on level terms early in the second half following Christian Benteke's first-half opener, only for Wilfried Zaha to put Palace back in front before James McArthur added a third.
A strike from Pierre-Emerick Aubameyang 13 minutes from time set up a tense finale, but the Eagles saw the job through to dent their London rivals' top-four aspirations.
Relive how the 90 minutes of action unfolded with Sports Mole's live text coverage below.
The Gunners can move up to third place in the table should they win on home soil for the 11th straight match in the top flight.
Palace are still not quite safe from the drop, meanwhile, possibly needing one more point to make certain of safety, but they have won three of their last four away matches and cannot be written off.
STARTING XI: Leno; Mustafi, Koscielny, Mavropanos; Jenkinson, Guendouzi, Elneny, Kolasinac; Ozil; Lacazette, Aubameyang
SUBS: Cech, Mkhitaryan, Torreira, Maitland-Niles, Iwobi, Monreal, Nketiah
STARTING XI: Guaita; Ward, Kelly, Dann, Wan-Bissaka; Meyer, McArthur, Milivojevic, Kouyate, Zaha; Benteke
SUBS: Hennessey, Van Aanholt, Townsend, Ayew, Batshuayi, Sako, Riedewald
ARSENAL SUBS: Cech, Mkhitaryan, Torreira, Maitland-Niles, Iwobi, Monreal, Nketiah
CRYSTAL PALACE SUBS: Hennessey, Van Aanholt, Townsend, Ayew, Batshuayi, Sako, Riedewald