티스토리 뷰

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배란다

https://stackoverflow.com/questions/2469244/whats-the-difference-between-string-matches-and-matcher-matches

 

 

궁금하다면 사진 아래 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에 의해 실행되는지 알게 됐다

다른 강의는 솔직하게 돈값하는지 의문이 들지만 이 강의는 추천할만하다

로우 레벨로 갈수록 독학은 개노잼이기 때문에 관심 있다면 치킨 두 번 참고 강의 한번 사보자

 

쓰고 보니 인프런, 밸덩 홍보 글이 돼버렸다

밸덩이는 자바 스프링에 대한 여러 키워드로 검색해보면 거의 빠지지 않고 등장하기 때문에 피할 수 없다

모르는 키워드는 일단 검색하고 밸덩이를 참고해보자

댓글
링크
글 보관함
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Total
Today
Yesterday