You are not permitted to download, save or email this image. Visit image gallery to purchase the image.
Chasing 233 for victory on a slow track, England struggled against veteran Malinga's variations before they fell to their second defeat of the tournament, squandering an opportunity to join holders Australia at the top of the standings.
Malinga, who finished with figures of 4-43, became only the fourth bowler to capture 50 or more wickets in the competition after Australia's Glenn McGrath (71), his compatriot Muttiah Muralitharan (68) and Pakistan's Wasim Akram (55).
"We stuck to our basic plan -- line and length, no loose balls and added in some variations and bouncers... and ended up winning," man of the match Malinga said.
England were in control after a slow start as Joe Root made a patient half-century, but he was caught behind off Malinga for 57 to trigger a collapse, and despite Ben Stokes' unbeaten 82 ensuring a tense finish, the hosts fell short.
"In the chase we didn't do the basics of getting substantial partnerships going," England skipper Eoin Morgan said.
"We had a couple of good individual performances but Sri Lanka thoroughly deserved to win.
"We didn't do enough to win the game and even if we had nicked it then it would have been us robbing the game with an outstanding individual performance."
After having Jonny Bairstow trapped in front for a duck in the second ball of the England innings, Malinga sent back opener James Vince in the seventh over.
He then had the dangerous Root caught behind, although the batsman was at fault for chasing a ball down the leg side and a review confirmed a faint edge.
Malinga claimed his 51st World Cup wicket when Jos Buttler was adjudged leg before and missed a five-for when Stokes was dropped on 57 by Kusal Mendis in his final over.
Earlier, England's pace duo of Jofra Archer and Mark Wood claimed three wickets each to restrict Sri Lanka to a modest total of 232-9 from their 50 overs with Angelo Mathews top-scoring with an unbeaten 85 off 115 balls.
Archer's 3-52 made him the joint highest wicket-taker in the tournament alongside Australia's Mitchell Starc with 15.
Sri Lanka began poorly after winning the toss and electing to bat first, losing openers Dimuth Karunaratne and Kusal Perera inside three overs but Avishka Fernando steadied the ship before being dismissed one run short of his second ODI half-century.
Angelo Mathews stitched together a 71-run partnership with Kusal (46) to lay the platform for a competitive total.
Spinner Adil Rashid took two wickets in two deliveries in the 30th over to further turn the screws on Sri Lanka before Archer and Wood (3-40) wreaked havoc towards the end.
England next face Australia at Lord's on Tuesday while Sri Lanka meet South Africa on June 28.