본문 바로가기

전체 글

(461)
JVM 구조 클래스 로더 시스템 .class 에서 바이트코드를 읽고 메모리에 저장 하는 역할은 크게 세가지로 나눌 수 있다. 로딩: 클래스 파일에서 바이트 코드를 읽어오는 과정 링크: 레퍼런스를 연결하는 과정 (링크도 크게 세가지로 나눌 수 있다.) 초기화: static 값들 초기화 및 변수에 할당 - 보충 개념 1. class 파일은 어디에 있을까? intellij에서 class 파일 찾기 class파일의 위치는 target/classes 아래 디렉터리에서 확인할 수 있다. 원래는 컴파일 되어있는 바이트 코드가 있어야 하는데 intellij 에서 확인하면 바이트 코드가 아닌 것을 확인할 수 있다. javap 같은 것을 사용해서 우리 눈에 조금 더 사람이 읽을 수 있는 코드로 보여주고 있는 것이라고 보면 된다. (바..
자바, JVM, JDK 그리고 JRE JVM (Java Virtual Machine) 자바 가상 머신 자바 바이트 코드를 어떻게 실행할 지에 대한 표준 스펙 자바 바이트 코드(.class 파일)를 OS에 특화된 코드로 변환(인터프리터와 JIT 컴파일러)하여 실행한다. 바이트 코드를 실행하는 표준(JVM 자체는 표준)이자 구현체(특정 밴더가 구현한 JVM)다. JVM 스팩: https://docs.oracle.com/javase/specs/jvms/se11/html/ JVM 밴더: 오라클, 아마존, Azul, ... 특정 플랫폼에 종속적. (네이티브 코드로 바꿔서 실행해야 하는데 네이티브 코드가 OS에 맞춰서 실행해야 하기 때문에) 구현체는 다양하다. 컴파일 javac HelloJava.java HelloJava.class
다양한 종류의 Garbage Collection(가비지 컬렉션) 알고리즘 (2/2) 1. 다양한 Garbage Collection(가비지 컬렉션) 알고리즘 JVM이 메모리를 자동으로 관리해주는 것은 개발자의 입장에서 상당한 메리트이다. 하지만 문제는 GC를 수행하기 위해 Stop The World에 의해 애플리케이션이 중지되는 것에 있다. Heap의 사이즈가 커지면서 애플리케이션의 지연(Suspend) 현상이 두드러지게 되었고, 이를 막기 위해 다양한 Garbage Collection(가비지 컬렉션) 알고리즘을 지원하고 있다. [ Serial GC ] Serial GC의 Young 영역은 앞서 설명한 알고리즘(Mark Sweep)대로 수행된다. 하지만 Old 영역에서는 Mark Sweep Compact 알고리즘이 사용되는데, 기존의 Mark Sweep에 Compact라는 작업이 추가되었..
[Java] Garbage Collection(가비지 컬렉션)의 개념 및 동작 원리 (1/2) 1. Garbage Collection(가비지 컬렉션)이란? [ Garbage Collection(가비지 컬렉션)이란? ] 프로그램을 개발 하다 보면 유효하지 않은 메모리인 가바지(Garbage)가 발생하게 된다. C언어를 이용하면 free()라는 함수를 통해 직접 메모리를 해제해주어야 한다. 하지만 Java나 Kotlin을 이용해 개발을 하다 보면 개발자가 메모리를 직접 해제해주는 일이 없다. 그 이유는 JVM의 가비지 컬렉터가 불필요한 메모리를 알아서 정리해주기 때문이다. 대신 Java에서 명시적으로 불필요한 데이터를 표현하기 위해서 일반적으로 null을 선언해준다. 예를 들어 아래와 같은 코드가 있다고 가정하자. Person person = new Person(); person.setName("Ma..
노드 설치 1. 리눅스 OS version 확인 cat /etc/redhat-release 2. nvm 설치 wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash 3. reboot 또는 소스 재시작한 뒤 버전 확인 #reboot source ~/.bashrc nvm --version 4. 원하는 노드 버전을 설치한다 nvm install 14.16.0 5. Nginx 설치 /etc/yum.repos.d 경로에 nginx.repo 파일을 추가하고 내용은 다음과 같이 작성한다. Nginx 설치는 root 계정으로 진행한다. [nginx-stable] name=nginx stable repo baseurl=http://nginx...
equals, hashcode 배열에 대한 공부를 하는데 문자열 비교와 배열 복사에 대한 내용을 만났다. 관련하여 이전에 공부했던 개념을 리마인드도 하고 새롭게 문서를 찾아 보며 공부를 또 하면 좋을 것 같아 해당 주제에 대해 조사해보았다. equals() 우선 정말 좋은 원본 글을 또 망개님이 다시 정리한 글이 있어 해당 글을 참고했다는 것을 미리 말한다. equals와 hashCode는 Object 클래스에 정의되어 있다. 따라서 Java의 모든 객체는 이 두 함수를 상속받고 있게 된다. 그래서 equals() 란? 2개의 객체가 동일한지 검사하기 위해 사용 2개의 객체가 가리키는 곳이 동일한 메모리 주소일 경우에만 동일한 객체this == obj 가 주소를 비교하는 것이다. 하지만 개발을 하다 보면 equals()는 내 의도와는..
@Configuration과 proxyBeanMethods 학습 테스트 남이 만든 코드를 동작 방식을 정확하게 이해할 수 있도록 테스트 코드로 샘플을 만드는 것이다. 어떤 기술을 정확하게 이해하고 싶을때 테스트 코드를 학습 목적으로 만들 수 있다. 테스트 코드로 사용법을 이해하고 이걸 사용하는 코드가 어떤 식으로 작성이 되는가 연습할 수 있는 기회가 될 수 있다. configuration의 가장 default 구성 그 특징을 살펴보는 코드를 만들어 볼 것이다. configuration의 특징은 이 안에 bean이라는 어노테이션이 붙은 메서드를 많이 가지고 있다. 각각의 메서드들이 자바 코드에 의해서 빈 오브젝트를 생성하고 다른 오브젝트의 관계를 설정하는 부분을 담당하게 된다. 이자체로는 평범하게 팩토리 메서드로 동작하면 된다고 하지만 생각보다 단순하지는 않다. ..
자동 구성 애노테이션 적용 일단 어떻게 수정을 하였는지 살펴보자 먼저 DispatcherServletConfig와 TomcatWebServerConfig에 @Configuration 어노테이션을 @MyAutoConfiguration annotation으로 수정해주자. package com.example.config.autoconfig; import com.example.config.MyAutoConfiguration; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.servlet.server.ServletWebServerFactory; import org.springf..