- @참고: 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

개발자 일지

,

[Java] 연산자 우선순위

Java 2022. 12. 18. 17:23

- @참고: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=dnzh&logNo=100134269443

 

- 우선순위가 높은 순서부터 낮은 순서대로 

연산기호 결합방향 우선순위
 expr++, expr--    
++expr, --expr, 부호연산자, !, ~    
*, /, %    
+, -    
shift 연산자    
부등호, instanceof    
비교(==, !=)    
순서대로 우선순위 &, ^, |    
순서대로 우선순위 &&, ||    
삼항연산자    
대입(=, +=, -=, *=, /=, %=, &=, ^= , |=, <<=, >>=, >>>=)    

 

* 후위 증감 연산자 (expr++, expr--) 

';' 를 만나거나 같은 변수를 만날 경우 변경된 값이 저장된다.

 

'Java' 카테고리의 다른 글

[Java] Heap 모니터링 & Heap Dump 분석하기  (1) 2023.05.10
[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

개발자 일지

,

- @참고: codechacha.com/ko/java-convert-localdatetime-to-timestamp/

- @참고(LocalDateTime 시간 더하기): jekalmin.tistory.com/entry/%EC%9E%90%EB%B0%94-18-%EB%82%A0%EC%A7%9C-%EC%A0%95%EB%A6%AC

 

LocalDateTime <-> Timestamp

LocalDateTime localDateTime = LocalDateTime.now(); //2019-10-31T08:45:54.874

// LocalDateTime -> Timestamp
Timdstamp timestamp = Timestamp.valueOf(localDateTime); //2019-10-31 08:45:54.874

// Timestamp -> LocalDateTime
LocalDateTime localDateTime = timestamp.toLocalDateTime() //2019-10-31T08:45:54.874

 

LocalDateTime 시간 더하기

LocalDateTime.of(2015, 4, 17, 23, 47, 5).minus(Period.ofWeeks(3)); //(2015년4월17일 23시47분05초 - 3주간) = 2015년3월27일 23시47분05초

'Java' 카테고리의 다른 글

[Java] Heap 모니터링 & Heap Dump 분석하기  (1) 2023.05.10
[Java] 연산자 우선순위  (0) 2022.12.18
[Java] Set to List, List to Set  (0) 2021.02.25
[Java] Optional 사용법  (0) 2021.02.19
[Java] 파일 입출력  (0) 2021.01.27
블로그 이미지

uchacha

개발자 일지

,

- @참고: codechacha.com/ko/java-convert-set-to-list-and-list-to-set/

 

- List to Set

Set<Integer> targetSet = new HashSet<>(sourceList);

- Set to List

List<Integer> targetList = new ArrayList<>(sourceSet);

- Array to Set

Set<Integer> set = Arrays.stream(array).collect(Collectors.toSet());

- Array to List

List<Integer> list = Arrays.stream(array).collect(Collectors.toList());

- Set to Array

Integer[] array = new Integer[set.size()];
set.toArray(array);

- List to Array

Integer[] array = new Integer[list.size()];
list.toArray(array);

'Java' 카테고리의 다른 글

[Java] 연산자 우선순위  (0) 2022.12.18
[Java] LocalDateTime, Timestamp 변환  (0) 2021.02.26
[Java] Optional 사용법  (0) 2021.02.19
[Java] 파일 입출력  (0) 2021.01.27
[java] url 주소 가져오기  (0) 2020.11.11
블로그 이미지

uchacha

개발자 일지

,

[Java] Optional 사용법

Java 2021. 2. 19. 08:02

- @참고: www.daleseo.com/java8-optional-effective/

- @참고(Optional java doc): docs.oracle.com/javase/8/docs/api/java/util/Optional.html

 

Optional 변수 선언하기

Optional.empty() //null을 담은 빈 Optional 객체
Optional.of(value) //null이 아닌 객체를 담고 있는 Optional 객체를 생성. null이 넘어올 경우 NPE 던짐
Optional.ofNullable(value) //null인지 아닌지 확신할 수 없는 객체를 담고 있는 Optional 객체를 생성

 

Optional이 담고 있는 객체 접근하기

get() //비어있는 Optional 객체에 대해서, NoSuchElementException을 던짐
orElse(T other) //비어있는 Optional 객체에 대해서, 넘어온 인자를 반환
orElseGet(Supplier<? extends T> other) //비어있는 Optional 객체에 대해서, 넘어온 함수형 인자를 반환. 비어있는 경우만 함수가 호출되므로 orElse 대비 성능상 이점이 있음
orElseThrow(Supplier<? extends X> exceptionSupplier) //비어있는 Optional 객체에 대해서, 넘어온 함수형 인자를 통해 생성된 예외를 던짐

 

Optional의 활용 메소드

Optional<T> filter(Predicate<? super T> predicate) //If a value is present, and the value matches the given predicate, return an Optional describing the value, otherwise return an empty Optional.
Optional<T> map(Function<? super T, extends U> mapper) //If a value is present, apply the provided mapping function to it, and if the result is non-null, return an Optional describing the result.

void ifPresent(Consumer<? super T> consumer) //If a value is present, invoke the specified consumer with the value, otherwise do nothing.
boolean isPresent() //Return true if there is a value present, otherwise false.

boolean equals(Object obj) //Indicates whether some other object is "equal to" this Optional.

 

Optional 활용 코드 샘플

int length = Optional.ofNullable(getText()).map(String::length).orElse(0);

/* 주문을 한 회원이 살고 있는 도시를 반환한다 */
public String getCityOfMemberFromOrder(Order order) {
	return Optional.ofNullable(order)
			.map(Order::getMember)
			.map(Member::getAddress)
			.map(Address::getCity)
			.orElse("Seoul");
}

/* 주어진 시간(분) 내에 생성된 주문을 한 경우에만 해당 회원 정보를 구한다 */
public Optional<Member> getMemberIfOrderWithin(Order order, int min) {
	return Optional.ofNullable(order)
			.filter(o -> o.getDate().getTime() > System.currentTimeMillis() - min * 1000)
			.map(Order::getMember);
}

/* List 로부터 주어진 인덱스에 해당하는 값을 담은 Optional 객체를 반환한다. */
public static <T> Optional<T> getAsOptional(List<T> list, int index) {
	try {
		return Optional.of(list.get(index));
	} catch (ArrayIndexOutOfBoundsException e) {
		return Optional.empty();
	}
}

Optional<String> maybeCity = getAsOptional(cities, 3); // Optional
maybeCity.ifPresent(city -> {
	System.out.println("length: " + city.length());
});

'Java' 카테고리의 다른 글

[Java] LocalDateTime, Timestamp 변환  (0) 2021.02.26
[Java] Set to List, List to Set  (0) 2021.02.25
[Java] 파일 입출력  (0) 2021.01.27
[java] url 주소 가져오기  (0) 2020.11.11
Interface Comparable vs Interface Comparator  (0) 2020.01.07
블로그 이미지

uchacha

개발자 일지

,

[Java] 파일 입출력

Java 2021. 1. 27. 09:19

- @참고: csw7432.tistory.com/entry/Java-Input-Output-Stream

왜 FileOutputStream을 BufferedOutputStream에 담아서 처리하는가.

버퍼란
데이터를 전송하는 상호간의 장치에서 고속의 장치와 저속의 장치 간의 속도 차이로 인해 저속의 장치가 작업을 추리하는 동안 고속의 장치가 기다려야 하는 현상을 줄여주는 기술이다.

IF 버퍼를 사용하지 않는다면
컴퓨터는 프린터가 인쇄를 끝낼 때 까지 아무런 작업을 할 수 없게 된다.

IF 버퍼를 사용한다면
컴퓨터에서 전송한 데이터가 버퍼에 저장되어 프린터는 컴퓨터로부터 직접 데이터를 받는 것이 아니라, 버퍼에서 데이터를 조금씩 읽어서 출력 하므로 컴퓨터는 버퍼로 전송작업을 마치고 프린터가 출력을 하는 동안 다른 작업을 할 수 있게 되는 것 이다.

Finally
버퍼는 각 장치나 프로세스가 상대방에 의해 정체되지 않고 잘 동작 할 수 있도록 해주는 놈이다.

Reference
"데이터의 중간 저장소" 라는 측면에서 버퍼는 캐시와 마찬가지이지만, 캐시가 어떤 작업의 속도를 증진시키기 위해 존재하는데 비해, 버퍼는 개별 작업들 간의 협동을 지원 하기 위해 존재한다는 차이가 있다.

출처: csw7432.tistory.com/entry/Java-Input-Output-Stream

 

import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 
public class BufferedOutputStream_SW {
    public static void main(String[] args)
    {
        FileOutputStream sw_stream = null;
        try
        {
            sw_stream = new FileOutputStream("SWTest");
            byte receive[] = {'C','H','O','I'};
            
            // 스스로 파일에 접근을 할수 없기때문에 FileOutputStream 사용하여 BufferedOutputStream 객체를 선언 / 생성
            // 여기서 특이한 점은 임시로 저장할 버퍼의 크기를 마음대로 조절이 가능하다는 점이다
            BufferedOutputStream b_out_stream = new BufferedOutputStream(sw_stream,1024);
            // "1024" 크기로 제 마음대로 버퍼의 크기를 잡아주었다
            // 즉, 파일에 데이터를 쓰기 위해서는 1024가 모여야 보조기억장치에 접근하여 쓰게 된다
            
            b_out_stream.write(receive);
            // "write()" 메소드는 FileOutputStream과 동일
            
            b_out_stream.close(); // 이 부분은 이제 필수 부분인걸 알것이다
            sw_stream.close();
        }
        catch(FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}


출처: https://csw7432.tistory.com/entry/Java-Input-Output-Stream [최느님 프알못]

'Java' 카테고리의 다른 글

[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] url 주소 가져오기  (0) 2020.11.11
Interface Comparable vs Interface Comparator  (0) 2020.01.07
블로그 이미지

uchacha

개발자 일지

,

[java] url 주소 가져오기

Java 2020. 11. 11. 19:03

- @참고: dlevelb.tistory.com/576

아래와 같은 요청 받은 주소가 있을 경우

http://localhost:8080/test/index.jsp

request.getContextPath() : 프로젝트의 경로값만 가져옴 (/test)

request.getRequestURI() : 프로젝트 경로부터 파일까지의 경로값을 얻어옴 (/test/index.jsp)

request.getRequestURL() : 전체 경로를 가져옴 (http://localhost:8080/test/index.jsp)

아래와 같은 요청한 주소가 있을 경우

http://127.0.0.1:8080/REQ/req.jsp

request.getRemoteAddr() : 클라이언트의 IP 주소나 요청한 마지막 Proxy 주소를 가져옴 (127.0.0.1)

request.getRemoteHost() : 호스트 네임이나 IP 주소를 가져옴 (127.0.0.1)

request.getRemotePort() : 요청 보낸 포트 (52439)

 

'Java' 카테고리의 다른 글

[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
Interface Comparable vs Interface Comparator  (0) 2020.01.07
블로그 이미지

uchacha

개발자 일지

,

- @참고 : https://www.daleseo.com/java-comparable-comparator/

 

[Java] 객체 정렬하기 1부 - Comparable vs Comparator

자바와 같이 객체 지향 언어를 사용하여 프로그래밍을 하다보면 객체들을 정렬해야하는 경우가 생깁니다.예를 들면, 온라인 게임 서비스에서 게이머들을 높은 점수 순으로 보여주는 게이머 랭킹 페이지를 생각해볼 수 있겠습니다. 정렬 대상 클래스먼저, 각 게이머의 정보를 표현하기 위해 다음과 같은 간단한 클래스를 생각해보겠습니다. 1234567891011public

www.daleseo.com

Interface Comparable

차이점 : 객체의 내부 변수(전)와 인자로 넘어온 변수(후)를 메소드 compareTo(o1)로 비교

공통점 : return 값이 양수일 경우 자리가 바뀐다.

사용방법 : 정렬을 원하는 클래스가 상속받아 구현 후 Arrays.sort(array), Collections.sort(list)로 정렬

Interface Comparator

차이점 : 두 변수(전, 후)를 compare(o1, o2)로 비교

공통점 : return 값이 양수일 경우 자리가 바뀐다. 즉 return o1 - o2는 오름차순(natural), return o2 - o1은 내림차순

사용방법

  1. 정렬을 정의하는 클래스가 상속받아 구현 후 Arrays.sort(array, comparator), Collections.sort(list, comparator)로 정렬
  2. 익명객체로 구현 또는 람다식을 사용하여 구현
  3. Stream을 사용하여 구현

 

'Java' 카테고리의 다른 글

[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
[java] url 주소 가져오기  (0) 2020.11.11
블로그 이미지

uchacha

개발자 일지

,