반응형 개발/Java38 Java Virtual Thread 정리 이번 포스팅은 아래 영상을 정리한 글입니다.https://www.youtube.com/watch?v=BZMZIM-n4C0&t=2277s Virtual Thread 2018년 Project Loom으로 부터 시작된 경량 스레드 모델이다. jdk 21에서 정식 feature로 추가되었다. 기존 Java Thread 단점기존 자바 스레드는 생성 비용이 컸다. 우리가 스레드 풀을 사용하는 이유는 바로 기존 스레드 생성 비용이 크기 때문이다.기존 스레드는 공간적인 비용도 상당히 크다. 최대 2MB까지 사용하며 많은 메모리를 사용한다.JVM이 아닌 OS에 의해 스케줄링 된다. 스레드 생성 및 소멸과 같은 스케줄링 과정에서 항상 OS와 통신해야하므로 시스템 콜이 발생하는데, 시스템 콜 오버헤드가 발생한다. Virtu.. 개발/Java 2024. 9. 13. 자바에서 모니터가 동작하는 원리 (with synchronized) 모니터란 모니터란 뮤텍스나 세마포어보다 더 고수준의 동기화 기법이다. 전공 수업에서는 세마포어를 편리하게 사용하기 위해 인터페이스를 제공한 것이 모니터라고 배웠었다. 부족하지만 수업을 듣고 정리해 놓은 글이 있다. https://devdebin.tistory.com/16#%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4-1 임계 구역과 임계 구역 해결 방법 2021. 10. 2. 00:51 2022. 6. 22. 15:30 복습을 위한 수정 시작 프로세스는 독립적으로 작업을 할 수도 있고 공유된 자원을 가지고 공동 작업을 할 수도 있다고 이전 장에서 언급했다. 이번에는 본격적으로 devdebin.tistory.com 자바에서의 모니터 모든 자바 객체는 모니터를 가진다. 여러 스레드가 객체.. 개발/Java 2023. 12. 28. Java Thread (version 2) Java Thread 자바 스레드는 JVM에서 User Thread를 생성할 때 시스템 콜을 통해서 커널에서 생성된 커널 스레드와 1:1로 매핑이 되어 최종적으로 커널에서 관리된다. JVM에서 스레드를 생성할 때마다 커널에서 자바 스레드와 대응하는 커널 스레드를 생성한다. 자바에서는 플랫폼 스레드로 정의되어 있다. 즉 OS 플랫폼에 따라 JVM이 사용자 스레드를 매핑하게 된다. 스레드 생성은 Thread 클래스를 상속하는 방법과 Runnable 인터페이스(함수형 인터페이스)를 구현하는 방법이 있다. Thread 실행 및 종료 자바 스레드는 OS 스케줄러에 의해 실행 순서가 결정되며 스레드 실행 시점을 JVM에서 제어할 수 없다. 새로운 스레드는 현재 스레드와 독립적으로 실행되고 최대 한번 시작할 수 있고.. 개발/Java 2023. 12. 14. equals()와 hashCode() 자바에서 모든 클래스는 Object 클래스를 부모 클래스로 가진다. Object 클래스에는 equals()와 hashCode()가 있다. 오늘은 이 둘에 대해 정리해보려고 한다. 동등성과 동일성 동일성은 두 객체가 동일한 인스턴스임을 의미하며 == 연산자로 확인이 가능하다. 동등이란 두 객체가 동일한 상태나 값을 갖는다는 것을 의미하며, equals 메서드로 확인할 수 있다. 동일성은 동등하다고 말할 수 있지만, 동등하다고해서 동일성을 가진다고 말할 수는 없다. equals() public boolean equals(Object obj) { return (this == obj); } equals()는 객체가 동등한지(논리적 동치성, 동등성)를 검사한다. 기본적으로 Object 클래스의 equals 메서드.. 개발/Java 2023. 12. 13. Java MetaSpace 오늘은 Java 8 버전에서 등장한 MetaSpace에 대해 알아보자. Permanent Generation 자바 7버전까지는 Permanent Generation이라는 영역이 존재했다. 줄여서 PermGen라고 부른다. PermGen은 로드되는 클래스, 메서드 등에 관한 정보 등 메타 데이터(리플렉션)를 저장한다. 모든 static 메서드, static 변수를 저장한다. Java 7 버전까지는 String Pool도 PermGen의 일부 바이트 코드, 이름, JIT 정보도 가지고 있다. 이 영역은 제한된 메모리가 큰 단점이다. 제한 된 메모리로 인해 Out Of Memory(OOM) 문제가 발생할 수 있다. Permanent Generation은 Heap 영역인가? 위 사진만보면 PermGen은 Hea.. 개발/Java 2023. 12. 12. GC (Garbage Collection) 오늘은 GC에 대해 공부를 진행해보겠습니다. Stop The World stop-the-world는 GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다. stop-the-world가 발생하면 GC를 실행하는 스레드를 제외한 나머지 스레드는 모두 작업을 멈춘다. GC 작업을 완료하 이후에야 중단했던 작업을 다시 시작한다. 어떤 GC 알고리즘을 사용하더라도 stop-the-world는 발생한다. 대개의 GC 튜닝은 stop-the-world 시간을 줄이는 것이다. GC 자바에서는 개발자가 프로그램 코드로 메모리를 명시적으로 해제하지 않기 때문에 Garbage Collector가 더 이상 필요 없는 객체를 찾아 지우는 작업을 한다. 필요 없는 객체란 유효한 참조가 없어진 객체다. 즉 JNI 스택에.. 개발/Java 2023. 12. 11. 자바 메모리 누수 c언어는 free() 함수를 사용해 메모리를 해제한다. 자바는 GC가 더 이상 사용하지 않는 힙 영역의 인스턴스 메모리를 알아서 해제해준다. 그렇다면 GC가 메모리를 해제해주므로 자바에서 메모리 누수는 아예 발생하지 않을까?? 결론부터 말하면 자바에서도 메모리 누수는 발생할 수 있다. 객체가 실제로 사용되지 않으면서 의도치 않게 참조를 가지고 있다면, 이는 메모리 누수의 원인이 된다. 자바에서 메모리 누수는 프로그래머의 실수로 발생하는 것이다. 자바 메모리 누수와 관련해서 자주 발생하는 패턴을 살펴보기 전에 먼저 GC 대상에 대한 기초를 잡자. GC 대상 GC는 힙 내의 객체 중에서 가비지를 찾아내고, 찾아낸 가비지를 처리해서 힙의 메모리를 회수한다. 그럼 어떤 객체가 가비지일까?? Java GC는 객체.. 개발/Java 2023. 12. 9. 자바는 Call By Reference가 없다? 오늘은 스터디를 진행하면서 커뮤니티에서 본 자바의 Call By Reference에 대해 정리하려고 한다. 먼저 기본적인 Call by value와 Call by reference에 대해 짚고 넘어가자. Call by value 함수를 호출 할 때 단순히 값을 전달하는 형태의 함수 호출을 의미한다. Call by reference 메모리의 접근에 사용되는 주소 값을 전달하는 함수 호출을 의미한다. 자바는 Call By Reference가 없다? Java에서 primitive type 변수는 실제 값을 저장하는 반면 다른 모든 타입 변수는 참조하는 객체의 주소를 가리키는 참조 변수를 저장한다. 객체의 주소를 가리키는 참조 변수가 스택 메모리에 저장된다. 참조하는 객체는 힙 메모리에 저장된다. 총 2번의 과.. 개발/Java 2023. 8. 2. 자바 제네릭(Generics) 백기선님이 과거에 진행했던 Java 스터디 14주차 스터디 입니다. 제네릭 사용법 제네릭은 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크를 해주는 기능이다. 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어든다. 제네릭 클래스의 선언 class Box { //제네릭 타입 T를 선언 T item; void setItem(T item){ this.item = item; } T getItem() { return item; } } Box에서 T를 타입 변수라고 하며, Type의 첫 글자에서 따온 것이다. T라고 적지 않아도 된다. 타입 변수가 여러 개인 경우에는 Map와 같이 콤마를 구분자로 나열하면 된다. 기호의 종류만 다를 뿐 임의.. 개발/Java 2022. 12. 10. ThreadLocal ThreadLocal 쓰레드 로컬은 해당 쓰레드만 접근할 수 있는 특별한 저장소다. 쓰레드 로컬을 사용하면 각 쓰레드마다 별도의 내부 저장소를 제공한다. 따라서 같은 인스턴스의 쓰레드 로컬 필드에 접근해도 문제 없다. 여러 쓰레드가 같은 인스턴스의 멤버 변수에 접근하면 처음 쓰레드가 보관한 데이터가 사라질 수 있는데, 이런 경우 쓰레드 로컬을 사용하면 데이터를 안정적으로 접근하고 사용할 수 있다. thread-A 가 userA 라는 값을 저장하면 쓰레드 로컬은 thread-A 전용 보관소에 데이터를 안전하게 보관한다. thread-B 가 userB 라는 값을 저장하면 쓰레드 로컬은 thread-B 전용 보관소에 데이터를 안전하게 보관한다. 자바는 언어차원에서 쓰레드 로컬을 지원하기 위한 java.lang.. 개발/Java 2022. 6. 27. 자바 애노테이션 백기선님이 과거에 진행했던 Java 스터디 12주차 스터디 입니다. 애노테이션 정의하는 방법 애노테이션이란 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다. 보통 @ 기호를 앞에 붙여서 사용한다. JDK 1.5 버전 이상에서 사용 가능하다. 자바 애너테이션은 클래스 파일에 임베디드되어 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동한다. 새로운 애노테이션을 정의하는 방법은 아래와 같다. '@' 기호를 붙이는 것을 제외하면 인터페이스를 정의하는 것과 동일하다. 엄밀히 말해서 @Override는 애노테이션이고 Override는 애노테이션의 타입이다. @interface 애노테이션 이름{ 타입 요소이름(); //애노테이션의 요소를 선언한다. .. } 메타 에노테이션이란? 메타 에노테이.. 개발/Java 2022. 5. 27. Java I/O 백기선님이 과거에 진행했던 Java 스터디 13주차 스터디 입니다. Stream, Buffer Stream이란? 자바에서 입출력을 수행하려면, 즉 어느 한쪽에서 다른 쪽으로 데이터를 전달하려면, 두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요한데 이것을 스트림이라고 정의한다 스트림이란 데이터를 운반하는데 사용되는 연결통로다 스트림은 단방향통시만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다. 그래서 입력과 출력을 동시에 수행하려면 입력을 위한 입력스트림과 출력을 위한 출력스트림, 총 2개의 스트림이 필요하다. 스트림은 먼저 보낸 데이터를 먼저 받게 되어 있으며 중간에 건너뜀 없이 연속적으로 데이터를 주고받는다. 큐와 같은 FIFO구조로 되어 있다고 생각하면 된다. Bu.. 개발/Java 2022. 5. 27. 이전 1 2 3 4 다음 반응형