- @참고: https://steady-coding.tistory.com/591

 

Heap 모니터링 도구


GUI 도구

- VisualVM: OracleJDK에서 제공하는 GUI 모니터링 툴

전반적인 CPU 사용량, Runtime Area 사용량을 볼 수 있다.

 

- JConsole: JDK에서 제공

데이터를 csv 형태로 저장할 수 있음

관측은 4초에 한번씩 실행됨

 

명령어 도구

- jstat: JDK에서 제공

// 현재 JVM 에서 실행되고 있는 application의 PID 목록 가져오기
$ jps
26532 HeapDumpApplication
... 중략

// GC 통계 정보 출력하기
$ jstat -gc 26532
S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
0.0    0.0    0.0    0.0   28672.0  10240.0   40960.0     9744.5   36784.0 34801.9 4864.0 4223.8     52    3.302  16     43.246   46.549

// GC 사용량 출력하기
$ jstat -gcutil 26532
S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
0.00   0.00  35.71  23.79  94.61  86.84     52    3.302    16   43.246   46.549

// 5개씩 출력할 때마다 헤더를 출력하고, 1초마다 출력하되, 10개의 결과를 보여주기
$ jstat -gcutil -h5 26532 1000 10
S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
0.00   0.00  35.71  23.79  94.61  86.84     52    3.302    16   43.246   46.549
0.00   0.00  35.71  23.79  94.61  86.84     52    3.302    16   43.246   46.549
0.00   0.00  35.71  23.79  94.61  86.84     52    3.302    16   43.246   46.549
0.00   0.00  35.71  23.79  94.61  86.84     52    3.302    16   43.246   46.549
0.00   0.00  35.71  23.79  94.61  86.84     52    3.302    16   43.246   46.549
S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
0.00   0.00  35.71  23.79  94.61  86.84     52    3.302    16   43.246   46.549
0.00   0.00  35.71  23.79  94.61  86.84     52    3.302    16   43.246   46.549
0.00   0.00  35.71  23.79  94.61  86.84     52    3.302    16   43.246   46.549
0.00   0.00  35.71  23.79  94.61  86.84     52    3.302    16   43.246   46.549
0.00   0.00  35.71  23.79  94.61  86.84     52    3.302    16   43.246   46.549

 

- gc 옵션 시 데이터 의미

 

- gcutil 옵션 시 데이터 의미

 

Heap Dump 뜨기


Visual VM에서 뜰 수 있으나 OOM인 경우, 갑작스럽게 메모리 사용량이 크게 증가하는 순간에 사용할 수 없다.

1. jmap

jmap -dump:format=b,file=heapdump.hprof 26532

2. VM Options 추가 

OOM 발생 시 자동 Heap Dump 생성을 위해서

VM Options 로 아래 옵션을 추가한다.

-XX:+HeapDumpOnOutOfMemoryError
//생략시 어플리케이션 실행한 루트 디렉토리에 dump 파일이 생성됨
-XX:HeapDumpPath=c:/dump/heapdump.hprof

 

Heap Dump 분석하기


1. MAT(Eclipse Memory Analyzer) 툴을 이용하여 분석

MAT 툴이 할당할 수 있는 메모리 크기가 분석하려는 heap dump 파일 크기보다 켜야하므로 MemoryAnalyzer.ini 파일에서 아래와 같이 Xmx 크기를 세팅할 수 있다.

-vmargs
-Xmx15G
-XX:-UseGCOverheadLimit

Dominator Tree 로 Heap Dump 뜰 당시에 만들어진 Java 객체를 한 눈에 확인 할 수 있다.

'Java' 카테고리의 다른 글

[Java] 연산자 우선순위  (0) 2022.12.18
[Java] LocalDateTime, Timestamp 변환  (0) 2021.02.26
[Java] Set to List, List to Set  (0) 2021.02.25
[Java] Optional 사용법  (0) 2021.02.19
[Java] 파일 입출력  (0) 2021.01.27
블로그 이미지

