본문 바로가기
728x90

Language28

JVM G1 GC 방식에 대해.. GC 방식중 한가지로써 자바 9버전부터 default 방식인 Garbage First Collector (G1 콜렉터) 에 대해 간략히 알아본다. G1 방식 외: Serial(시리얼), Parallel(병렬), Parallel Compacting(병렬 콤팩팅), Concurrent Mark-Sweep(CMS) 등이 있다. 위에 적힌 방식은 G1 GC 를 제외하고 모두 Eden과 Survivor 영역으로 나뉘는 Young 영역과 Old 영역으로 구성되어 있다. 하지만 G1은 다른 영역으로 구성되어있다. 바둑판같은 형식으로 일명 region 이라는 영역을 사용한다.하나의 구역이라 생각하면 될듯 하다. 해당 구역의 기본 크기는 1MB이며 최댜 32MB까지 지정 가능하다. Young 영역과 Old 영역이 물리적.. 2023. 2. 12.
자바 가비지 콜렉터(GC)에 대한 정리. 이번에 자바 성능 튜닝 이야기 책을 읽으면서 기존에 알고있던 GC 에 대한것을 정리하려한다.. 너무 깊게 들어가면 끝이 안나고 이해도 어려워 이해하는 부분까지 정리..이미지도 첨부하면 더 이해가 빠르겠지만..넘어간다..(미래의 나에게 미안하다..ㅋㅋㅎ) GC를 반드시 암기하고 숙지해야지 하는건 아니지만, 알고있으면 확실히 좋은듯 하다. GC C에서는 명시적으로 메모리를 건드리고 참조할 수 있다. 자바에서는 메모리는 GC 라는 알고리즘을 통하여 관리하기 때문에, 개발자가 메모리를 처리하기 위한 로직을 만들 필요가 없고, 만들어서도 안된다. JVM은 크게 3가지 영역으로 구성이된다 클래스로더 바이트 코드를 읽고, 클래스 정보를 메모리의 메서드 영역에 저장 JVM Memory(런타임 데이터 영역) 아래 설명 .. 2023. 2. 12.
자바 if else 와 swtich case 를 비교해보았다.. 선 결론: 유의미한 차이를 느끼지 못했고, 가독성과 스타일에 따라 그때그때 다르다.요즘 컴파일러가 알아서 잘 해주기 때문에 성능보다는 가독성으로 잘 정리하면 되지않을까..!? (물론 자체 테스트기 떄문에, 틀릴 수 있음) 요즘 컴파일러 최적화가 잘되어있는지, 생각보다 차이가 날거라 생각했는데, 테스트코드를 잘못 만든것인가...좀 차이를 볼려고 횟수를 상당히 많이 늘리지않는이상은 유의미한 차이를 못느끼겠다. jdk7 버전부터 String 비교가 가능한 것으로 알고있었는데, 이는 String 클래스에서 hasCode 를 오버라이딩 하여 컴파일러가 컴파일 할때 해당 hasCode를 순서대로 처리하는것으로 알고있어서 String 으로 비교, 숫자로 비교해도 차이가 날까 궁금했는데, 이는 생각해보니 컴파일러가 최.. 2023. 2. 11.
자바 람다 Supplier example Supplier => T get() => 매개변수는 없고 반환값만 있음. (공급자) import java.util.function.Supplier; public class SupplierExample { public static void main(String[] args) { printValid(0, getVeryExpensiveValue()); printValid(-1, getVeryExpensiveValue()); printValid(-2, getVeryExpensiveValue()); System.out.println("================"); printIfValidIndex(0, () -> getVeryExpensiveValue()); printIfValidIndex(-1, () -> .. 2023. 2. 2.
자바 접근지시자 자바의 접근 지시자는 클래스, 변수, 메서드 등의 접근 범위를 지정하는 키워드 이다. 접근 지시자를 사용하면 클래스의 캡슐화를 강화할 수 있다. public 가장 높은 공개수준, 어디에서는 자유롭게 접근 가능 다른 패키지에 있는 클래스도 접근 가능하다. protected 같은 패키지 내에서 접근 가능, 상속을 받은 클래스 내부에서도 사용 가능. 다른 패키지에 있는 클래스에서는 접근 불가능 pakage-private(default) 같은 패키지 내에서만 접근 가능. 접근지시자가 없을 경우 default 로 적용 됨. 다른 패키지에 있는 클래스에서는 접근 불가능. private 가장 낮은 공개수준, 클래스 내부에서만 접근 가능하다. 다른 패키지에 있는 클래스에서는 접근 불가능 패키지? 자바에서 관련된 클래스.. 2023. 1. 29.
자바 오토박싱 & 언박싱 기억나는대로 간략히 적음. 오토박싱 int -> Integer 로 변경해주는것(기본형을 래퍼클래스로) 근데 이를 자동으로 해주는 것 언박싱 Integer -> int 형으로 변경해주는것.(래퍼클래스를 기본형으로) 근데 이를 자동으로 해주는 것 JDK 1.5 버전부터 나옴. 기본형 + 참조형을 실행하면 컴파일되면서 코드를 알아서 변경해준다. 간단한 예제.(모던 자바 인 액션) List list = new ArrayList(); for (int i = 300; i < 400; i++) { list.add(i); //이 부분 오토박싱됨. //list.add(new Integer(i)); } int integer = list.get(0); //오토언박싱 //Integer integer = list.get(0);.. 2023. 1. 29.
자바 @FunctionalInterface 는 무엇인가? @FunctionalInterface 는 함수형 인터페이스임을 가르키는 어노테이션이다. @FunctionalInterface 로 인터페이스를 선언했지만 실제로 함수형 인터페이스가 아니면 컴파일러가 에러를 발생시킨다. 추상 메서드가 1개가 아닐시 "Multiple nonoverriding abstract methods found in interface Foo(인터페이스 Foo에 오버라이드 하지 않은 여러 추상 메서드가 있음) 같은 에러가 발생할 수 있음. 2023. 1. 29.
자바 시그니처? 생각난 김에 적어본다.. 자바 시그니처 메소드 이름과 매개변수 타입, 리턴 타입으로 이루어진 것을 말한다. 같은 이름의 메소드를 여러개 정의하는 것을 허용, 이는 오버로딩 이라 한다. 자바 컴파일러는 메서드 이름, 파라미터를 이용하여 구분함. 2023. 1. 29.
함수형 인터페이스 간략히 알아보자. 함수형 인터페이스 1개의 추상 메서드를 갖는 인터페이스 자바 8 버전 이후에는 Default 메서드 사용 가능 구현된 함수형 인터페이스는 @FunctionalInterface 를 표시하여 검증할 수 있다. 맞지 않는 경우 에러가 발생(필수로 명시하지 않아도 됨 => 의도 전달 목적 검증 목적) https://jeong0427.tistory.com/manage/posts/ Single Abstract Method(SAM) 이라고도 불림. 아래는 간단한 함수형 인터페이스를 이용한 람다문법. @FunctionalInterface interface Worker { void work(); } public class FITest { static void execute(Worker worker) { worker.wo.. 2023. 1. 29.
728x90