PHpullh
학습 라이브러리/Kotlin/GC 튜닝과 메모리 관리

KOTLIN · 성능

GC 튜닝과 메모리 관리

JVM 가비지 컬렉션의 동작을 이해하고 Kotlin 코드에서 GC 압력을 줄이는 전략을 다룹니다.

성능고급gcmemory-managementheapobject-allocation

핵심 설명

JVM 가비지 컬렉션의 동작을 이해하고 Kotlin 코드에서 GC 압력을 줄이는 전략을 다룹니다.

Kotlin code

fun main() {
    // GC 모니터링
    val rt = Runtime.getRuntime()
    fun memStats() = buildString {
        val used = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024
        val total = rt.totalMemory() / 1024 / 1024
        append("사용: ${used}MB / 전체: ${total}MB")
    }

    println("시작: ${memStats()}")

    // 1. 임시 객체 최소화
    // 나쁜 예: 매번 새 리스트 생성
    // val bad = (1..100000).map { it.toString() }.filter { it.length > 3 }

    // 좋은 예: 시퀀스로 중간 객체 제거
    val good = (1..100000).asSequence()
        .map { it.toString() }
        .filter { it.length > 3 }
        .toList()

    println("리스트 생성 후: ${memStats()}")

    // 2. 큰 객체 명시적 해제
    var largeBuffer: ByteArray? = ByteArray(50 * 1024 * 1024) // 50MB
    println("할당 후: ${memStats()}")
    largeBuffer = null
    System.gc()
    Thread.sleep(100)
    println("해제 후: ${memStats()}")

    // 3. 객체 재사용
    val reusableBuffer = StringBuilder(1024)
    repeat(1000) { i ->
        reusableBuffer.clear()
        reusableBuffer.append("항목-").append(i)
        // reusableBuffer.toString() 사용
    }

    println("완료: ${memStats()}")
    println("리스트 크기: ${good.size}")
}

학습 팁

JVM 옵션 -XX:+UseG1GC -Xmx512m으로 GC 알고리즘과 힙 크기를 조절합니다. -verbose:gc로 GC 로그를 확인하세요.

주의할 점

System.gc()를 직접 호출하는 것은 권장되지 않습니다. JVM이 GC 시점을 최적으로 결정하므로 수동 호출은 오히려 성능을 저하시킬 수 있습니다.

자주 묻는 질문

GC 튜닝과 메모리 관리란 무엇인가요?

JVM 가비지 컬렉션의 동작을 이해하고 Kotlin 코드에서 GC 압력을 줄이는 전략을 다룹니다.

GC 튜닝과 메모리 관리 학습 시 주의할 점은 무엇인가요?

System.gc() 를 직접 호출하는 것은 권장되지 않습니다. JVM이 GC 시점을 최적으로 결정하므로 수동 호출은 오히려 성능을 저하시킬 수 있습니다.