목록자바 (32)
제리의 배움 기록
요약 하이버네이트에서는 컬렉션 타입을 org.hibernate.collection.internal.PersistentBag 인스턴스로 래핑하여 사용합니다. 이 때문에 Collection 타입에서 orphanRemoval 옵션 사용시 주의 해야합니다. [참고 - orphanRemoval 옵션 사용시 Collection 참조를 변경하지 말자] JPA 관련 공부를 하던 중, 컬렉션 타입은 org.hibernate.collection.internal.PersistentBag 인스턴스로 래핑된다는 놀라운 사실을 알게 되었습니다. 테스트 해보기 위해 간단히 1:N 관계를 가지는 Team과 Member를 정의하고 다음과 같이 연관관계를 맺어 주었습니다. @Entity public class Team { @Id @..
요약 이번 포스팅에선 성능 테스트 시 JVM의 warm up 수행에 대해서 다룹니다. wram-up을 해야하는 이유를 설명하기 위해 Java 컴파일에 대해 설명합니다. 접근하기 쉬운 두가지 warm up 방법에 대해 알아봅니다. 우선 Java의 컴파일에 대해서 얘기해보겠습니다. Java 컴파일 1. 컴파일 과정 JVM 실행 전 1)소스 코드(.java)를 바이트 코드(.class)로 변환 (Java compiler) JVM 실행 후 2)해당 클래스를 사용하는 시점에 클래스 로더가 lazy loading 3)로딩 된 클래스를 OS가 이해할 수 있는 기계어로 변환 (인터프리터) 여기서 알 수 있는 사실은 Java는 C 언어 처럼 미리 기계어로 변환해두지 않고, 자바 컴파일러로는 바이트 코드로 변환 후 실제 ..
요약 클래스 로더에는 3가지 종류가 있고 각자 맡은 대상 클래스 영역이 다릅니다. Java 9를 전후로 각 클래스 로더에 차이가 있습니다. 클래스 로더의 동작 방식은 동일합니다. 클래스 로더 - Java 9 이전 (~ Java 8) 클래스 로더에는 3가지 종류가 있습니다. 1.Bootstrap Class Loader rt.jar로 부터 JVM을 실행하기 위한 핵심 클래스들을 메모리로 로딩합니다. rt.jar는 일반적으로 다음 경로에 위치합니다. /jre/lib/rt.jar JVM의 빌트인 되어있는 클래스 로더이며 null 로 표현됩니다. parent를 가지지 않습니다. 네이티브 코드로 구현되어 있습니다. 2.Extension ClassLoader 시스템 속성 값인 java.ext.dirs 경로의 JAR ..
요약 Array > ArrayList > LinkedList 순으로 빠릅니다. 성능 측정에 jmh를 사용하면 측정하고자 간편하게 측정 테스트 코드를 작성할 수 있습니다. n 개의 원소가 있다고 가정하였을때 Array, ArrayList, LinkedList 연산 비용은 다음과 같이 생각해 볼 수 있습니다. 그런데, i 번째 원소 탐색이 아니고 랜덤한 임의의 값을 찾는 탐색이면 어떨까요? 제 예상으로는 Array > ArrayList > LinkedList 일 것 같습니다. Array는 연속적인 메모리 할당으로 cache locality가 좋습니다. CPU 캐시는 한 메모리 주소에 접근할 때 그 주소뿐 아니라 해당 블록을 전부 캐시에 가져오게 되는데요, 이때 Array는 해당 블록에 있는 것들은 함께 캐싱..
프로세스와 스레드 프로세스는 프로그램이 실행된 상태를 의미 합니다. 스레드는 프로세스보다 작은 최소 실행 단위입니다. 모든 프로세스는 최소 하나의 실행단위 스레드를 가집니다. JVM에서의 스레드와 메모리 구성 컴파일된 자바 애플리케이션을(프로그램)을 실행하면 새로운 JVM 프로세스가 시작되고 main thread가 생성됩니다. 이 main thread를 통해 코드가 실행되고, 다른 thread들이 생성될 수 있습니다. JVM은 프로세스를 실행하면서 OS로부터 Runtime Data Area 메모리를 할당받습니다. Method Area 클래스 정보, 정적 변수 등 JVM 프로세스가 시작될 때 데이터가 할당 Heap 동적으로 데이터가 할당되는 영역 레퍼런스 타입 객체 생성시에 실제 객체가 올라가는 메모리 영..
[JAVA] 프로세스와 스레드 - JVM 메모리 관점에서 분석 프로세스와 스레드 프로세스는 프로그램이 실행된 상태를 의미 합니다. 스레드는 프로세스보다 작은 최소 실행 단위입니다. 모든 프로세스는 최소 하나의 실행단위 스레드를 가집니다. JVM에서 jerry92k.tistory.com LifeCycle 관점에서 멀티프로세싱과 멀티스레딩 비교 멀티 프로세싱 특징 하나의 프로세스에서 다른 프로세스로 전환됩니다. 프로세스가 점유하고 있던 CPU regiter, RAM, cache 등이 반환되고 다른 프로세스의 데이터로 전환되어 오버헤드가 큽니다. Process LifeCycle 흐름 New (Create) 2차 메모리(디스크와 같은 장기기억 저장소)에 있는 프로그램이 OS에 의해 선택되어 프로세스가 되는 단계..
지난 포스팅에서는 if와 switch의 실제 동작 차이를 비교해보며 switch가 LOOKUPSWITCH 로 변경되는것을 확인해보았습니다. if, switch 누가 더 빠를까? 하지만 실제로는 자바 컴파일러가 상황에 따라 TABLESWITCH, LOOKUPSWITCH 둘 중 효율적이라 생각하는 방식으로 switch의 컴파일을 사용합니다. TABLESWITCH tableswitch는 switch의 조건 값의 범위를 인덱싱하여 jump table을 구성하고, 해당하는 인덱스의 실행지점으로 바로 점프합니다. [예제 자바코드] int chooseNear(int i) { switch (i) { case 0: return 0; case 1: return 1; case 2: return 2; default: retu..
JDK에서는 개발 및 운영을 위해 기본 툴을 제공합니다. Java 홈디렉토리의 bin에 툴이 포함되어있습니다. 1.java home path 찾기 root@ureasolution:~# echo $JAVA_HOME /usr/lib/jvm/java-1.11.0-openjdk-amd64 2.Java 홈디렉토리의 bin 경로로 이동 root@ureasolution:~# cd /usr/lib/jvm/java-1.11.0-openjdk-amd64 root@ureasolution:/usr/lib/jvm/java-1.11.0-openjdk-amd64# cd bin 3.bin 안의 도구들 확인 (JDK 11 기준) root@ureasolution:/usr/lib/jvm/java-1.11.0-openjdk-amd64/bi..