참고: 

- http://aljjabaegi.tistory.com/387

- https://jeong-pro.tistory.com/148

- https://huelet.tistory.com/entry/JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0

- https://hoonmaro.tistory.com/19



1. JAVA의 컴파일 과정

(1) Java Compiler(javac 명령어 실행)에 의해 Java Source(.java 확장자)로부터 Byte Code(.class 확장자)가 생성된다.


(2) JVM에 있는 Class Loader에 의해 Byte Code는 JVM내로 로드되고 실행엔진에 의해 기계어로 해석되어 메모리 상(Runtime Data Area)에 배치된다.


(3) 실행엔진에는 Interpreter와 JIT(Just-In-Time) Compiler가 있는데, Interpreter에 의해 Byte Code를 한 줄씩 읽어 실행하다가 적절한 시점에 Byte Code 전체를 컴파일하고 더이상 인터프리팅하지 않고 해당 코드를 직접 실행한다. 


JIT Compiler에 의해 해석된 코드는 캐시에 보관하기 때문에 한 번 컴파일된 후에는 빠르게 수행할 수 있다는 장점이 있습니다. 하지만 코드 전체를 컴파일하기 때문에 인터프리팅하는 것보다 시간이 오래 걸리므로 한 번만 실행해도 되는 코드에 대해서는 인터프리팅하는 것이 유리합니다.

- Interpreter : 자바 Byte Code를 한 줄씩 실행. 전체 성능면에서 불리.

- JIT Compiler : 전체 Byte Code를 컴파일하고 캐시에 보관해놓고 직접 실행. 한 번만 실행해도 되는 코드에 대해서는 Interpreter가 유리.




2. JVM 메모리 구조

(1) Heap Area: new 명령어를 통해 생성된 인스턴스와 배열 등의 참조형 변수 정보가 저장되는 공간입니다. 물론, Method Area에 올라온 클래스들과 관련된 것만 저장됩니다. GC(Garbage Collector)의 대상이 됩니다.


(2) Stack Area: 클래스 내의 메소드에서 사용되는 매개변수, 지역변수, 리턴값 등의 정보들이 저장되는 공간입니다. LIFO(Last In First Out) 방식으로 메소드 실행 시 저장되었다가 실행이 완료되면 제거됩니다. 임시 저장공간으로 생각하시면 됩니다.


(3) Method Area(Class Area 또는 Static Area): 클래스 관련 필드 정보, 메소드 정보, Type 정보(interface인지, class인지에 대한 구분), 상수(constant) pool, static 변수, final class 변수 등의 정보들이 저장되는 공간입니다.


(4) PC Register Area: 쓰레드마다 하나씩 생성되고 JVM 명령의 주소값이 저장되는 공간입니다.


(5) Native Method Stack Area: 자바 외 다른 언어의 호출을 위해 할당되는 영역입니다. 자바에서 C/C++의 메소드를 호출할 때 사용하는 Stack 영역이라고 생각하시면 됩니다.




예를 들어, getList(), insertList(), updateList(), deleteList() 등의 CRUD 메소드가 있는 ListController class가 있을 때 이 클래스와 메소드의 정보는 실행엔진에 의해 Method 영역에 올라가며, 클래스의 메소드 호출이 발생하면 Method 영역의 정보를 읽어 해당 메소드의 매개변수, 지역변수 리턴값 등이 Stack 영역에 올려져 처리됩니다. 그리고 메소드의 실행이 끝나면 Stack 영역으로부터 자동으로 제거됩니다.

만약, 메소드 내에 New 명령어로 생성한 인스턴스나 배열이 있을 경우, 해당 값은 Heap 영역에 저장되고, Stack 영역에는 이 Heap 영역의 값을 참조할 수 있는 메모리 주소값만 저장됩니다. 그래서 배열을 System.out.println(); 하게 되면 메모리 주소값이 출력됩니다.




3. JVM GC

자바에서는 메모리를 명시적으로 지정하여 해제하지 않기 때문에 Heap 영역의 메모리를 관리하는 Garbage Collector의 역할이 중요합니다.


- 자바8 이전의 Heap 영역은 아래의 그림과 같이 크게 세 영역으로 나뉘게 됩니다.

자바8부터는 Permanent 영역(Java Heap 영역 중 하나) 대신에 Metaspace라는 Native 메모리 영역에 저장됩니다.


● New(Young) Generation: 이 영역은 자바 객체가 생성되자마자 저장되고, 생긴지 얼마 안되는 객체가 저장되는 영역입니다. 시간이 지나 우선순위가 낮아지면 Old 영역으로 옮겨집니다. Young 영역으로부터 garbage를 수집하는 것을 Minor GC라고 합니다.

