일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 스프링 부트 기본
- 필드 주입
- mybatis
- Javascript
- DIP
- 스프링 컨테이너
- kafka
- 생성자 주입
- 스프링 부트
- Effective Java
- spring
- 스프링 부트 입문
- 스프링
- sqld
- 싱글톤
- jdbc
- thymeleaf
- resultMap
- java
- assertThat
- @Configuration
- 스프링 프레임워크
- 스프링부트
- springboot
- SQL
- db
- assertThrows
- DI
- JPA
- 스프링 빈
- Today
- Total
목록분류 전체보기 (292)
선 조치 후 분석
자바에서 객체소멸은 GC (Gabage Collector)가 담당하고, 비 메모리 자원회수는 try-with-resources, try-finally로 해결한다. 자바에서 제공하는 2가지 객체 소멸자, finalizer와 cleaner는 기본적으로 사용하지 말아야 한다. 사용하면 안 되는 이유 finalizer : 예측할 수 없고, 위험하며, 느리고, 일반적으로 불필요하다. cleaner : finalizer보다는 덜 위험하지만 여전히 예측할 수 없고, 느리며, 보통은 불필요하다. 단점 1 - 즉시 수행된다는 보장이 없다 finalizer와 cleaner는 호출된 후 언제 실행될지 알 수 없다. 즉, 제때 실행되어야 하는 작업을 절대 할 수 없다. finalizer와 cleaner의 수행 속도는 가비지 ..
메모리 누수의 주범 1 - 메모리 직접 관리 자바에 GC (Garbage Collector)가 있기 때문에, GC가 다 쓴 객체를 알아서 회수해 간다고 해서 메모리 관리에 더 이상 신경 쓰지 않아도 된다는 것은 큰 오해다. 아래 Stack을 사용하는 프로그램을 오래 실행하다 보면 점차 GC 활동과 메모리 사용량이 늘어나 결국 성능이 저하되는 코드를 볼 수 있다. 그렇다면, 어디서 메모리 누수가 나는지 확인해 보자. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object..
Java의 참조 유형에는 크게 4가지가 있다. 참조 유형에 따라서 GC 실행 대상 여부, 시점이 달라진다. 아래로 갈수록 CG의 대상이 되는 경우와 시점이 앞당겨진다. 강한 참조 (Strong Reference) 소프트 참조 (Soft Reference) 약한 참조 (Weak Reference) 팬텀 참조 (Phantom Reference) 1. 강한 참조 (Strong Reference) Java의 기본 참조 유형 A obj = new A(); obj 변수가 참조를 가지고 있는 한, A 객체는 GC의 대상이 되지 않는다. 2. 소프트 참조 (Soft Reference) public static void main(String[] args) { A obj = new A(); SoftReference sft..
객체들을 사용하다 보면 불필요하게 여러 번 생성하는 경우가 있다. 같은 기능의 객체를 새로 생성하는 대신, 객체 하나를 재사용하는 편이 좋을 때가 많다. 특히, 불변 객체는 언제든 재사용할 수 있다. 예를 들어 세 가지를 살펴보자. 1. 문자열 객체 생성 String을 new로 생성하면 항상 새로운 객체를 만들게 된다. String s = new String("Java"); 아래 코드는 새로운 인스턴스를 매번 만드는 대신 하나의 Stirng 인스턴스를 재사용한다. String a = "Java"; 같은 가상 머신 안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장된다. ※ String Constant Pool에 존재하면 기존 객체를 참조하게 된다. (내용 참조 https..

String Constant Pool → Java에서 문자열 리터럴을 저장하는 독립된 영역 → Java6까지 String Constant Pool의 위치는 Perm 영역이었으며, Java7에서는 OOM 문제로 인하여 Heap 영역으로 변경되었다고 한다. → Perm 영역은 고정된 사이즈이며 Runtime에 사이즈가 확장되지 않는다. Java6 까지는 String의 intern() 메서드를 호출하는 것은 OutOfMemoryException을 발생시킬 수 있고 그 부분을 컨트롤할 수 없었기 때문에 거의 사용하지 않았다. 그리고 Perm영역에 존재하면, GC의 대상이 되지 않았다. → 그래서 Oracle 엔지니어들이 Java7에서 Perm 영역이 아닌 Heap 영역으로 Stirng Constant Pool의..
클래스를 구현하다 보면 인스턴스를 생성할 필요가 없는 경우가 가끔 있다. 물론, static 메서드와 static 필드만을 담은 유틸리티 클래스는 객체지향과 거리가 멀지만, 쓰임새가 있다. Java에서의 유틸리티 클래스의 예시 : java.lang.Math, java.util.Arrays, java.util.Collections 정적 메서드만 담은 정적 유틸리티 클래스가 그런 경우이다. 보통 정적 유틸리티 클래스는 인스턴스를 생성해서 사용하도록 설계한 클래스가 아니다. public class UtilityClass { public static String hello() { return "Hello"; } } 인스턴스를 생성하여 메서드를 호출하는 게 문법적으로 잘못된 건 아니지만, 바로 hello() 메서..