java
-
Virtual Thread in JAVA개발/기술 2026. 1. 14. 11:46
작업마다 Java Thread 를 생성하면 OS 단위에서 Thread 를 생성하기 때문에 비싸고 시간도 오래 걸린다. 그래서 Java 진영에선 기존에 생성하던 Java Thread 를 Platform Thread 라고 정의하고 Virtual Thread 라는 것을 새로 만들어서 Platform Thread 위에서 실행되는 구조를 잡았다. Virtual Thread 는 Heap 메모리에 있는 객체다. Virtual 스레드는 생성 작업이 JVM 위에서 이뤄지기 때문에 Platform Thread 에 비해서 생성 비용도 싸다. Stack 이나 IP 같은 저장공간도 JVM 내에서 컨텍스트 스위칭 되는 형태이기 때문에 불필요한 시스템 콜이 없어지게 된다 Java Thread 에 비해서 커널레벨까지 내려가서 실행..
-
java volatile개발 2026. 1. 8. 15:21
아래와 같은 클래스가 있다고 해보자. public static class SharedClass { private int x = 0; private int y = 0; public void increment() { x++; y++; } public void checkForDataRace() { if (y > x) { System.out.println("y > x - Data Race is detected"); } }} x에 대한 증가가 y에 대한 증가보다 먼저 작성되었기 때문에 이론상으로 x>=y 인 상황만 발행해야하고 checkForDataRace 에서 if 문에 걸릴 일은 없다. 그런데 멀티 쓰레..
-
Java - Thread start, run개발 2023. 2. 28. 19:00
start(), run()의 차이 둘다 쓰레드를 실행하기 위한 함수다. 그러나 run() 을 사용하면 run을 호출한 쓰레드에서 작업이 처리되고 start()를 사용하면 쓰레드를 새로 만들어서 처리된다. 병렬 처리를 하고 싶다면 start()를 사용해야 한다. fun main() { ThreadTest().runThread() } class ThreadTest { var counter = 0; private fun increaseCounter() { counter++ } fun runThread() { val threads = ArrayList() (1..100).map { number -> val thread = Thread { sleep((Math.random() * 1000).toLong()) pr..
-
Java - synchronized, wait, notify개발 2023. 2. 28. 12:17
멀티 쓰레드 환경에선 두개 이상의 쓰레드가 동시에 같은 데이터를 접근하는 경우가 발생한다. public class ThreadTest { public void run() { for (int i = 0; i { System.out.println("thread " + finalI + " starts"); method("thread " + finalI + " running"); }); thread.start(); } } private void method(String msg) { System.out.println(msg); try { TimeUnit.SECONDS.sleep(1); } catch (In..
-
자바 - Garbage Collector개발 2023. 2. 24. 16:00
JVM은 Garbage Collector (GC) 를 이용해서 Heap 메모리를 주기적으로 청소한다. GC는 사용하지 않는 객체를 확인하고 삭제해 메모리 공간을 확보하는 역할을 한다 객체가 GC의 대상이 되는 경우는 크게 두가지다. 객체를 참조하는 레퍼런스가 null로 세팅되는 경우 객체를 참조하는 레퍼런스의 범위가 종료되는 경우 (예로 함수 블럭 내에서 실행을 모두 완료하는 경우나 등등) 간단한 예제를 살펴보자. stack 메모리상에 있는 지역변수가 없어지면 그에 상응하는 객체는 더이상 쓸모가 없으므로 GC의 대상이 된다고 본다. 물론 다른 곳에서 참조하고 있다면 GC의 대상이 아니다. class House() {} class Person {} fun main() { val house = House()..
-
JAVA - 직렬화, 역직렬화개발 2023. 2. 24. 15:13
직렬화, 역직렬화 자바의 직렬화는 객체를 바이트의 연속으로 변환시키는 기술이다. 역직렬화는 반대로 바이트의 연속을 오브젝트로 전환해주는 기술이다. 직렬화된 객체가 파일에 기록되면 역직렬화를 통해 파일에서 읽어온 데이터를 메모리에서 객체로 쓸 수 있다. 이렇게 인터뷰용 답변만 준비하지말고 직접 코딩해서 체험해보는게 좋다. Person이라는 클래스를 직렬화해서 file.ser이라는 파일에 바이트코드를 써보자. data class Person(val name: String, val age: Int) : Serializable try { val person = Person(name = "ryan", age = 30) val fileOut = FileOutputStream("file.ser") val objOut..
-
golang 장단점 분석 (vs JAVA)개발 2022. 3. 10. 14:49
장점 빠르다 Java는 JVM 위에서 돌아가기 때문에 실행하기 위해선 byte코드를 machine코드로 변환하는 과정이 필요하다. 반면 golang은 빌드과정에서 이미 machine코드로 변환했기 때문에 바로 동작할 수 있다. 빌드에 걸리는 시간도 GO 언어 내부적으로 최적화를 많이 해둬서 빠른편이다. 초기 C++에서 실용성을 추가한 버전이기 때문에 속도는 거의 C++과 비슷하다고 봐도 무방할 것 같다. 비동기 작업이 쉽다 GO 언어에는 goroutine이라는 비동기 작업 처리용 경량 쓰레드가 있다. 코틀린에 coroutine과 비슷한 원리인데 둘다 사용해본 입장에선 goroutine이 좀더 간결하고 쓰기 간편했다. Nodejs 가 갖고 있는 비동기처리의 장점을 go 언어 상에도 잘 녹여낸 것 같다. 배..
-
JIT(Just In Time) Compilation개발/기술 2021. 11. 26. 20:10
기존 정적 컴파일 방식에서는 실행 전 소스 코드를 모두 기계어로 번역해야 했다면 JIT 컴파일러는 코드를 런타임에 기계어로 번역한다. 인터프리터도 런타임에 소스코드를 기계어로 변환해서 비슷하다고 볼 수 있으나 JIT 가 컴파일 하는 대상은 소스 코드가 아니라 최적화를 한번 거친 바이트 코드다. 바이트코드는 기계어는 아니지만 JVM 같은 가상 머신에서 쉽게 기계어로 변환할 수 있는 코드이며 이 과정이 실시간으로 일어나기 때문에 JIT(Jut In Time) 이라고 부른다. Java 개발자가 빌드해서 만든 바이너리는 기계어로 된 파일이 아니라 JVM에서 돌릴 수 있는 바이트 코드 덩어리다. 이 바이트 코드 덩어리가 JVM에 올라가면 내부 JIT 컴파일러에서 바이트 코드를 기계어로 변역해서 실행하게 된다. J..