목록자바 (6)
제리의 배움 기록
프로세스와 스레드 프로세스는 프로그램이 실행된 상태를 의미 합니다. 스레드는 프로세스보다 작은 최소 실행 단위입니다. 모든 프로세스는 최소 하나의 실행단위 스레드를 가집니다. 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..
조건에 따라 실행 흐름을 분기해야 하는 경우 우리는 조건문을 사용합니다. Java에는 if-else / switch 두가지 조건문이 있습니다. 이 중 어떤 방식이 더 효율적인지, 무엇을 쓰는게 좋을지 비교해보고자 합니다. 우선, switch를 사용할 수 없는 것들은 선택의 여지 없이 if-else를 사용하면 됩니다. switch 비교대상변수 참조 다음으로 if-else, switch 두가지 방식 모두 사용할 수 있는 경우가 있습니다. 동일한 로직을 두 방법으로 구현하여 변환된 바이트 코드를 비교해보며 차이를 알아보겠습니다. if 자바코드 public class ConditionTest1Main { void doIfStatement() { int number = 5; if (number == 1) { me..
JDK 5 이전 버전에서는 String + 연산시, 매 연산마다 String 객체가 생성되는 비효율이 있었습니다. String str1 = "a"; String str2 = str1+"b"+"c"; // => str1 객체 생성, str1+"b" 객체 생성, str1+"b"+"c" 객체 생성 그래서 아래와 같이 StringBuilder(혹은 StringBuffer)를 사용하여 중간단계 객체가 생성되지 않도록 권장되었었습니다. String str1="abc" String str2 = new StringBuilder(str1).append("b").append("c"); JDK 5 버전 부터 성능 향상을 목적으로 컴파일시 StringBuilder 혹은 StringBuffer로 변환되도록 변경되었습니다. 참고..