본문 바로가기

java

(22)
[JAVA] 객체 메모리 할당 - Stack, Heap, GC "여기서 리스트라는 객체가 stack에서 names 라는 변수가 참조를 하고 있고 또 이 객체(List) 가 각 String 객체를 참조 하고 있는 경우가 있고 이 던(String) 은 참조를 받고 있지 않기 때문에 이 객체는 Unrechable Object 이고 던 영역이 Garbage Collector 를 통해서 해제되게 됩니다." 이 부분 헷갈렸다. 객체의 메모리 할당이 어떻게 되는지 위주로 이어서 정리한다. 아래 내용은 모두 인용(아래 출처에서)된 것이다. 1. Stack 과 Heap 의 차이 1) Stack - 원시 타입의 데이터가 값과 저장 ( int, boolan, double 등의 실제 값이 스택에 할당) - Heap 영역에 생성된 Object 타입의 데이터 참조값이 저장 - 함수가 호출될..
[JAVA]Garbage Collection 실행 과정 * Garbage collection 을 이해하기 위해 학습한 내용을 정리 하였습니다. 내용 순서 1. GC란? 2. GC를 동작 하게 하는 JVM 이란? 3. GC의 동작 순서 (Mark-and-Sweep) 4. GC 는 언제 일어날까? 1. GC (Garbage Collection) 란? JVM의 Heap 영역에서 사용하지 않는 객체를 삭제하는 프로세스를 말합니다. 가비지 컬렉션은 기본적으로 메모리 누수를 제거 하는것을 목적으로 두고 있습니다. Unreachable-but-not-deleted Object in memory. 2. GC를 동작 하게 하는 JVM 이란? - 자바 가상 머신으로 자바 바이트 코드(.class 파일)을 OS 에 특화된 코드로 변환(인터프리터와 JIT컴파일러) 하여 실행합니다..
[자바 병렬 처리 - 포크/ 조인 프레임 워크] 포크/ 조인 프레임워크는 병렬처리를 위한 프레임워크로 java.util.concurrent 패키지의 핵심인 ExecutorService 인터페이스를 구현한 클래스. 코드에 대한 멀티 스레드 처리가 가능하다. 포크/ 조인 프레임워크의 동작을 확인하면 아래와 같다. 포크(Fork) : 다른 프로세스 혹은 스레트(테스크태스크)를 여러 개로 쪼개서 새롭게 생성 조인(Join) : 포크해서 실행한 프로세스 혹은 스레드(태스크)의 결과를 취합한다. 일을 나눌 수 있다면 여러개로 쪼개서 실행(포크), 하고 최종적으로 실행이 완료된 내용을(조인)해서 결과를 만들어 낸다. 분할 정복 같은 느낌! black9p.github.io/2018/01/20/%EB%B3%91%EB%A0%AC-%EB%8D%B0%EC%9D%B4%ED%..
[JAVA]스트림(Stream) 에서 기본형(Primitive type)은 왜 취약할까? 스트림(Stream) 에서 기본형이 왜 취약할까? 스트림 API 는 데이터가 객체라는 것을 기본 전제로 설계되어있다. 문자열이나 클래스 타입은 객체이지만 기본형 데이터인 Int, long, double 등의 값을 처리하게 되면 기술적으로는 문제가 없으나 이 데이터는 객체가 아니기 때문에 Stream 내부적으로 오토박싱과 언박싱이 빈번하게 발생한다. 이는 처리 시간의 급격한 증가를 가져온다. - 스트림 API 에서는 기본형으로 많이 사용하는 Int, long, double 을 위해 별도의 인터페이스를 제공한다. DoubleStream IntStream LongStream www.baeldung.com/java-8-primitive-streams Primitive Type Streams in Java 8 |..
[JAVA 개념] 추상클래스와 인터페이스의 차이점 ( + 상속과 구현) JDK8 부터 인터페이스에 Default 메서드가 추가 되었다. 추상 클래스와 인터페이스의 큰 차이점은 두가지이다. 1. 추상 클래스는 멤버 변수를 가질 수 있지만 인터페이스는 멤버 변수를 가질 수 없다. (물론 인터페이스도 static 으로 정의된 변수를 내부적으로 선언할 수 있지만 멤버 변수를 선언할 수 없다) 2. 클래스를 구현 할 때 오직 하나의 클래스만을 상속 받을 수 있는 반면에 인터페이스는 여러개를 상속 받거나 구현 할 수있다. 대부분의 멤버 변수는 그 객체의 속성을 담아두기 위한 용도로 사용한다. 메서드 내에 선언한 변수는 메서드가 종료되면 그 상태를 잃어버리는 반면, 클래스의 멤버 변수는 객체가 살아있는 한 속성을 유지 할 수 있으며 값을 변경 할수도 있다. 이렇게 중요한 기능을 수행하는..
[Effective java] Item 7 - 종료자(finalize) 사용을 피하라 * finalize 는 어떤 클래스든 오버라이드 하여 사용 가능한 기능이다. public class FiinalIzerExample { @Override protected void finalize() throws Throwable { super.finalize(); } } 왜 문제가 생기는지? 하지만 종료자(finalizer)는 예측 불가능 하며, 대체로 위험하고, 일반적으로 불필요하다. 종료자는 GC 에 의해 실행되는데 GC에서 종료자 스레드가 종료 우선순위가 높지 않다면 혹은 다른 이유로 즉시 실행 되리라는 보장이 전혀 없기 때문이다. 또한 종료자를 사용하면 프로그램 성능이 심각하게 떨어진다. * 현재 자바9 에서는 finalizer 가 deprecated가 되었다고 한다. 'Cleaner' 라는게 ..
[Effective Java] Item 6 - 유효기간이 지난 객체 참조는 폐기하라. C 나 C++ 처럼 손수 메모리 관리를 해야하는 언어와 달리 Java에서는 JVM 에서 GC(Garbage collertion : 쓰레기 수집가) 를 이용하여 안쓰는 객체를 지우는 기능(쓰레기 수집) 이 가능하지만 메모리 관리를 하지 않으면 '메모리 누수' 의 문제가 생긴다. 그 결과로 GC 가 할일이 많아져 성능이 저하되거나 메모리 요구량이 증가한다. 극단적으로는 디스크 페이징 (Disk paging), OutOfMemortError 가 던져지면서 프로그램이 중단될 것이다. 1. 메모리 누수는 어디서? 스택이 커졌다가 줄어들면서 제거한 객체들을 쓰레기 수집기가 처리하지 못할때, 가용범위를 벗어난 만기 참조(obsolete refrence) 를 그대로 가지고 있을때 * 만기 참조 : 다시 이용되지 않을 ..