JAVA

· JAVA/일반
개요 C, C++과 같은 언어는 운영체제. 즉, 실행환경에 따라 컴파일러가 그에 맞는 기계어 코드로 변환합니다. Java는 이와 같은 환경 종속성을 어느 정도 해결하기 위해 JVM, Java Virtual Machine이라는 구조를 채용했습니다. JVM은 Java를 실행하기 위한 환경을 제공해줄 뿐 아니라, GC, JIT 등과 같은 기능을 제공하고, 주기억장치를 할당받아 사용하는 역할을 맡고 있습니다. 오늘은 JVM이 주기억장치를 할당받으면 이를 어떻게 나누고 사용하는지 알아보도록 하겠습니다. JVM 메모리구조 JVM은 위와 같은 구조를 가지고 있습니다. 여기서, Java가 실행될 때 클래스, 메서드, 객체 등의 정보를 적재하는 부분은 Runtime Data Area입니다. 이러한 메모리구조는 각 Jav..
· JAVA/Thread
개요 지난 글에서 Virtual Thread가 어떻게 다른지, 어떠한 부분에서 연관되어 있는지 알아봤습니다. 이번 글에서는 Virtual Thread의 코드를 따라가보며 어떻게 동작하는지 살펴보겠습니다. Virtual Thread의 LifeCycle Virtual Thread의 라이프사이클을 요약하면 위의 그림과 같은 모습입니다. Virtual Thread는 많은 상태를 가진 상태 머신이고, 이 흐름을 따라가면서 설명하도록 하겠습니다. 그림에 있는 상태 이외에도 더 많은 상태가 있지만, 그림에 나온 주요한 상태만을 간략하게 알아보겠습니다. 1. NEW, STARTED, RUNNABLE Virtual Thread의 생성자 코드입니다. Thread.ofVirtual을 통해 가상 스레드를 생성하면, 위의 생성..
· JAVA/Thread
개요 Virtual Thread는 기존 Thread를 완벽하게 대체하는 개념이 아닙니다. 오히려 Thread, Process라기보다는 Task, Runnable에 가깝게 생각해야 이해하기 편합니다. 이번 글에서는 어떠한 부분에서 Virtual Thread와 Thread가 다른지, 어떠한 부분에서 같이 일하게 되는지 알아보겠습니다. Thread LifeCycle에서의 Virtual Thread Thread는 마구잡이로 사용하면 자원의 낭비를 불러올 수 있고, 때문에 ThreadPool에서 관리하여 사용합니다. (ThreadPool - https://nangmandeveloper.tistory.com/7) ThreadPool에서 동작하는 Thread는 다음과 같은 라이프사이클을 가질 것입니다. 1. Thre..
· JAVA/일반
개요 Java에서는 동시성 프로그래밍을 위해 Thread Class를 지원합니다. 이 Thread는 우리가 CS를 공부할 때 배웠던 Process, Thread의 Thread를 Java에서 구현한 것입니다. Thread를 사용하면 Process보다 많은 자원을 절약할 수 있습니다. 하지만, Thread를 그냥 사용한다면 많은 오버헤드가 발생합니다. Thread는 Kernel Thread, User Thread라는 두 종류가 있습니다. JVM은 User Thread를 Kernel Thread하나와 매칭하여 동작시킵니다. 따라서, Java로 Thread객체를 만들 때 Kernel단에 갔다 와야 할 것입니다. 그렇게 되면, System call, Interrupt, ISR등의 과정을 거쳐야 하기 때문에 비용이..
· JAVA/Thread
개요 Java19에서 Virtual Thread가 얼리억세스로 포함되었습니다. Java21에서는 Virtual Thread를 정식 기능으로 포함시켰습니다. Virtual Thread는 경량 스레드 모델입니다. 비슷한 모델로는 Go의 goroutine, Kotlin의 coroutine 등이 있습니다. Kotlin의 coroutine이 2017년 추가된 기능임을 감안하면, 6년이나 걸렸다는 것을 알 수 있습니다. 하지만 Virtual Thread가 Java21에 추가되며, 선택지가 하나 더 생겼습니다. 새로 서비스를 개발하는 입장에서는 Java + coroutine보다는 Only Java로 개발할 수 있을 것입니다. SpringBoot 3.2버전부터 Virtual Thread를 정식으로 지원하기 시작했습니다..
· JAVA/Thread
개요 JVM은 하나의 프로세스로 실행되고, 여러 개의 Thread를 실행할 수 있는 환경을 갖춥니다. 또 우리가 만든 자바 프로그램을 실행하고, main thread를 생성하고, 코드를 실행합니다. JAVA에서 Thread를 사용하는 대표적인 2가지 방법이 있습니다. Thread Class를 사용하는 방법과 Runnable Interface를 사용하는 방법이 바로 그것입니다. Thread 사용하기 public class Thread { public static void main(String[] args) { Thread thread1 = new ExampleThread(); Thread thread2 = new Thread(new ExampleRunnable()); thread1.start(); thre..
· JAVA/Thread
개요 학부 강의를 듣거나 프로젝트를 수행하며 Process, Thread라는 단어를 들을 기회는 정말 많을 것입니다. 개발자 필수 지식이기도 하고, 이들에 대한 이론적인 지식을 배워왔을 것이기도 합니다. 간단히 말해서, Process는 프로그램이 실행되는 단위, Thread는 작업 실행 단위입니다. 우리가 java로 프로그램을 만들어 실행한다면 그것은 Process로 동작할 것입니다. 해당 프로그램의 main메서드에서 구구단을 계산하는 함수를 실행한다면, 이것은 Thread로 동작할 것입니다. 개발을 하며 Process와 Thread 둘 중 하나를 이용해 다중 작업을 진행해야 한다면, Thread를 선택하는 것이 좋은 경우가 많습니다. Process가 필요로 하는 자원보다 Thread가 필요로 하는 자원..
· JAVA/일반
개요 Java개발을 처음 시작하는 분들이 항상 헷갈리는 부분이 있습니다. JVM, JIT, JNI, JRE, JDK... J로 시작하는 3글자 단어들이 왜 이렇게 많은지. 오늘은 J로 시작하는 3글자 단어들 중 JVM, JIT, JRE, JDK에 대해 간단하게 알아보겠습니다. JVM(Java Virtual Machine) JVM은 Java를 실행하기 위한 가상 환경입니다. JAVA이전의 세상을 잠깐 보겠습니다. 어셈블리, C와 같은 로우 레벨 언어들이 세상을 지배하던 시절에는 개발환경이 정말 큰 변수였습니다. 세상에 나오는 수많은 HW들이 사용하는 명령어 집합이 모두 다르고, OS마다 라이브러리가 다르고... HW를 하나 바꿀 때마다 코드 수정을 하고, OS를 바꿀 떄마다 수정을 하고, 다시 만들고.....
· JAVA/GC
개요 C언어와 달리, JAVA에서는 메모리를 직접 건드릴 이유가 없습니다. JAVA의 Garbage Collector가 메모리 관리를 하기 때문입니다. 다만, 메모리 주소를 사용하지 않는 것은 아닙니다. public class ReferencePrint { public static void main(String[] args) { String test = "HELLO"; System.out.println(test.hashCode()); } } 위의 코드를 실행해보면 String객체의 해싱된 주소값을 가져올 수 있습니다. 이 값은 실제 메모리 주소가 아닙니다. JAVA에서 객체의 주소는 GC가 직접 관리하고, 해당 값을 바로 출력하지 못하도록 유도하고 있습니다. 이렇게 GC는 객체가 메모리에 실리는 순간부터..
낭만주의 개발자
'JAVA' 카테고리의 글 목록