Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 1. memgraph 메모리 프로파일링 - 샘플 준비 본문

iOS 응용 (swift)

[iOS - swift] 1. memgraph 메모리 프로파일링 - 샘플 준비

jake-kim 2023. 12. 24. 01:19

* 가장 기초) iOS 메모리 기초 개념 - virtual memory, dirty memory, clean memory, compressed memory, swapped memory 이해하기 포스팅 글

 

1. memgraph 메모리 프로파일링 - 샘플 준비

2. memgraph 메모리 프로파일링 - vmmap을 사용하여  문제가 있는 코드의 메모리 주소 찾아내기

3. memgraph 메모리 프로파일링 - 메모리 주소로 코드 역추적하기

프로파일링 대상 샘플 앱

  • 이미지 10000개를 리사이징하여 UIImageView에 넣는 코드
    • 리사이징에서는 비효율적인 ImageContext 방법 사용 (이미지 리사이징 최적화 관련 개념은 이전 포스팅 글 참고)
class ViewController: UIViewController {
    private let scrollView = UIScrollView()
    private let stackView = UIStackView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        ...
        
        addImages()
    }
    
    func addImages() {
        let image = UIImage(named: "high_resolution_img")
        
        (0...10000)
            .forEach { _ in
                let imageView = UIImageView(image: resizeImage(image: image!, targetSize: .init(width: 300, height: 300)))
                stackView.addArrangedSubview(imageView)
            }
    }
    
    func resizeImage(image: UIImage, targetSize: CGSize) -> UIImage {
        let size = image.size

        let widthRatio  = targetSize.width  / size.width
        let heightRatio = targetSize.height / size.height

        var newSize: CGSize
        if widthRatio > heightRatio {
            newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio)
        } else {
            newSize = CGSize(width: size.width * widthRatio,  height: size.height * widthRatio)
        }

        UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0)
        image.draw(in: CGRect(origin: .zero, size: newSize))

        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return newImage ?? image
    }

}
  • Xcode에서 단순히 메모리 상황을 보면 2.5GB나 사용하는 형태
    • 만약 작은 용량이 작은 기기에서 해당 앱을 실행했다면 이미지에 메모리를 많이 사용하여 Other Processes의 용량이 0이 되어 OS 메모리에도 영향을 미쳐서 아이폰이 잠시 종료되는 현상도 발생

  • 목적: 이 .memgraph 파일을 사용하여 역으로 메모리를 많이 잡아먹는 부분의 코드를 찾는것이 목적

.memgraph 준비

  • Xcode 실행 > 하단에 memory graph 아이콘 클릭

  • Xcode > File > Export memory graph 선택하여 .memgraph 파일 준비

 

* 이 파일을 가지고 다음 포스팅 글에서 메모리를 본격적으로 분석 계속...

 

* 전체 코드: https://github.com/JK0369/ExMemoryProfiling

Comments