uchacha

개발자 일지

,

- @참고: https://www.holaxprogramming.com/2013/07/20/java-jvm-gc/

 

Garbage Collection 이란

Garbage Collector 가 Heap 영역의 메모리에서 reference 되지 않는 인스턴스에 대해 할당된 메모리를 해제하는 행위이다.

 

Heap 영역의 구분

이때 효율성을 위해 "젊은 객체" 와 "오래된 객체" 를 나누는데

Heap에서는 이를

Young Generations: Eden | Servivor 0 | Servivor 1 의 영역으로 구성되고

Old Generation

과 같이 구분한다.

 

Young Generations 에서는 Minor GC, Old Generation에서는 Major GC 가 발생하는데,

Major GC는 Minor GC에 비해 10배 정도 더 걸리므로, 수명이 짧은 객체는 Young Generation에서 빨리 제거해주어 Old Generation 에 최대한 객체가 쌓이지 않도록 하는것이 효율성을 위한 방향이다.

 

Sun JVM의 경우의 Garbage Collection 과정을 살펴보면

Minor GC의 경우에

1. 최초의 객체는 Young Generations의 Eden 에서 생성되고

2. Eden 이 꽉 찰경우 Minor GC가 발생하여

참조가 없는 객체를 제거 후 살아남은 객체를 비어있는 공간(To Space), 여기서는 Servivor0 라 하면 Servivor0 로 이동한다.

Servivor1(From Space) 에 존재하는 객체에 대하여 살아남은 객체도 Servivor0(To Space)으로 이동하고, 그중 나이가 많은 객체는 Old Generation으로 이동한다.

즉, Eden이 비워지며, 나이가 있는 객체는 Servivor0 또는 Old Generation 으로 이동되어 Servivor1도 비워진다.

 

 

Major GC의 경우에

Old Generation 이 가득 차게 되는 경우 Stop The World 를 한다.

GC를 실행하기 위한 Thread를 제외하고 이외의 모든 Thread는 멈춘 후 GC 완료 후 다시 Thread를 실행시킨다.

이는 성능에 악영향을 주므로 

 

JVM의 Memory 구성이 중요한데 

Young Generation 은 전체 Heap의 1/2보다 약간 적게, Survivor Space는 Young Generation의 1/8 정도의 크기가 적당하다.

JVM Default 의 경우는 Young Generation 이 적게 잡혀있으므로 젊은 객체가 Old Generation으로 넘어갈 확률이 커진다. 따라서 조정을 위한 별도의 Option은 아래와 같다.

$ java -Xms=256m -Xmx=1536m -XX:NewSize=32m -XX:MaxNewSize=512m -XX:NewRatio=2 -XX:SurvivorRatio=8 MyApp
  • -Xms, -Xmx: Heap 사이즈 최소, 최댓값
  • -XX:NewSize: Young Generation 영역의 초기 사이즈
  • -XX:MaxNewSize: Young Generation 영역의 최대 사이즈
  • -XX:NewRation: 위와 같을 경우 Old Generation은 Young Generation 의 2배 크기를 갖는다.
  • -XX:ServivorRation: 위와 같을 경우 Young Generation은 Survivor Space 의 8배 크기를 갖는다.

 

적합한 GC 옵션은 

각 WAS 에서 생성하는 객체의 크기, 생존 주기, 스레드 개수 등에 따라 달라 질 수 있으므로 지속적인 모니터링을 통해 해당 서비스에 가장 적합한 값을 찾을 수 있다.

 

아래는 Heap 모니터링을 하기 위한 참조 링크이다.

https://steady-coding.tistory.com/591

블로그 이미지

uchacha

개발자 일지

,

- @참고(file encoding 확인하기): https://vhxpffltm.tistory.com/243

 bash 명령어가 가능환 환경에서

$ file *

 

