성능 시뮬레이션 - ① DB 커넥션 에서 테스팅 하였던 내용을 토대로 버츄얼 쓰레드 테스트를 진행해보았습니다. '성능 시뮬레이션 - ① DB 커넥션 - 2) 서버 스펙보다 과도한 요청 넣기'에서톰캣 스레드 개수를 변경시켜서 테스트를 해보았고,200개일때 속도가 제한이 TPS가 많이 제한되었던것을 확인 할 수 있었습니다.그러면 현재 Java 21에 도입된 버츄얼쓰레드(경량쓰레드) 를 사용해서 측정해보면 어떻게 될까궁금하게 되어 측정하게 되었습니다. 1) 가상 스레드 사용 및 테스트- CPU: 2 Core- Ram: 1G- Connection: 20 - 500로 설정하였고,Spring Property에 다음과 같이 설정을 추가했습니다.spring: threads: virtual: enabl..
Garbage Collection (가비지 컬렉션) 이란?Java에서 Heap메모리영역에서 자동으로 더 이상 참조(사용)되지 않는 인스턴스(메모리 영역)들을 관리 및 청소해주고 메모리 파편화를 줄여주는 JVM 프로세스의 일부분입니다.(PS. C와 같은 일부 언어에서는 이 작업을 수동으로 관리해주어야합니다.) 어떠한 원리로 작동하는가?작동 원리는 간단합니다.1. 인스턴스 생성시 메모리를 할당합니다. (힙)2. 사용되는 메모리 영역과 사용되지 않는 메모리 영역을 식별합니다.3. 사용되지 않는 메모리를 회수하여 운영체제에 다시 전달합니다. 왜 기존 GC는 Young영역 과 Old 영역을 나누었을까? (Z GC 제외) 위는 객체 수명에 대한 분포도에 대한 그림입니다.시간이 오래될 수록 살아있는 객체들이 짧은..
Java의 String Pool 이란 ?문자열 리터럴이 저장되는 Java Heap의 영역이다.(Java 7 이전까지는 Perm영역이었으나, OOM 문제로 인해 Heap으로 이동하였습니다.String Intern Pool 혹은 String Constant Pool이라고도 불립니다.. 문자열 리터럴?Java에서 문자열을 생성하는 방식의 차이입니다.String literal = "리터럴"; --> 리터럴 생성 방식String object = new String("object"); --> 생성자 생성 방식 왜 String Pool 이 필요할까?문자열을 만들때마다 문자열 객체를 힙메모리에 매번 생성되는것을 방지하기 위해서입니다..--> 이를 위해 문자열 객체 생성시 문자열 리터럴을 사용하는 것을 추천합니다.. ..
JAVA 어플리케이션을 사용하다보면 발생할 수 있는 메모리 누수 혹은 Out Of Memory Error 문제, Permanent Full 문제를 분석해야할 때 Heap Dump 분석을 통해 해결점을 찾을 수 있다. Heap : 자바프로그램에서 참조형 데이터 타입을 갖는 객체(인스턴스), 배열, 메타정보 및 Object들에 대한 참조 정보 등이 저장되는 메모리 공간이다. Dump : 기억 장치의 내용을 출력장치로 출력한다는 의미로 쓰인다. 위에 대한 문제는 같은코드를 실행하더라도 모든 환경에서 항상 발생하는 것은 아니고 개발환경에서는 잘 작동되지만 운영환경에서 데이터 & 환경 차이로 인해 발생 할 수 있다. 만약 임의로 해당 Out Of Memory Error에러를 표출하고 싶으면 List list = ..
GC튜닝이 필요한 경우 JVM옵션 중 Xms 옵션과 Xmx 옵션으로 메모리 크기를 지정하지 않았다. -Server 옵션이 포함되어있지 않다. 시스템에 Timeout 로그와 같은 로그가 남는다. 심플한 튜닝 1.String 객체 대신 StringBuilder 혹은 StringBuffer를 사용한다. 2.Log를 적게 쌓는다. 방법 첫번째 : Old영역으로 넘어가는 객체의 수 최소화 하기 New영역을 크기를 조정해서 혹은 Old영역과의 New 영역과의 비율을 조정해서 Old영역으로 넘어가는 객체 수를 줄여 Full GC가 일어나는 횟수를 줄여준다. 방법 두번째 : Full GC 시간을 줄이자 Full GC실행 시간은 Minor GC에 비해 길기 때문에 Old 영역의 크기를 잘 조정해서 Full GC 용량을 ..
GC모니터링 JVM이 어떻게 GC를 수행하는지를 알아내는 과정을 말하는데, Young영역에서 Old영역으로 얼마나 이동했는지, Stop-The-World가 언제 일어나고 얼마동안 일어났는지 정보를 알 수 있다. 또한, 때에 따라서 GC튜닝이 필요한지 안한지 확인하기 위해서다. 모니터링방법 1.jstat HotSpot JVM에 있는 모니터링 도구이다. 그외 HotSpot JVM 모니터링 도구로는 jps나 jstatd가 있다. jstat은 GC수행정보 뿐 아니라 클래스로더 수행정보나 Just In Time 컴파일러 수행정보도 알 수 있다. jstat은 $JAVA_HOME/bin 디렉토리에 있다. 환경변수로 설정한 $JAVA_HOME 을 불러오는 방법 (운영체제, 프롬프트에 따라 명령어가 다르다 -_-) wi..
Garbage Collection 이란 자바에서는 새로 생성 되는 객체에 대한 메모리들이 Heap영역에 저장된다. 초기 C언어 같은 경우는 이런 참조 변수들에 대한 메모리 관리가 중요했다. 더이상 쓰지 않는 변수들에 대한 메모리 할당을 없애주어야 하는 것이다. 이를 해주지 않는다면, 프로그램에 규정된 메모리가 full되어 누수가 되거나 멈추게 되는 것이다. 그러나 자바에서는 GC라는 장치가 있어, 우리가 더이상 참조하지 않는 객체에 대해서 제거를 해주게 된다. 위 사진과 같이 unreachable (힙 영역 내에서 자신들끼리 참조하는 객체들)이 GC 대상이 된다. 이 때, GC에서 공통적으로 수행되는 단계를 1. Stop-The-World 2. Mark And Sweep 이라고 한다. Stop-The-W..
더보기 Class Loader Class파일들을 읽어서 Runtime Data Area에있는 각 영역에 맞는 정보들을 적재하는 역할을 한다. Execution Engine Method Area의 바이트 코드를 제공받아, class에 정의된 내용대로 바이트 코드를 실행 한다. 실행방식에는 Interpreter, JIT(Just In Time)가 있다. Interpreter - 바이트 코드를 한줄 씩 해석하여 실행하는 방식이라 속도가 느리다. JIT (Just In Time) - 바이트 코드를 컴퓨터 프로세서(CPU) 직접 보낼 수 있는 명령어로 바꾸는 프로그램이다. (컴파일) ※JIT 는 이미 한번 읽어서 기계어로 변경한 소스코드는 또, 컴파일하지 않으며 저장소에 기계어로 저장한다. 따라서 인터프리터를 보..