본문 바로가기

Programming Language15

[Java] Jstack 을 활용한 스레드(Thread) 덤프, 리소스 모니터링 Spring boot 기반 프로젝트 내에서 Java Thread를 활용한 로직을 활용 도중 특정 스레드 에서의 병목현상이 발생하였고 해당 병목 현상을 해결하는 과정에서의 스레드 덤프를 활용하였고 많은 도움이 되었습니다. 스레드 덤프를 뜨기 위한 Jstack에 대한 기본 사용법과 활용법을 공유하고자 합니다. Jstack?? Jstack이란 JDK와 함께 제공되는 유틸리티로 Java Thread Dump를 생성하는 데 사용됩니다. Windows와 Linux에서 jstack.exe로 Thread Dump 생성하기 ${jdk설치경로}\bin target 경로에서 jstack.exe를 활용해서 전체 Thread Dump를 추출합니다. 사전 시나리오 EndPoint @RestController public clas.. 2023. 7. 9.
[Java] ImmutableList vs Collections.unmodifiableList 무엇이 다를까? Java로 개발을 하다 보면 Immutable 한 Collection을 다뤄야 하는 상황이 종종 발생한다. 그렇다면 Google Guava의 ImmutableList와 java.util.Collections의 unmodifiableList()를 각각 비교하며 각각 사용 시나리오와 장단점에 대해서 알아보자. 1. 각각의 자료구조를 사용하는 차이점 ImmutableList Guava 라이브러리의 일부로 제공되며, 불변 리스트를 생성하고자 할 때 사용합니다. ImmutableList 객체는 생성 시점부터 불변이며, 원본 리스트로부터 변경되지 않습니다. ImmutableList는 다양한 정적 팩토리 메서드를 제공하여 객체 생성을 용이하게 합니다. (of(), copyOf() 등) @Test public void.. 2023. 4. 30.
[Java] ExecutorService, ScheduledExecutorService, and Future Java에서 ExecutorService는 스레드를 사용하여 작업을 비동기적으로 실행하는 방법을 제공합니다. ExecutorService를 상속하는 ScheduledExecutorService는 지정된 시간, 고정된 속도 또는 고정된 지연으로 실행되도록 작업을 예약하는 메서드를 제공합니다. Future는 비동기 작업의 결과를 나타내며 작업의 상태를 확인하거나 필요한 경우 취소할 수 있습니다. 요 세 녀석을 자세하게 살펴보도록 하겠습니다. ExecutorService Java에서 스레드는 운영 체제의 리소스인 시스템 수준 스레드에 매핑됩니다. 스레드를 제어할 수 없을 정도로 많이 생성하면 이러한 리소스가 빠르게 부족해질 수 있습니다. Java에서는 Executor framework가 thread pool을.. 2023. 3. 7.
[Java] Thread 라이프 사이클과 스레드 우선순위로 보는 데몬스레드와 비데몬 스레드 Java Thread(스레드) 라이프사이클(life cycle)을 간단하게 확인하고, Thread(스레드) 우선순위로 데몬스레드(Demon Thread)와 비데몬 스레드(non demon thread or user thread)에 대해서 알아보는 시간을 갖도록 하겠습니다. Concurrent Programming Concurrent Programming은 여러 작업이 동시에 실행되는 환경에서 프로그램이 제대로 동작하도록 하는 프로그래밍 기법입니다. 이러한 환경에서는 다른 작업들과 자원들과의 경합이 발생할 수 있으며, 이를 해결하기 위해 스레드 동기화와 같은 기술이 사용됩니다. Thread Java에서 프로세스는 컴퓨터 시스템에서 실행되는 프로그램의 인스턴스입니다. 각 프로세스에는 고유한 메모리 공간, 시.. 2023. 3. 1.
[Java] Java14 레코드(Record)를 알아보자 Java 8 , 11 버전만 사용하다 보니 이후 버전에 추가된 것들에 대해서 학습을 하려고 합니다. Java 14에서 추가된 레코드(Record)에 대해서 레코드의 목적, 자동생성 항목 등 레코드의 기본 사항에 대해 살펴보고 제약사항은 또 어떤 부분이 있는지 알아보도록 하겠습니다. baeldung에 상당 부분 잘 정리가 되어있기 때문에 해당글을 대부분 참조하였으며 추가적인 정보를 더해 글을 작성했습니다. 객체 간에 변경 불가능한 데이터를 전달 시 Java 14 이전에는 boilerplate field와 메서드가 포함된 클래스를 생성해야 했기 때문에 사소한 실수가 발생하거나, 의도가 혼동되기 쉬웠습니다. Java 14가 출시되면서 이제 레코드를 사용하여 이러한 문제를 해결할 수 있습니다. 레코드는 Java.. 2023. 2. 19.
[Effective Java] 반환 타입으로는 Stream 보다 Collection이 낫다. (item 47) Stream에서는 반복을 지원하지 않기 때문에 API에서 Stream만 반환하도록 한다면 반복과 stream을 잘 시기적절하게 사용하기를 원하는 사용자는 불만을 토로할 수 있다. Stream을 사용할 수도 반복을 사용할 수도 있게 지원해야 한다. Stream과 iterator Stream 인터페이스는 Iterable 인터페이스가 정의한 추상 메서드를 전부 포함하고 정의한 방식대로 동작하나 for-each로 stream을 반복할 수 없는 이유는 Stream이 Iterable을 extend 하지 않아서 이다. 실제로 BaseStream을 열어보면 iterator메서드가 들어있다. 하지만 반복문에서 활용하면 컴파일 에러가 발생한다. 메서드 참조를 매개변수화된 Iterable로 적절히 형변환 해줘야 한다. St.. 2023. 1. 13.