자바에서 스트림은 연속적인 데이터를 순차적으로 처리한다. 그런데 효율을 위해 멀티코어를 사용하여 병렬스트림으로 처리하는 경우가 있다. 이때 병렬스트림이 내부적으로 어떻게 동작하는지 알아보고자 한다. 병렬스트림은 각각 스레드에서 데이터를 처리할 수 있도록 스트림 요소를 여러 청크로 나눈다. 여기서 청크란 무엇일까? 청크는 스트림 요소를 작은 단위로 분할하는 단위이다. 예를 들어, ["hello", "judy", "smile"] 이 있다고 하자. 그러면 각각 "hello", "judy", "smile"처럼 세 가지로 분할하여 처리하는 것이 효율적일 것이다. 그런데 데이터가 엄청 많다고 하자. 그럴 때는 ["hello", "judy", "smile"]를 하나의 청크로 하여 스레드에 넘겨주는 것이 효율적일 것이..
자바에서 throw를 통해 발생시킬 수 있는 예외는 크게 세 가지가 있다. Error Exception과 CheckedException java.lang.Exception 클래스와 그 서브클래스 + Exception 클래스의 서브클래스이면서 RuntimeException 클래스를 상속하지 않은 클래스 컴파일시 예외처리가 되어있는지 확인 -> Checked RuntimeException과 UncheckedException java.lang.Exception 클래스의 서브클래스이면서 RuntimeException을 상속한 클래스
이번 개발건에 대용량 파일 업로드가 있어서 대리님이 실험을 해보라고 하셨고, 위 세 가지를 이용하여 테스트해보았다. Case#1 MultipartFile.getByte multipartFile.getByte로 바이트배열을 받고 그 바이트배열을 FileOutputStream을 이용하여 쓰는 방법이다. 1기가 파일을 업로드한다고 했을 때 위와 같은 결과가 나왔다. 항목에 대해 설명하자면, 첫번째 Max Heap은 최대 Heap 사이즈, used(before)은 작업 전 Heap 사이즈, used(after)는 작업 후 Heap 사이즈, used(gc-after)는 GC 후 Heap 사이즈이다. 위와 같은 경우, 작업 후에 메모리를 많이 차지하는 걸 알 수 있다. Case#2 MultipartFile.tran..
대리님들이 자바8의 메서드 참조에 대해 말씀하시는걸 주워듣고 나도 이래저래 공부를 했는데 메서드 참조는 이해가 안 갔다. 그러다가 오늘 갑자기 깨달음을 얻어서 간단하게 정리해둔다. 메서드 참조는 말그대로 메서드를 참조하는 것이다. 그렇다면 메서드를 왜 참조하느냐? 이미 있는 메서드를 사용하기 위해서이다. public class Hello { private static final String HELLO = "안녕하세요!"; public String sayHello() { return HELLO; } public String sayHello(String name) { return name + "님, " + HELLO; } } 위와 같은 클래스가 있다고 해보자. 이름을 입력하면 이 이름을 이용해서 인삿말을 출..
log 설정도 한 번 봐야지, 봐야지 하다가 오늘 마침 설정 건드린 김에 정리해본다. 오늘 내가 설정 수정한 내용은 시스템 분리였다. 기존 A시스템이 있는 상태였고, 여기에 B시스템을 새로 추가하면서 로그를 따로 관리하게 되어 분리해야했다.(기존 시스템에 새로운 시스템을 추가하는 것에 대한 논의는 차치하고.) logback 설정파일 일반적으로 logback 설정파일은 src/main/resources 아래에 logback.xml로 존재한다. 구조는 , 안에 (선택), (선택), 최대 1개의 로 구성되어 있다. // 선택 // 선택 // 최대 1개 참고로 logback 0.9.17버전부터는 태그 이름의 경우, 대소문자를 구분하지 않는다고 한다. 예를 들어, , , 는 모두 이다. 다만, 이런 식으로 구성할..
최근에 성능 개선을 하면서 dead code를 발견했는데 처음엔 왜 dead code인지 모르겠다가 원인을 찾았다. 아래는 내가 발견했던 코드를 최대한 단순화해서 표현한 예시이다. MultipartFile excelFile = request.getFile("excelFile"); List excelContent = null; ... try { // 파일 업로드 작업 } catch (IOException e) { LOGGER.error("excel file error {}", e.getMessage()); if (excelFile != null) { excelFile = null; } if (excelContent != null) { excelContent.clear(); // 이 부분이 dead code..
본 내용은 도서를 참고하여 작성되었습니다. Runtime Data Area에서 Heap Area(이하 'Heap')를 살펴보자. 자바 프로그램에서 생성된 객체는 이 'Heap'에 생기게 된다. 그런데 이 'Heap'는 한정되어 있고 이를 효율적으로 관리하기 위해 GC가 필요하다. 쉽게 말하면 더 이상 사용하지 않는 객체가 메모리를 차지하지 못하게 버려준다. 이 Heap은 대부분의 객체가 탄생하는 Eden, Survivor1과 Survivor2, Old, Permanent로 구성되어 있다. 이름으로 알 수 있다시피 Eden에서 살아남은 객체는 S1, S2로 이동하게 되고 이후로 Old로 이동하게 된다. 대부분의 객체가 탄생하는 Eden은 각 스레드별로 객체를 할당하는 구역이 나누어져 있다.(계산하려고 줄서..