● Old(Tenured) Generation: Young Generation 영역에서 저장되었던 객체 중에 오래된 객체가 이동되어 저장되는 영역입니다. 이 영역으로부터  garbage를 수집하는 것을 Major GC라고 합니다.
● Permanent Generation(자바8부터는 Metaspace): 클래스 로더에 의해 로드되는 클래스, 메소드 등에 대한 meta 정보가 저장되는 영역이며 JVM에 의해 사용됩니다. 리플렉션을 사용하여 동적으로 클래스가 로딩되는 경우에 사용됩니다. 내부적으로 리플렉션 기능을 자주 사용하는 Spring Framework를 이용할 경우 이 영역에 대한 고려가 필요합니다.


<Minor, Major GC>

Heap 영역에 객체가 생성되면 최초로 Eden 영역에 할당됩니다. 그리고 이 영역에 데이터가 어느정도 쌓이게 되면 참조 정도에 따라 Servivor1, Servivor2 중 빈 공간으로 이동되거나 회수됩니다. New Generation(Eden 영역 + Servivor1,2 영역) 영역이 차게 되면 또 참조 정도에 따라 Old영역으로 이동되거나 회수됩니다. 이렇게 New Generation과 Tenured Generation(Old 영역)에서의 GC를 Minor GC 라고 합니다.

 

Old 영역에 할당된 메모리가 허용치를 넘게 되면, Old 영역에 있는 모든 객체들을 검사하여 더이상 참조되지 않는 객체들을 전부 삭제하는 GC가 실행됩니다. 시간이 오래 걸리는 작업이고 이 때 GC를 실행하는 쓰레드를 제외한 모든 쓰레드는 작업을 멈추게 됩니다. 이를 'Stop-the-World' 라 합니다. 그리고 이렇게 'Stop-the-World'가 발생하고 Old영역의 메모리를 회수하는 GC를 Major GC라고 합니다. 앞에서 말한 것과 같이 Major GC가 실행되면 이것이 종료될 때까지 다른 모든 쓰레드가 멈추기 때문에 성능에 영향을 끼칠 수 밖에 없습니다.


<Minor GC vs Major GC vs Full GC>

ㄴ참고: https://plumbr.io/blog/garbage-collection/minor-gc-vs-major-gc-vs-full-gc

1. Collecting garbage from Young space (consisting of Eden and Survivor spaces) is called a Minor GC.

2. Major GC is cleaning the Tenured space.

3. Full GC is cleaning the entire Heap – both Young and Tenured spaces.

  Unfortunately it is a bit more complex and confusing. To start with – many Major GCs are triggered by Minor GCs, so separating the two is impossible in many cases. On the other hand – many modern garbage collections perform cleaning the Tenured space partially, so again, using the term “cleaning” is only partially correct.

This leads us to the point where instead of worrying whether the GC is called Major or Full GC, you should focus to finding out whether the GC at hand stopped all the application threads or was it able to progress concurrently with the application threads.

'IT > Java' 카테고리의 다른 글

상속(Inheritance) 개념  (0) 2018.11.11
Wrapper class 개념  (0) 2018.11.10
== vs equals() 개념  (0) 2018.11.04
try-catch-finally 실행 순서  (0) 2018.10.25
e.printStackTrace()  (0) 2018.07.18

상속(Inheritance)은 IS-A(이즈 어) 관계다.


예) Computer - Notebook 클래스 관계

ㄴNotebook 클래스는 Computer 클래스의 모든 필드/메소드를 상속받는다

ㄴ부모 클래스: Computer

ㄴ자식 클래스: Notebook

ㄴComputer is the superclass(base class or parent class) of Notebook

ㄴNotebook is a subclass(extended class or child class) of Computer 

ㄴ"A Notebook is a Computer" 성립O 

ㄴ"A Computer is a Notebook" 성립X

'IT > Java' 카테고리의 다른 글

JAVA의 컴파일 과정, JVM 메모리 구조, JVM GC 개념  (0) 2018.12.28
Wrapper class 개념  (0) 2018.11.10
== vs equals() 개념  (0) 2018.11.04
try-catch-finally 실행 순서  (0) 2018.10.25
e.printStackTrace()  (0) 2018.07.18

출처

: https://www.baeldung.com/java-wrapper-classes

: http://jusungpark.tistory.com/17

: https://code.i-harness.com/ko-kr/q/20930e




1. 정의: 

wrapper classes are objects encapsulating primitive Java types.

