애플리케이션이 할당된 메모리 일부를 해제하도록 강제할 수 있나요?

애플리케이션이 할당된 메모리 일부를 해제하도록 강제할 수 있나요?

약 1년 전에 Firefox를 다시 시작한 이후로 동일한 문제에 계속해서 직면해 왔습니다. 브라우저가 계속해서 메모리를 소모하고 있기 때문입니다. 문제의 근본 원인은 사용자가 탭을 닫으면 브라우저가 탭에 할당된 메모리를 해제한다는 것(아마도 잘못된 가정)입니다. 물론 Firefox는 다른 많은 브라우저와 마찬가지로 백그라운드에서 일부 캐시를 실행합니다. 최근에 닫은 탭을 다시 여는 것도 이와 관련이 있는 것 같습니다. 따라서 메모리는 사용자가 원하는 만큼 빨리 해제되지 않습니다.

Mozilla를 포함한 많은 포럼에서 Firefox가 현재 필요하지 않은 할당된 메모리가 다른 프로세스에 필요한 경우 운영 체제(내 경우에는 Debian Jessie)가 브라우저에서 일부 메모리를 가져와 다른 프로세스에 제공한다는 내용을 읽었습니다. . 예, 이런 일이 실제로 일어나야 하는데 그렇지 않습니다. Firefox는 지속적으로 상주 메모리를 소비하며 메모리가 거의 소진되면(예: 3.8GB 중 약 3.6GB) 교체가 시작됩니다. 이 모든 것은 극도로 고통스러운 브라우징 경험을 초래할 수 있습니다. 탭을 닫아도 아무런 이점이 없습니다. Firefox를 닫아도 할당된 메모리는 꽤 오랫동안 남아있습니다.

프로세스가 사용했지만(해당 메모리가 필요한 다른 프로세스가 없더라도) 현재 종료된 모든 메모리(스왑 포함)를 OS가 강제로 재할당하도록 할 수 있는지 궁금합니다.

편집하다:

여기서 필요한 것은 Firefox가 닫히기 전과 후의 호출 결과입니다 free(가독성을 위해 매개변수가 사용됩니다).-h

앞으로:

               total       used       free         shared       buffers        cached

Mem:           3.7G        3.6G       134M         6.8M         5.0M           166M

+/- buffers/cache:         3.4G       306M

Swap           3.7G        2.8G       916M

뒤쪽에:

               total       used       free         shared       buffers        cached

Mem:           3.7G        2.9G       856M         4.8M         12.0M          179M

+/- buffers/cache:         2.7G       1.0G

Swap           3.7G        2.7G       998M

보시다시피 약간의 저하가 눈에 띄지만 브라우저를 닫은 후 20~30분 동안의 전체 메모리 사용량(상주 및 교체)에 비하면 아무 것도 아닙니다. Firefox 외에는 일반적인 데비안 프로세스와 많은 메모리를 필요로 하지 않는 몇 가지 패널 애플릿(날씨, CPU+HDD+메모리 모니터링, 네트워크 모니터링 등)을 제외하고는 다른 프로그램을 시작하지 않습니다. 나는 그 가치를 거의 눈치 채지 못합니다 htop. 기본적으로 제가 하는 일은 브라우저를 하루 종일 열어두고 탭을 닫거나 여는 것입니다. 내 세션에 많은 탭이 있다는 것을 인정해야 하지만 처음(및 이후)에는 그 중 몇 개만 로드합니다. 내 생각엔 로드된 콘텐츠가 없는 경우에도 탭이 많은 메모리를 차지할 수 있는 것 같습니다. 그러나 브라우저를 닫은 후 메모리 할당량이 이렇게 높은 이유는 설명되지 않습니다. 실제로 너무 높아서 시스템을 제대로 종료하지 못하고 콜드 셧다운을 해야 할 때도 있었습니다.

답변1

즉, 대답은 '아니오'입니다. 일단 응용 프로그램이 메모리를 할당하고 사용하면 해당 메모리는 응용 프로그램에 "속하며" 응용 프로그램이 메모리를 해제하지 않는 한 다른 어떤 것도 이를 회수할 수 없습니다. (이것은 free()시스템이 아닌 개별 응용 프로그램의 풀에 메모리를 반환하기 때문에 while을 호출하는 것만큼 간단하지 않습니다.)

스와핑은 이 문제를 해결하는 데 도움이 됩니다. 실제 메모리가 가득 차면 운영 체제는 거의 사용되지 않는 메모리 페이지를 스와핑하기 위해 이동할 수 있습니다. 실제 작업 세트가 실제 메모리보다 크면 시스템 충돌이 발생할 수 있습니다. 메모리는 항상 스왑 영역 주위로 이동하고 뒤로 이동하며 시스템은 유용한 작업을 수행할 수 없습니다.

Linux에서는 최후의 수단으로 OOM 킬러가 개입하여 프로세스를 종료하여 메모리를 회수합니다.

이상하게도 Firefox가 중지되면 메모리가 복원되는 것을 볼 수 없습니다. 어쩌면 창이 사라진 후 Firefox 프로세스가 실제로 종료되는 데 시간이 걸릴 수도 있습니다( ps작업 관리자를 확인하세요). 프로세스가 중지되면 할당된 모든 메모리가 해제되어 다른 프로세스에서 사용할 수 있습니다.

관련 정보