- 문자열 인코딩 개념 정리(ASCII, ANSI, EUC-KR, CP949, UTF-8, UNICODE)

UNICODE 한글목록 http://unicode.org/charts/PDF/UAC00.pdf

- @참고: https://onlywis.tistory.com/2

 

블로그 이미지

uchacha

개발자 일지

,

- @참고: https://javaplant.tistory.com/21

 

- 싱글톤 패턴이란

Singleton 패턴은 인스턴스를 불필요하게 생성하지 않고 오직 JVM내에서 한 개의 인스턴스만 생성하여 재사용을 위해 사용되는 디자인패턴이다.

 

6. LazyHolder Singleton 패턴 - 5에서 사용안하는 인스턴스를 만들어 놓는 문제를 개선

더보기
public class Singleton {
    private Singleton(){}
    
    public static Singleton getInstance() {
    	return LazyHolder.INSTANCE;
    }
    
    private static class LazyHolder {
    	private static final Singleton INSTANCE = new Singleton();
    }
}

 

5. static 초기화를 이용한 Singleton 패턴 - 간결한 소스와 성능 개선

더보기
public class Singleton {
	private static Singleton instance;
    
    static {
    	instance = new Singleton();
    }
    
    private Singleton(){}
    
    public static Singleton getInstance() {
    	return instance;
    }
}

 

4. volatile 을 이용한 개선된 DCL Singleton 패턴 (jdk 1.5 이상에서 사용) - 3에서 인스턴스를 null 로 줄 수 있는 문제점 개선

더보기
public class Singleton {
	private volatile static Singleton instance;
    
    private Singleton(){}
    
