System.out.println을 실무에서 사용하면 안되는 이유
·
💻 Dev/Java
자바를 접하게 되면 제일 먼저 하는 것이 System.out.println("Hello, World!")일 것이다.그만큼 기초이자, 아주 많이 사용하는 코드이다.하지만 System.out.println은 실무에서 절대 사용하지 말라고들 한다. 왜일까?성능 이슈로는 크게 2가지가 있다. 블로킹 I/O작업을 한다는 점과 멀티스레드에서 락이 발생한다는 점이다. 1. 블로킹 I/O 작업먼저 System 클래스의 static 변수인 out은 PrintStream 타입의 인스턴스이다.public static final PrintStream out = null;그리고 PrintStream 클래스는 java의 io 패키지 내에 있다.package java.io;public class PrintStream extends..
가비지 컬렉터(GC)의 Roots
·
💻 Dev/Java
자바에서 가비지 컬렉터(GC)의 GC Roots는 힙 메모리에서 객체를 도달 가능한 상태로 유지하는 시작 지점이다.  GC는 메모리에서 더 이상 사용되지 않는 객체를 식별하고(Mark) 회수하는 작업(Sweep)을 수행하는데, 이때 어떤 객체가 사용 중인지 판단하기 위해 GC Roots에서 시작하여 도달할 수 있는 객체를 활성객체로 간주한다. GC Roots로 간주되는 객체들어떤 게 Roots다! 라고 딱 정해진 건 없지만 일반적으로 다음과 같은 객체들이 GC Roots로 간주된다. 1. 클래스(Class)JVM의 시스템 클래스 로더에 의해 로드된 클래스는 메서드 영역(Method Area)에 저장되며, 클래스의 정적 필드와 메서드는 프로그램 전반에서 전역적으로 접근 가능하다.이러한 정적 필드가 참조하는..
[F-Lab] 3주차 회고
·
📝 끄적끄적/F-Lab
사전 질문러닝커브를 본인이 자각하게 되는지, 느끼는 지점이 있는지Java 7, 8~에 추가된 내용들 면접에서 물어보는지JSP 책 사전 학습자바의 신 2권 (할 수 있는 만큼 학습)15장까지 학습 멘토님 질문리플렉션힙 영역이 Young, Old 영역으로 나뉜 이유G1 가비지 컬렉터System.out.println이 성능면에서 안 좋은 이유ArrayList vs LinkedListArrayList vs VectorStack 클래스가 왜 상속의 단점의 대표 사례인지HashMap스레드와 프로세스의 차이컨텍스트 스위칭동기&비동기, 블로킹&논블로킹의 차이점 느낀 점이번엔 자료구조 파트에 대한 질문이 많았는데 확실히 많이 부족하다고 느꼈다.이전에도 느꼈지만 자료구조에 대한 막연한 거부감이 좀 있는 것 같은데 이걸 돌..
Out-of-Memory(OOM)는 왜 발생하고, 어떻게 예방할까?
·
💻 Dev/Java
Java 애플리케이션을 개발하다 보면 OutOfMemoryError라는 런타임 에러를 마주칠 때가 있다.JVM이 더 이상 메모리를 할당할 수 없을 때 발생하는 이 에러는 코드나 환경 문제를 나타내는 강력한 신호다.그래~서 OOM 에러가 발생하는 이유와 이를 예방하기 위한 방법을 알아보았다. Out-of-Memory 에러는 언제 발생할까?OOM 에러는 자바의 메모리 구조와 밀접한 관련이 있다.JVM은 Heap, Stack, Metaspace 등으로 나뉘어 메모리를 관리하는데 이 중 특정 영역이 고갈되면 문제가 생긴다.각각의 상황을 예제와 함께 살펴보자. 1. Heap 메모리가 부족한 경우Heap 영역은 객체를 저장하는 공간이다. 프로그램이 너무 많은 객체를 생성하거나 메모리를 효율적으로 관리하지 못하면 고..
instanceof 사용을 지양해야하는 3가지 이유
·
💻 Dev/Java
상속, 다형성 파트를 배울 때 무조건 학습하게 되는 instanceof에는 3가지 원칙을 위반하는 단점이 존재한다. 그게 뭔지 알아보자 레쓰고 instanceof란?자바에서 객체가 특정 클래스의 인스턴스인지 확인하는 데 사용하는 연산자이다.abstract class Animal {}class Dog extends Animal {}class Cat extends Animal {}위와 같은 상속 관계일 때public class AnimalGame { public void makeSound(Animal animal) { if (animal1 instanceof Dog) { //생략 } if (animal2 instanceof Cat) { //..
JVM Warm-up, feat. 스프링 첫 요청이 오래 걸리는 이유
·
💻 Dev/Java
원인웹 애플리케이션을 실행한 후 초기 요청이 지연되는 현상을 이해하려면, 자바 프로그램이 실행되는 방식을 깊이 살펴볼 필요가 있다.C, C++과 같은 컴파일 언어는 소스 코드를 기계어로 직접 변환하여 최적화된 성능을 제공하나 빌드 환경에 종속적이라는 단점이 있다.즉, 플랫폼이 바뀌면 재컴파일이 필요하다. 자바는 이러한 플랫폼 종속적인 문제를 해결하고자 JVM을 도입하였다.자바는 자바 코드는 컴파일 시 바이트 코드로 변환되고, 실행 시 JVM이 이를 기계어로 변환하여 실행한다.이러한 구조 덕분에 Java는 플랫폼에 종속되지 않게 되었지만, 이 과정에서 변환 작업이 추가되므로 성능에 영향을 미칠 수 있다. 1. 클래스 로더JVM에서 클래스 로더(Class Loader)는 바이트 코드를 메모리에 로드하는 역할..