구현은 malloc
을 사용하여 객체에 대한 메모리 블록을 미리 할당합니까? 이 블록을 모두 사용하면 추가 메모리가 요청됩니까? 가비지 수집 실행 및 압축이 발생하면 free
에 대한 호출을 통해 메모리가 OS로 반환됩니까?자동 메모리 관리 기능이있는 프로그래밍 환경에서 런타임에 OS 메모리 할당 루틴이 얼마나 자주 호출됩니까?
답변
구현체는 malloc을 사용하여 객체에 대한 메모리 블록을 미리 할당합니까?
예. 가장 자주 그들은 연속적인 메모리 블록을 미리 할당하고 그들 자신의 할당 메커니즘을 구현합니다 (예를 들어, 할당 포인터을 기반으로합니다 - 다음 객체의 메모리 주소를 가리 키기 때문에 객체를 할당하면 단순히이 주소를 반환하고 주어진 바이트 수). 이것은 OS 호출에 의존하는 것보다 빠르며 그러한 메모리 영역을보다 잘 제어합니다. 예를 들어 Windows에서 CLR의 경우 이러한 블록을 세그먼트라고하며 VirtualAlloc/VirtualFree 호출을 통해 관리됩니다. 처음에는 대용량 메모리 영역이 이며 예약 된이고 더 많은 페이지가 필요한 경우 은 커밋 된입니다. Malloc (또는보다 일반적인 - Windows의 경우 HeapAPI)은 CLR에서 사용되지 않습니다.
이러한 블록을 모두 사용하면 추가 메모리가 요청됩니까?
예, 더 많은 블록을 만들 수 있지만 처음에는 예약 된 메모리를 커밋 (소비)하여 "내부"로 커질 수 있습니다.
가비지 수집이 실행되고 압축 될 때 메모리는 무료로 통화를 통해 OS로 반환됩니까?
특정 런타임 구현에 따라 다르지만 주 메모리 교정 메커니즘으로 보지 말아야합니다. 압축은 사전 할당 된 메모리 블록 내부에서 작동합니다. 예를 들어 압축 포인터가 압축이 발생한 후 왼쪽으로 다시 이동합니다. 하지만 일반적으로 GC는 더 이상 필요하지 않다고 결정하면 (내부에있는 모든 객체가 회수 된 것처럼) OS로 반환 될 수 있습니다. 그러나 가상 메모리 공간이 매우 제한적인 32 비트 아키텍처에서는 불필요한 메모리 조각화로 이어질 수 있으며 그러한 메모리 블록을 다시 사용하는 것이 더 나은 옵션이었습니다. 64 비트에서 이것은 큰 문제는 아니지만 그 블록을 재사용하는 것은 여전히 좋은 생각 일 수 있습니다.
- 1. OS 별 메모리 관리
- 2. 런타임에 메모리 할당
- 3. Event.RENDER가 얼마나 자주 호출됩니까?
- 4. OS 메모리 할당 주소
- 5. OS - 메모리 관리 - 페이징
- 6. 메모리 관리 할당
- 7. 동적 할당 - 메모리 관리
- 8. 메모리 할당 해제 루틴이 해제되는 블록을 터치합니까?
- 9. PHP 메모리 대 OS 할당 메모리
- 10. 자동/정적 메모리 어쩌면 할당
- 11. 아이폰 OS - 메모리 할당 - 배열
- 12. C (할당)의 메모리 관리
- 13. 변수의 메모리 할당
- 14. 메모리 관리 + 컨테이너
- 15. 메모리 할당 Java
- 16. 메모리 할당 및 해제 메모리
- 17. 메모리 관리
- 18. 또 다른 아이폰 OS 메모리 관리 설명
- 19. 자동 렌더링 ViewController 메모리 관리
- 20. Redis의 RedisModule_Alloc()에 대한 자동 메모리 관리
- 21. 메모리 관리 addSubview :
- 22. QT4 메모리 관리
- 23. iOS 및 메모리 관리
- 24. 메모리 관리
- 25. 로컬 변수에 대한 C++ 메모리 관리 메모리 할당
- 26. 이후의 메모리 관리
- 27. LE 루틴으로 메모리 할당
- 28. 코코아 메모리 관리 규칙
- 29. 소켓 기능이있는 메모리 데이터베이스에서
- 30. 클래스 디자인 문제 (메모리 할당 및 할당 해제 관리)
빈도는 그 자체로별로 중요하지 않습니다. 메모리를 할당하는 것만으로는 하나의 명령에 비용이 들지만, 그 메모리로 할 일은 무엇이든하는 것보다 저렴할 것이라고 상상해보십시오. 일반적으로 메모리 관리 오버 헤드 및 대기 시간과 관련된 애플리케이션 처리량은 이러한 프리미티브의 원시 호출 빈도보다 중요한 메트릭으로 간주됩니다. – the8472