    public static Singleton getInstance() {
    	if (instance == null) {
        	synchronized (Singleton.class) {
            	if (instance == null) {
                	instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

 

(사용해선 안됨)3. DCL(Double-Checked-Locking) Singleton 패턴 - 2에서 생기는 lock 의 효율성을 개선

더보기
public class Singleton {
	private static Singleton instance;
    
    private Singleton(){}
    
    public static Singleton getInstance() {
    	if (instance == null) {
        	synchronized (Singleton.class) {
            	if (instance == null) {
                	instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

 

2. synchronized 를 이용한 Singleton 패턴 - multi-thread 환경에서 1에서 두개의 인스턴스가 생길 가능성을 개선

더보기
public class Singleton {
	private static Singleton instance;
    
    private Singleton(){}
    
    public static synchronized Singleton getInstance() {
    	if (instance == null) {
        	instance = new Singleton();
        }
        return instance;
    }
}

 

1. 고전적 방식의 Singleton 패턴

더보기
public class Singleton {
	private static Singleton instance;
    
    private Singleton(){}
    
    public static Singleton getInstance() {
    	if (instance == null) {
        	instance = new Singleton();
        }
        return instance;
    }
}

'Design Pattern' 카테고리의 다른 글

디자인 패턴의 분류  (0) 2020.01.03
블로그 이미지

uchacha

개발자 일지

,

@참고: https://nankisu.tistory.com/93

 

executable.jar 의 구조

src/main/resources 에 있는 service-config.properties 를 

executable jar 로 만들면 

jar 내부에 /resources/serivce-config.properties 로 묶인다.

 

executable.jar 내부의 파일 읽는법

1. local에서 코드를 실행시킬 때는 temp.txt 파일이 소스폴더에 독립적인 하나의 파일로 존재하기 때문에 정상적으로 실행된다.

// resources 폴더에 있는 temp.txt 파일을 읽어온다.

File file = new File(new ClassPathResource("temp.txt").getURI());

2. 개발계에는 jar파일이 실행되기 때문에 temp.txt가 독립된 파일이 아니라 jar파일의 데이터 일부분으로서 하나의 온전한 파일로 가져올 수 있다.

// File로 가져오는 것이 아니라 InputStream으로 내용을 읽어오도록 수정. InputStream is = new ClassPathResource("temp.txt").getInputStream();

 

1번에 의해 발생할 수 있는 에러

java.lang.IllegalArgumentException: URI is not hierarchical

이런 exception 이 나는 이유는 

path 가 rsrc:/ 와 같이 생성되기 때문이다.

따라서 path 로 읽으려 하면 안되고 2번의 이유에 의해서 inputstream 으로 읽어오는 것이다.

 

executable.jar 내부 파일 위치에 해당하는 path

이때, executable.jar 의 위치부터 경로를 정해주기 위해 path 는 "/" 로 시작해야 한다. 따라서 path = /resources/serivce-config.properties 여야 jar 내부에 /resources/serivce-config.properties 를 잘 가져온다.

내 경우에는 아래의 코드를 사용하였다.

InputStream is = clazz.getResourceAsStream(path);  

 

블로그 이미지

uchacha

개발자 일지

,

- @참고: https://www.ibm.com/docs/ko/db2/11.5?topic=system-macos

1. 제한 사항을 확인하기 위해

- computer info 확인 (os version, core, memory)

>system_profiler SPSoftwareDataType SPHardwareDataType

- 하드디스크 용량 확인

>df -h

2. 프로시저 진행

1) 데이터베이스의 데이터를 저장할 새 디렉토리 작성

>mkdir Docker/database

- cd Docker/database

2) ICR 에서 Db2 Docker 이미지 가져오기

>docker pull icr.io/db2_community/db2

3) Db2 Community Edition 이미지에 대한 환경 변수 파일 .env_list 작성

>vi .env_list

```

LICENSE=accept
DB2INSTANCE=db2inst1
DB2INST1_PASSWORD=password
DBNAME=testdb
BLU=false
ENABLE_ORACLE_COMPATIBILITY=false
UPDATEAVAIL=NO
TO_CREATE_SAMPLEDB=false
REPODB=false
IS_OSXFS=true
PERSISTENT_HOME=true
HADR_ENABLED=false
ETCD_ENDPOINT=
ETCD_USERNAME=
ETCD_PASSWORD=

```

4) Docker 컨테이너 실행

>docker run -h db2server --name db2server --restart=always --detach --privileged=true 
-p 50000:50000 --env-file .env_list -v /Users/<username>/Docker/database:/database icr.io/db2_community/db2

 

5) Docker 컨테이너에 접속

>docker exec -it db2server /bin/bash

 

6) Db2 인스턴스에 접속

su - db2inst1

 

3. 설치 완료 테스트

- @참고: https://suyangrok.tistory.com/8

1) 설치된 DB2 제품 기능 나열

>db2ls

2) db2 버전체크

db2inst1 으로 로그인 한 후

>db2licm -l

 

4. DB2 인스턴스 생성 및 DB 생성하기

- @참고: https://suyangrok.tistory.com/9

  - 샘플 데이터베이스 생성

[db2inst1@db2server ~]$ db2sampl

 

  - 데이터베이스에 접속

[db2inst1@db2server ~]$ db2 connect to sample

 

  - 데이터베이스 생성

[db2inst1@db2server ~]$ db2 create database TESTDB

 

  - 데이터베이스 삭제

[db2inst1@db2server ~]$ db2 drop database sample

* 이때, 

SQL1035N  The operation failed because the specified database cannot be
connected to in the mode requested.  SQLSTATE=57019

에러가 나온다면 

다른 application(SQLSTATE=57019) 에서 사용중이기 때문이다. 

그 application 을 꺼주고 다시 실행하면 된다.

- @참고(drop database error SQLSTATE=57019): https://www.ibm.com/support/pages/drop-database-fails-sql1035n-database-currently-use-error

 

5. database manager 

1) 실행중인지 status check

>ps -ef | grep db2sysc

 

2) database manager 실행

>db2start

 

3) database manager 종료

>db2stop

- db2stop 시 

SQL1025N  The database manager was not stopped because databases are still active.