기본형(primitive type)을 객체로 이용될 수 있게 기본형 데이터를 감싼 클래스이다.


2. 종류:

  • primitive type에는 boolean, byte, short, char, int, long, float, double 등 
  • non-primitive type이자, reference type인 wrapper class에는 Boolean, Byte, Short, Character, Integer, Long, Float, Double 등

Boolean, Character, Number는 Object class의 자식에 해당하고

모든 숫자와 관련된 wrapper 클래스(Byte. Short, Integer, Long, Float, Double, BigInteger, BigDecimal)들은 모두 Number class의 자식에 해당한다.


3. wrapper class를 사용하는 이유? 

자바 Collection 인터페이스는 객체만 취급하기 때문에 primitive type을 객체로 boxing(또는 wrapping)하여 사용해야 하는 경우가 있다.  

를 들어, 매개변수로 객체가 요구되는 경우, 기본형이 아닌 객체로 저장해야 하는 경우, 객체간의 비교가 필요한 경우 등에 wrapper class가 쓰인다.



4. Auto Boxing/Unboxing

자바 컴파일러는 기본형 데이터를 자동으로 객체로 변환하여 처리할 수 있는 Auto Boxing을 지원하며,

객체를 자동으로 기본형 데이터로 변환하여 처리할 수 있는 Auto Unboxing을 지원한다.


Object[] objs = new Object[100];
int a = 1;

//Auto Boxing
objs[0] = a;

//Auto Unboxing
int b = (Integer)objs[0];


'IT > Java' 카테고리의 다른 글

JAVA의 컴파일 과정, JVM 메모리 구조, JVM GC 개념  (0) 2018.12.28
상속(Inheritance) 개념  (0) 2018.11.11
== vs equals() 개념  (0) 2018.11.04
try-catch-finally 실행 순서  (0) 2018.10.25
e.printStackTrace()  (0) 2018.07.18

비교 연산자 ==는 primitive 변수 간의 값의 동일여부를 비교하는 것인데, objective 변수끼리 비교하게 되면, 그 객체의 주소값의 동일여부를 비교하게 된다. 

equals() 메소드는 문자열 간의 값의 동일여부를 비교하는 것이다.


'IT > Java' 카테고리의 다른 글

상속(Inheritance) 개념  (0) 2018.11.11
Wrapper class 개념  (0) 2018.11.10
try-catch-finally 실행 순서  (0) 2018.10.25
e.printStackTrace()  (0) 2018.07.18
@builder 관련 내용  (0) 2018.03.08

참고: http://inpiringblog.blogspot.com/2015/07/try-catch-finally.html


try {

// 프로그램 실행 로직


} catch(Exception e) {

// 예외발생 시의 로직


} finally {

/* 

1. 기본 실행 순서:

try문에서 예외가 발생하지 않았으면 catch문은 생략되어 try문이 실행된 이후에 finally문이 실행되고, 

try문에서 예외가 발생했으면 try문, catch문 순서로 실행된 이후에 finally문이 실행된다.

try문이나 catch문 안에 return문 또는 throw문이 있다면, 그 return문 또는 throw문 전까지 로직이 실행된 후 finally문이 실행되고 나서 그 return문 또는 throw문이 실행된다(결론적으로 finally문은 무조건 실행된다).


2. catch문과 finally문 안에 throw문이 있는 경우:

try문에서 예외가 발생했으면, finally문 안에 있는 throw문이 먼저 실행되기 때문에 catch문 안에 있는 throw문은 실행되지 않는다.

*/




}

'IT > Java' 카테고리의 다른 글

Wrapper class 개념  (0) 2018.11.10
== vs equals() 개념  (0) 2018.11.04
e.printStackTrace()  (0) 2018.07.18
@builder 관련 내용  (0) 2018.03.08
String to char[]  (0) 2018.02.24

출처: 

- https://m.blog.naver.com/PostView.nhn?blogId=njk118&logNo=220701895258&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

- http://ukjin.tistory.com/130





1. e.getMessage() vs e.toString() vs e.printStackTrace()

e.getMessage(): error 이벤트와 함께 들어오는 메세지를 출력.


e.toString(): error 이벤트의 toString()을 호출해서 간단한 error 메세지 출력.


e.printStackTrace(): error 메세지의 발생 근원지를 찾아서 단계적으로 error를 출력.


2. log4j에서 e.printStackTrace() 메세지를 log에 남기는 방법

logger.error("some error occured!!", e);


또는


logger.debug("some error occured!!", e);


'IT > Java' 카테고리의 다른 글

