독서

[이펙티브 코틀린] 7장. 비용 줄이기

오렌지색 귤 2024. 8. 4. 21:58
반응형

아이템 45. 불필요한 객체 생성을 피하라

 

p. 311

SoftReference

 

 

Understanding JVM soft references for great good (and building a cache)

Posted on Apr 09, 2019 tags: jvm --> jvm, java --> java There are plenty of good and popular caching libraries on the JVM, including ehcache, guava and many others. However in some situations it’s worth exploring other options. Maybe you need better perf

www.michaelpollmeier.com

 

 

모든 소프트 레퍼런스는 OutOfMemoryError가 발생하기 전에 해제되는 것이 보장됩니다. 는 javadoc의 말은 사실이 아니다.

 

소프트 레퍼런스가 처음 도입된 Java 1.2에서는 사실이었으나, Java 1.3.1부터 JVM 속성 -XX:SoftRefLRUPolicyMSPerMB가 도입되었습니다.

 

기본값은 1000밀리초로 설정되어 있으며, 가용 힙이 10MB만 있는 경우 가비지 컬렉터는 10초 이상 사용된 레퍼런스를 해제합니다.

 

즉, 나머지는 해제되지 않아 OutOfMemoryError가 발생할 수 있으며, 자바독의 보장을 깨뜨립니다(이를 변경하려고 합니다).

 

문제는 없으며, -XX:SoftRefLRUPolicyMSPerMB=0으로 설정하면 자바독의 내용이 다시 참이 됩니다.

 

 

아이템 46. 함수 타입 파라미터를 갖는 함수에 inline 한정자를 붙여라

 

 

코틀린에서 사용되는 crossinline

 

crossinline 사용 이유

 

비지역 반환 방지

 

crossinline 키워드는 람다 내에서 비지역 반환(non-local return)을 방지합니다.

 

이 함수에서 predicate 람다는 repeat 블록 내부에서 호출되고 있습니다.

 

만약 predicate에서 비지역 반환을 사용하면, 이는 all 함수 전체에서 반환하려고 할 것입니다.

 

그러나 crossinline을 사용함으로써 predicate 람다는 이 함수(all)의 논리 흐름을 깨뜨리지 않고, 오직 그 자신의 블록에 대해서만 반환할 수 있습니다.

 

 

안전한 람다 전달

 

람다가 다른 실행 컨텍스트(예를 들어 다른 스레드나 콜백에서 실행될 가능성이 있는 경우)로 전달될 때, crossinline은 람다가 종료 시 둘러싼 함수를 함께 종료하지 않도록 합니다.

 

 

 

코틀린에서 사용되는 noinline

 

noinline 사용 이유

 

람다를 객체로 유지

 

이 코드에서 noinline 키워드는 configuration 람다 파라미터를 인라인하지 않도록 지정합니다.

 

이는 configuration 람다가 Task 객체에 대한 확장 함수로 사용되면서, tasks.registeringtasks.creating 같은 메서드로 전달될 때, 함수 객체로서 전달되어야 함을 의미합니다.

 

함수 객체 전달

 

noinline으로 지정된 람다는 일반 함수 객체로 취급되어, 필요에 따라 다른 함수에 전달하거나 저장할 수 있습니다.

 

이 경우, configuration 람다가 다른 메서드에 그대로 전달되어 나중에 호출될 수 있도록 합니다.

 

 

 

 

아이템 47. 인라인 클래스의 사용을 고려하라

 

생략

 

아이템 48. 더 이상 사용하지 않는 객체의 레퍼런스를 제거하라

 

생략

반응형