에러가 난다면 사용중인 어플리케이션을 확인하고 중지시켜준다.

>db2 list application

강제종료 시

>db2stop force

 

4) db2 환경 설정 구성 보기 - @참고: https://www.lesstif.com/dbms/db2-quick-start-reference-30704860.html

>db2 "get dbm cfg"

 

6. 테이블 생성 시 

Connection refused. ERRORCODE=-4499, SQLSTATE=08001.

위와 같은 에러가 발생한다면, db2 가 비활성화되어있으므로 활성화시켜줘야 한다.

[db2inst1@db2server ~]$ db2 activate db PS30CA

- @참고: https://www.ibm.com/docs/ko/license-metric-tool?topic=problems-database

 

 

 

- @참고(db2stop 시): https://goni9071.tistory.com/entry/db2-SQL1025N-The-database-manager-was-not-stopped-because-databases-are-still-active

 

블로그 이미지

uchacha

개발자 일지

,

* @참고: https://www.youtube.com/watch?v=2MdsebfJOyM

 

레드-블랙 트리: 자가 균형 이진 탐색 트리
숫자 등의 비교 가능한 자료를 정리하는데 쓰임.

레드-블랙 트리에서는 리프 노드들은 비어있고, 자료를 가지고 있지 않다... NIL 로 리프노드를 가진다.

내 자료는 나보다 오른쪽에 위치한 부분트리가 가지고 있는 모든 자료보다 작거나 같고,
나보다 왼쪽에 위치한 부분트리가 가지고 있는 모든 자료보다 크거나 같다.

장점: worst-case guarantees
삽입, 삭제 시 O(log n)만큼의 시간이 필요

연산: 색 전환(color-flipping), 회전(rotation)

레드-블랙 트리의 가장 중요한 특성: 루트 노드로부터 가장 먼 리프노드 경로까지의 거리 < 가장 가까운 리프노드 까지의 거리 * 2
-> roughly 하게 균형 잡힘!!

** 레드 노드의 자식노드는 언제나 블랙!! 레드는 연달아 나타날 수 없고, 블랙 노드만이 레드 노드의 부모 노드가 될 수 있음.


1. 노드는 레드 또는 블랙
2. 루트 노드는 블랙
3. 리프 노드들은 블랙
4. 레드 노드의 자식노드 2은 모두 블랙
5. 어떤 노드로부터 리프 노드에 도달하는 모든 경로에서 자기자신을 제외하고 모두 같은 개수의 블랙 노드 존재


* 삽입 노드의 색: red -> 이유: 5번을 만족하기 위해 

블로그 이미지

uchacha

개발자 일지

,

- @펌: https://brunch.co.kr/@qqplot/15

 

어떻게 뛰어난 개발자가 될 수 있는가?

 

1. 의식적인 연습을 한다.

단순히 반복하는 것이 아닌,

어려운 문제를 통해 스스로의 한계에 도전하며 시도하고

끝난 뒤에는 성과를 분석하고 실수를 고쳐나간다.

이를 반복하고 다시 반복한다.

 

** 주어진 영역에서 개인의 최고 수준의 성과는 오랜 경험만 넣으면 결과가 나오는 함수처럼 자동으로 얻어지지 않는다.

그 수준의 성과는 굉장히 숙련된 사람에 의해서도 의식적인 연습을 통해서만 나온다.

** 누구든 요리할 수는 있다. 하지만 겁없는 자만이 훌륭한 쉐프가 될 수 있다. 위인들은 기꺼이 삶의 많은 부분을 의식적인 연습에 헌신한다.

 

2. 지름길은 없다는 사실을 안다.

선천적으로 재능있는 사람도 최고 수준에 도달하기 위해서는 매주 10-20시간씩 여러 해가 걸린다는 사실을 안다.

 

 

'태도' 카테고리의 다른 글

[태도] Go to guy 가 되자.  (0) 2021.12.28
블로그 이미지

uchacha

개발자 일지

,