== vs equals() 개념  (0) 2018.11.04
try-catch-finally 실행 순서  (0) 2018.10.25
@builder 관련 내용  (0) 2018.03.08
String to char[]  (0) 2018.02.24
Java 환경변수 설정 이유  (0) 2018.02.04

http://hashcode.co.kr/questions/887/%EC%9E%90%EB%B0%94%EC%97%90%EC%84%9C-builder%EB%A5%BC-%EC%93%B0%EB%8A%94-%EC%9D%B4%EC%9C%A0%EB%8A%94-%EB%AD%94%EA%B0%80%EC%9A%94

'IT > Java' 카테고리의 다른 글

try-catch-finally 실행 순서  (0) 2018.10.25
e.printStackTrace()  (0) 2018.07.18
String to char[]  (0) 2018.02.24
Java 환경변수 설정 이유  (0) 2018.02.04
자바 I/O 파일 (made by Petr Mitrichev)  (0) 2018.02.04
String str = "Hello World";
char[] charArray = str.toCharArray();

'IT > Java' 카테고리의 다른 글

e.printStackTrace()  (0) 2018.07.18
@builder 관련 내용  (0) 2018.03.08
Java 환경변수 설정 이유  (0) 2018.02.04
자바 I/O 파일 (made by Petr Mitrichev)  (0) 2018.02.04
애노테이션의 한계  (0) 2018.02.04

출처: http://whitegom.tistory.com/3

Path 설정을 해주게 되면 실행할 파일이 있는 해당 폴더가 아니여도 실행 할 수 있다. 쉽게 예를 들면 메모장의 경우에는 C:\Windows\System32\notepad.exe 경로에 있으나 Path설정이 되어 있기 때문에 해당 폴더로 접근하지 않고, 실행창이나 cmd모드의 창에서 notepad라는 명령어를 입력하면 메모창이 실행된다. 이처럼 환경변수를 설정 하는 이유는 컴퓨터 어떠한 곳이라도 java프로그램을 접근할 수있도록 해주기 위함이다.


JDK를 설치하게 되면 java명령어는 사용이 가능하지만 javac와 같은 명령은 사용이 되지 않는다. JDK를 설치하게 되면 JDK와 JRE 2가지폴더가 설치되게 된다. JDK폴더에는 api와 컴파일러가 설치되고 jre는 자바프로그램 실행을 위한 jvm과 java.exe가 설치된다. jre는 자동으로 Path설정이 되지만 jdk는 자동으로 Path설정이 되지 않는다. 따라서 jdk폴더의 bin을 사용하기 위해서는 Path설정을 해주어야 한다.


'IT > Java' 카테고리의 다른 글

e.printStackTrace()  (0) 2018.07.18
@builder 관련 내용  (0) 2018.03.08
String to char[]  (0) 2018.02.24
자바 I/O 파일 (made by Petr Mitrichev)  (0) 2018.02.04
애노테이션의 한계  (0) 2018.02.04
Java I/O file made by Petr Mitrichev

- 특징 : scanner가 아닌 stream을 이용하기 때문에 성능이 좋다

import java.io.*;
import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
    public static void main(String[] args) {
        InputStream inputStream = System.in;
        OutputStream outputStream = System.out;
        InputReader in = new InputReader(inputStream);
        PrintWriter out = new PrintWriter(outputStream);
        Task solver = new Task();
        solver.solve(1, in, out);
        out.close();
    }
    static class Task {
        public void solve(int testNumber, InputReader in, PrintWriter out) {
        }
    }
    static class InputReader {
        public BufferedReader reader;
        public StringTokenizer tokenizer;
        public InputReader(InputStream stream) {
            reader = new BufferedReader(new InputStreamReader(stream), 32768);
            tokenizer = null;
        }
        public String next() {
            while (tokenizer == null || !tokenizer.hasMoreTokens()) {
                try {
                    tokenizer = new StringTokenizer(reader.readLine());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            return tokenizer.nextToken();
        }
        public int nextInt() {
            return Integer.parseInt(next());
        }
    }
    static void setupInputOutputFile() {
        try {
            System.setIn(new FileInputStream(new File("resources/input.txt")));
            System.setOut(new PrintStream(new File("resources/output.txt")));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


'IT > Java' 카테고리의 다른 글

e.printStackTrace()  (0) 2018.07.18
@builder 관련 내용  (0) 2018.03.08
String to char[]  (0) 2018.02.24
Java 환경변수 설정 이유  (0) 2018.02.04
애노테이션의 한계  (0) 2018.02.04

+ Recent posts