티스토리 뷰
Item06의 핵심은 쓰잘데기 없는 객체를 생성하지 말라는 것이다 대표적인 예로 정규표현식이 있다
String의 matches 메서드를 이용하면 str 문자열이 정규표현식에 맞는지 비교해 boolean 값을 반환한다
내부 구현이 궁금하다면 String.matches -> Pattern.matches -> Pattern.compile -> Pattern()을 따라가 보자
String.matches 에서 문제가 되는 부분은 new Pattern(regex, 0) 부분이다
쓸데없이 Pattern 객체가 생성된다
정규표현식을 사용해야 하는 데이터가 매우 많은데 매번 String의 matches를 호출하면 어떻게 될까?
프로그램이 터지는 건 아니고 좀 느려진다, 그럼에도 불구하고 다른 방법을 사용해야 한다
더 좋은 방법이 있기 때문이다 Pattern.compile() 메서드 인자로 정규표현식을 넣으면 컴파일된 형태로 반환된다
private static final Pattern ROMAN =
Pattern.compile("^(?=.)M*(C[MD] |D?C{0,3})" + "(X[CL] |L?X{0,3})(I[XV] |V?I{0,3}$)");
private static boolean isRomanNumeralAfter(String s) {
return ROMAN.matcher(s).matches();
}
Pattern 타입 반환된 변수. matcher(메서드 인자). matches()를 조지면 String matches에 비해 성능이 향상된다
얼마나 향상되는가? 최소 5배란다
궁금하다면 사진 아래 url을 따라가서 테스트 코드를 직접 돌려보자
나는 4번 돌려봤는데 아래와 같은 결과가 나왔다, 말이 최소 5배지 실상은 7~10배 차이다
pre compiled 가 Pattern.compile 후 조진 거고, in place 가 String.matches로 조진 결과다
Duration pre compiled: 4870.0
In place compiled: 42103.0
Duration pre compiled: 3267.0
In place compiled: 22467.0
Duration pre compiled: 5779.0
In place compiled: 39846.0
Duration pre compiled: 3755.0
In place compiled: 35737.0
또 다른 예로는 문자열 할당을 위해 변수에 new String("blahblah") 때리는 순간 새로운 String 인스턴스가 생성된다
생성된 String 인스턴스는 그 값이 무엇이든 간에, 즉 기존에 존재하던 값이라도 JVM Heap Memory 공간을 차지한다
반면 String Literal을 사용해 할당하는 경우 => String str = "blahblah";
interning이라는 프로세스를 거쳐 String Constant Pool에 집어넣는다
Constant Pool 이란 말 그대로 사용하는 상수들을 모아두는 곳으로 JVM의 PermGen 영역에 존재한다
https://www.baeldung.com/jvm-constant-pool
PermGen이란 Permanent Generation 영역을 의미하며 메인 메모리 힙에서 격리된 특수한 공간이다
JDK7까지는 메인 메모리에서 떨어진 특수 공간에 상수 풀, 바이트코드, JIT 정보 등을 담았다고 한다
JVM이 사용할 수 있는 메모리에서 ClassLoader와 같은 놈은 GC 대상에 포함되지 않아 메모리 누수를 일으킨다
https://www.baeldung.com/java-permgen-metaspace
JDK8부터 메모리 부족 문제를 해결하기 위해 상수 풀을 PermGen 영역에서 Metaspace 영역으로 옮겨버렸다
Metaspace는 네이티브 영역으로 쉽게 말해 JVM 공간을 차지하는 게 아니라 컴퓨터 자체의 메모리 영역이다
JVM 메모리처럼 제한된 리소스를 사용하는 게 아니라 전체 리소스를 사용할 수 있게 됐다
찐 레거시 프로젝트가 아니라면 JDK8 이상을 사용할 테니 메모리 걱정을 덜 수 있겠다
그동안 JVM 수준의 로우 레벨까지는 아직 몰라도 되겠거니 하고 넘어갔었는데
우연찮게 백기선 님의 더 자바, 코드를 조작하는 다양한 방법이라는 강의를 보게 됐다
그나마 가격도 나쁘지 않고 입문을 지난 자바/스프링 사용자에게는 필수적인 지식이라 생각된다
이 강의 덕에 *. java 가 어떻게 *. class 가 되고, JVM에 의해 실행되는지 알게 됐다
다른 강의는 솔직하게 돈값하는지 의문이 들지만 이 강의는 추천할만하다
로우 레벨로 갈수록 독학은 개노잼이기 때문에 관심 있다면 치킨 두 번 참고 강의 한번 사보자
쓰고 보니 인프런, 밸덩 홍보 글이 돼버렸다
밸덩이는 자바 스프링에 대한 여러 키워드로 검색해보면 거의 빠지지 않고 등장하기 때문에 피할 수 없다
모르는 키워드는 일단 검색하고 밸덩이를 참고해보자
'Java > Effective Java' 카테고리의 다른 글
[Item08] finalizer, cleaner를 알아보지 말자 (0) | 2022.02.14 |
---|---|
[Item07] 최고 JVM아 고맙다 (0) | 2022.02.12 |
[Item05] 때려박는 코딩은 그만, 확장성을 고려하자 (0) | 2022.02.08 |
[Item04] 인스턴스화 방지, setter 막아두기 과연 옳은가 (0) | 2022.02.05 |
[Item03] 싱글턴이 왜 필요할까? (0) | 2022.02.02 |