Scanner vs BufferedReader (+ 간단한 GC)

2026. 3. 23. 10:59·우아한 테크 코스 8기

0. 개요

우테코에서 알고리즘 스터디를 시작했다.

여기서도 습관적으로 Scanner 대신 BufferedReader를 사용하고 있었다.

이때, new InputStreamReader나 System.in를 제대로 알 지 못한 채 사용하고 있었다.

이에 대한 궁금증을 해결해보고자 한다.

 

1. 데이터와 문자

입력에 대해서 다룰 때는 데이터와 문자의 기본 지식이 필요하다.

1bit는 0과 1 둘 중 하나이며, 2가지 경우를 표현할 수 있다.

8bit는 2^8가지 경우 (256가지 0-255) 를 표현할 수 있으며, 8bit를 1byte라고 한다.

 

컴퓨터는 2진수 밖에 이해하지 못한다.

10진수를 2진수로 바꾸는 방법은 세상에 존재하지만, 문자를 2진수로 바꾸는 방법은 애초에 존재하지 않는다!

그래서 사람들은 문자를 숫자로 변환하기 위한 표인 아스키 코드를 만들어 사용했다.

특히 한글은 1byte (256)으로 표현하기에 글자가 많아 초창기에는 2byte를 사용했다. (EUC-KR)

그러나 UTF-8 문자 집합이 도입되면서, 3byte로 할당되었다.

 

2. System.in

System.in은 뭘까?

내가 처음 System.in을 접한건, 백준 브론즈 문제를 풀기 위해 Scanner 객체를 생성했을 때이다.

그리고 BufferedReader를 생성할 때도 사용한다.

Scanner scanner = new Scanner(System.in);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

여기서 System.in은 무엇을 의미할까?

System.in의 타입을 확인하면 InputStream임을 확인할 수 있다.

InputStream in = System.in;

그렇다면 System.in의 정체는 InputStream 타입이라는 것인데, 이를 알아보면 될 것 같다.

Stream?

스트림은 데이터의 흐름을 의미한다.

I/O와 프로그램 사이의 스트림 관계

위 사진 처럼 A에서 B로 데이터가 이동할 때의 흐름을 스트림이라고한다.

키보드, 마우스 같은 입력장치가 데이터를 자바프로그램으로 보낼 때 입력 스트림을 사용하고,

자바 프로그램이 데이터를 출력장치로 보낼 때는 출력 스트림을 사용한다.

 

이때, Java에서 가장 기본이 되는 표준 입력 스트림이 InputStream이다.

- InputStream말고도, FileInputStream, ByteArrayInputStream, SocketInputStream등이 있다. 의미는 대충 파일, 바이트 배열, 소켓으로부터 입력 데이터 흐름을 받아온다고 이해하면 될 것이다.

InputStream 사용해보기

public class InputStreamTest {

    public static void main(String[] args) throws IOException {

        InputStream inputStream = System.in;
        int value = inputStream.read();
        System.out.println(value);
    }

}

실제로 실행해보면 결과가 이상한 걸 확인할 수 있다.

1입력
123입력

위에서 두 가지를 알 수 있는데, InputStream.read()는 1 byte만 읽고, 1을 문자 그 자체로 받아들여 '1' -> 49 (아스키 코드)의 int를 반환한다.

때문에, 123에서 1byte인 '1'만 읽어서 49로 반환하는 걸 확인할 수 있는 것이다.

1byte를 기준으로 읽기 때문에 23은 아직 스트림에 남아있게 된다.

InputStream의 문제

이때 InputStream에는 문제가 있는데 1byte로 읽기 때문에, 한글을 인식하지 못한다는 점이다.

우리가 주로 사용하는 UTF-8형식에서는 한글은 3byte로 구성되어있다.

예를 들어 '가'는 234, 176, 128의 1byte값의 조합으로 표현된다.

가-234

그래서 위와 같이 처음 1byte값인 234만 사용하게된다.

 

3. InputStreamReader

Scanner에서 한글 인식 문제가 없는 이유

우리가 사용하는 Scanner에서는 한글을 제대로 인식하지 못하는 문제는 겪어본 적이 없을 것이다!

그 이유는 InputStreamReader 덕분이다.

Scanner 생성자

위와 같이 new Scanner(System.in);을 하게 되면, 자신의 주생성자에 new InputStreamReader(source)를 사용하여 다시 생성자를 호출한다.

InputStreamReader는 어떤 역할을 할까?

InputStreamReader

Java docs에서 설명을 확인해볼 수 있다.

 

InputStreamReader (Java Platform SE 8 )

An InputStreamReader is a bridge from byte streams to character streams: It reads bytes and decodes them into characters using a specified charset. The charset that it uses may be specified by name or may be given explicitly, or the platform's default char

docs.oracle.com

간단히 말하자면 문자를 읽어들이기 위해 1바이트 혹은 그 이상의 바이트를 읽어들인다.

즉, 문자를 온전히 읽을 수 있는 기능을 제공한다.

따라서 바이트 입력 스트림을 문자 입력 스트림으로 전환해주는 Bridge 역할을 한다고 보면된다.

흐름

사용해보기

다음과 같이 InputStream을 InputStreamReader에 넣어준다면 한글을 제대로 읽을 수 있을까?

public class InputStreamTest {

    public static void main(String[] args) throws IOException {
        InputStream inputStream = System.in;
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        int value = inputStreamReader.read();
        System.out.println((char) value);
    }

}

결과

위 사진처럼 3byte짜리 한글 '가'를 제대로 읽는 모습을 알 수 있다.

 

InputStream.read()에는 byte[]를 사용해 데이터를 받아올 수 있었지만,

'문자 입력 스트림'인 InputStreamReader는 char[]를 이용해 데이터를 받아올 수 있다.

public static void main(String[] args) throws IOException {
    InputStream inputStream = System.in;
    InputStreamReader inputStreamReader = new InputStreamReader(inputStream);

    char[] chars = new char[10];
    inputStreamReader.read(chars);

    for (char c : chars) {
        System.out.println((char)c);
    }
}

결과

정리

InputStream은 1byte로 읽어 처리하며 byte[]로 데이터를 받을 수 있다.

InputStreamReader는 문자 단위로 읽어 처리하며 char[]로 데이터를 받을 수 있다.

 

4. Scanner

이제 Scanner에서 nextInt()를 호출하면 어떤 과정을 거치는 지 알아보려고 한다.

실제 Scanner에 정의된 nextInt()는 다음과 같다.

여기서 integerPattern으로 패턴을 설정한다.

private Pattern integerPattern() {
    if (integerPattern == null) {
        integerPattern = patternCache.forName(buildIntegerPatternString());
    }
    return integerPattern;
}

초기에는 설정된 intergerPattern이 없어, buildIntegerPatternString()을 호출하고 그 뒤, 패턴을 그대로 사용한다.

public String next(Pattern pattern) {
    ensureOpen();
    if (pattern == null)
        throw new NullPointerException();

    modCount++;
    // Did we already find this pattern?
    if (hasNextPattern == pattern)
        return getCachedResult();
    clearCaches();

    // Search for the pattern
    while (true) {
        String token = getCompleteTokenInBuffer(pattern);
        if (token != null) {
            matchValid = true;
            skipped = false;
            return token;
        }
        if (needInput)
            readInput();
        else
            throwFor();
    }
}

그리고 이 Pattern은 next()의 파라미터로 넘어가 정규식 검사를 거친 뒤, String을 반환한다.

이때 String이 매번 새롭게 생성되는 문제점이 발생하며, 많은 호출 시, GC를 유발하게 된다. (조금 이따 살펴보도록 하자)

그리고 최종적으로 Integer.parseInt()로 우리가 원하는 입력을 숫자로 바꿔 반환하게 된다.

정리

1. Scanner는 InputStream -> InputStreamReader로 문자 입력 스트림을 받는다.

2. Pattern으로 정규식 검사를 수행 한 뒤, String으로 변환한다.

3. String을 다시 반환 타입에 맞도록 변환한다. (Integer.parseInt, Double.parseDouble)

 

5. BufferedReader

다음으로 BufferedReader를 알아보려고 한다.

BufferedReader역시 InputStreamReader를 스트림으로 받아 사용한다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

겉으로 보기에는 Scanner와 비슷해 보인다. System.in을 InputStreamReader로 넣어주어서 문자 입력 스트림으로 받고자 하는 의도로 보일 수 있다.

그러나 다시 이를 BufferedReader로 넣어주고 있다는 걸 잊지 말아야한다.

BufferedReader가 필요한 이유

Scanner와 InputStreamReader를 설명할 때 '문자열'이 아닌 '문자'를 처리한다고 했다.

InputStreamReader로 byte가 아닌 char로 받아올 수 있도록 개선했지만, 우리는 실제로 문자열 위주의 입력을 다룬다.

InputStreamReader로 문자열을 받아오기 위해서는 계속 char[]를 선언해주어야하며, 문자열의 길이가 가변적이라면 더욱 불편해진다.

 

따라서 버퍼를 사용하여, 입력받은 문자를 쌓아서 문자열처럼 처리해버리는 것이다.

실제로 br.readLine()을 통해, 한 줄을 통째로 읽어서 String으로 반환하는 걸 자주 겪어봤을 것이다. 즉, char[]배열을 하나하나 생성하는 것보다 String으로 바로 받아오는 것이다.

장점

버퍼를 사용하면 우선 정규식 검사를 할 필요가 없다.

기존에는 읽어온 char[]를 정규식 검사한 뒤, 처리했다면

br.readLine()은 말 그대로 문자열 한 줄을 통째로 읽어오기 때문에 정규식 검사를 할 필요가 없어진다.

이 덕분에 Scanner에 비해 성능이 좋을 수 밖에 없다.

 

6. Scanner와 BufferedReader 성능 비교하기

이론적으로 Scanner가 BufferedReader보다 느리다! 를 말하기 보다는 직접 실험을 하여, 증명해보는 게 좋을 것이다.

이를 위해 우선 테스트용 데이터를 생성하겠다

테스트용 읽기 파일 생성

public class DataGenerator {
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter("input.txt"));
        Random rd = new Random();
        int dataSize = 10_000_000; // 1,000만 개

        for (int i = 0; i < dataSize; i++) {
            bw.write(rd.nextInt(100) + " ");
            if (i % 100 == 0) bw.newLine();
        }
        bw.flush();
        bw.close();
        System.out.println("데이터 생성 완료: input.txt");
    }
}

1000만개의 랜덤 숫자를 가지는 input.txt를 생성했고, 이를 각각 Scanner와 BufferedReader가 모두 읽는 데 걸리는 시간을 비교해보겠다.

코드

비교를 위한 코드는 gemini에게 부탁했다.

public class PerformanceTest {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

        InputStream in = System.in;

        final String FILE_PATH = "input.txt";

        // 1. Scanner 테스트
        long start1 = System.nanoTime();
        testScanner(FILE_PATH);
        long end1 = System.nanoTime();
        printResult("Scanner", start1, end1);

        // 2. BufferedReader + String.split() 테스트
        long start2 = System.nanoTime();
        testBufferedReaderSplit(FILE_PATH);
        long end2 = System.nanoTime();
        printResult("BR + String.split", start2, end2);

        // 3. BufferedReader + StringTokenizer 테스트
        long start3 = System.nanoTime();
        testBufferedReaderTokenizer(FILE_PATH);
        long end3 = System.nanoTime();
        printResult("BR + StringTokenizer", start3, end3);
    }

    private static void printResult(String label, long start, long end) {
        double milliseconds = (end - start) / 1_000_000.0;
        System.out.printf("%-25s: %10.3f ms\n", label, milliseconds);
    }

    private static void testScanner(String path) throws FileNotFoundException {
        InputStream in = System.in;
        try (Scanner sc = new Scanner(new FileInputStream(path))) {
            while (sc.hasNextInt()) {
                int val = sc.nextInt();
            }
        }
    }

    private static void testBufferedReaderSplit(String path) throws IOException {
        try (BufferedReader br = new BufferedReader(new FileReader(path))) {
            String line;
            while ((line = br.readLine()) != null) {
                String[] tokens = line.split(" ");
                for (String token : tokens) {
                    if (!token.isEmpty()) {
                        int val = Integer.parseInt(token);
                    }
                }
            }
        }
    }

    private static void testBufferedReaderTokenizer(String path) throws IOException {
        try (BufferedReader br = new BufferedReader(new FileReader(path))) {
            String line;
            while ((line = br.readLine()) != null) {
                StringTokenizer st = new StringTokenizer(line);
                while (st.hasMoreTokens()) {
                    int val = Integer.parseInt(st.nextToken());
                }
            }
        }
    }
}

이를 실행하면?

Scanner와 BufferedReader의 성능 차이가 매우 많이 나는 것을 확인할 수 있다.

Scanner.nextInt()는 불필요할정도로 정교한 정규식 검사를 수행하고, 버퍼가 없어, 계속 입력 장치로 부터 입력 신호를 요청하는 과정을 반복하기때문에 시간이 오래 걸린다. 즉, 시스템 콜을 계속 요청하게 된다. (윈도우 환경이라 System Call 호출을 관찰하기 어렵다... 이 부분은 추후 도전해보려고 한다.)

 

7. GC 과정 확인해보기

위에서 잠깐 언급했는데 Scanner는 Pattern을 String으로 변환하여 새로운 String이 계속 생성된다.

1000만개의 랜덤 데이터를 계속 읽는데 GC는 과연 몇번 발생하게 될까?

java -Xlog:gc*

다음 명령어를 사용하여, gc에 대한 로그를 출력할 수 있다.

로그를 모두 복사해 붙여넣었지만, 너무 길어 접어놓겠다.

더보기
더보기
$ java -Xlog:gc* -cp build/classes/java/main pratice.test01.PerformanceTest
[0.009s][info][gc] Using G1
[0.011s][info][gc,init] Version: 17.0.12+8-LTS-286 (release)
[0.011s][info][gc,init] CPUs: 8 total, 8 available
[0.011s][info][gc,init] Memory: 32264M
[0.011s][info][gc,init] Large Page Support: Disabled
[0.012s][info][gc,init] NUMA Support: Disabled
[0.012s][info][gc,init] Compressed Oops: Enabled (Zero based)
[0.012s][info][gc,init] Heap Region Size: 4M
[0.012s][info][gc,init] Heap Min Capacity: 8M
[0.012s][info][gc,init] Heap Initial Capacity: 508M
[0.012s][info][gc,init] Heap Max Capacity: 8068M
[0.012s][info][gc,init] Pre-touch: Disabled
[0.012s][info][gc,init] Parallel Workers: 8
[0.012s][info][gc,init] Concurrent Workers: 2
[0.012s][info][gc,init] Concurrent Refinement Workers: 8
[0.012s][info][gc,init] Periodic GC: Disabled
[0.018s][info][gc,metaspace] CDS archive(s) mapped at: [0x000001f25b000000-0x000001f25bbd0000-0x000001f25bbd0000), size 12386304, SharedBaseAddress: 0x000001f25b000000, ArchiveRelocationMode: 1.
[0.019s][info][gc,metaspace] Compressed class space mapped at: 0x000001f25c000000-0x000001f29c000000, reserved size: 1073741824
[0.019s][info][gc,metaspace] Narrow klass base: 0x000001f25b000000, Narrow klass shift: 0, Narrow klass range: 0x100000000
[0.105s][info][gc,start    ] GC(0) Pause Young (Normal) (G1 Evacuation Pause)
[0.106s][info][gc,task     ] GC(0) Using 8 workers of 8 for evacuation
[0.108s][info][gc,phases   ] GC(0)   Pre Evacuate Collection Set: 0.1ms
[0.108s][info][gc,phases   ] GC(0)   Merge Heap Roots: 0.1ms
[0.108s][info][gc,phases   ] GC(0)   Evacuate Collection Set: 1.0ms
[0.108s][info][gc,phases   ] GC(0)   Post Evacuate Collection Set: 0.3ms
[0.108s][info][gc,phases   ] GC(0)   Other: 0.8ms
[0.108s][info][gc,heap     ] GC(0) Eden regions: 6->0(11)
[0.109s][info][gc,heap     ] GC(0) Survivor regions: 0->1(1)
[0.109s][info][gc,heap     ] GC(0) Old regions: 0->0
[0.109s][info][gc,heap     ] GC(0) Archive regions: 0->0
[0.109s][info][gc,heap     ] GC(0) Humongous regions: 0->0
[0.109s][info][gc,metaspace] GC(0) Metaspace: 508K(704K)->508K(704K) NonClass: 476K(576K)->476K(576K) Class: 31K(128K)->31K(128K)
[0.109s][info][gc          ] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 24M->1M(508M) 3.792ms
[0.109s][info][gc,cpu      ] GC(0) User=0.00s Sys=0.00s Real=0.00s
[0.138s][info][gc,start    ] GC(1) Pause Young (Normal) (G1 Evacuation Pause)
[0.139s][info][gc,task     ] GC(1) Using 8 workers of 8 for evacuation
[0.140s][info][gc,phases   ] GC(1)   Pre Evacuate Collection Set: 0.1ms
[0.140s][info][gc,phases   ] GC(1)   Merge Heap Roots: 0.1ms
[0.141s][info][gc,phases   ] GC(1)   Evacuate Collection Set: 1.0ms
[0.141s][info][gc,phases   ] GC(1)   Post Evacuate Collection Set: 0.2ms
[0.141s][info][gc,phases   ] GC(1)   Other: 0.7ms
[0.141s][info][gc,heap     ] GC(1) Eden regions: 11->0(75)
[0.141s][info][gc,heap     ] GC(1) Survivor regions: 1->1(2)
[0.141s][info][gc,heap     ] GC(1) Old regions: 0->0
[0.142s][info][gc,heap     ] GC(1) Archive regions: 0->0
[0.142s][info][gc,heap     ] GC(1) Humongous regions: 0->0
[0.142s][info][gc,metaspace] GC(1) Metaspace: 531K(704K)->531K(704K) NonClass: 499K(576K)->499K(576K) Class: 31K(128K)->31K(128K)
[0.143s][info][gc          ] GC(1) Pause Young (Normal) (G1 Evacuation Pause) 45M->1M(508M) 4.462ms
[0.143s][info][gc,cpu      ] GC(1) User=0.00s Sys=0.00s Real=0.01s
[0.266s][info][gc,start    ] GC(2) Pause Young (Normal) (G1 Evacuation Pause)
[0.266s][info][gc,task     ] GC(2) Using 8 workers of 8 for evacuation
[0.268s][info][gc,phases   ] GC(2)   Pre Evacuate Collection Set: 0.1ms
[0.268s][info][gc,phases   ] GC(2)   Merge Heap Roots: 0.1ms
[0.268s][info][gc,phases   ] GC(2)   Evacuate Collection Set: 0.9ms
[0.268s][info][gc,phases   ] GC(2)   Post Evacuate Collection Set: 0.3ms
[0.268s][info][gc,phases   ] GC(2)   Other: 0.4ms
[0.268s][info][gc,heap     ] GC(2) Eden regions: 75->0(75)
[0.268s][info][gc,heap     ] GC(2) Survivor regions: 1->1(10)
[0.268s][info][gc,heap     ] GC(2) Old regions: 0->0
[0.268s][info][gc,heap     ] GC(2) Archive regions: 0->0
[0.269s][info][gc,heap     ] GC(2) Humongous regions: 0->0
[0.269s][info][gc,metaspace] GC(2) Metaspace: 555K(704K)->555K(704K) NonClass: 523K(576K)->523K(576K) Class: 31K(128K)->31K(128K)
[0.269s][info][gc          ] GC(2) Pause Young (Normal) (G1 Evacuation Pause) 301M->1M(508M) 2.809ms
[0.269s][info][gc,cpu      ] GC(2) User=0.00s Sys=0.02s Real=0.00s
[0.335s][info][gc,start    ] GC(3) Pause Young (Normal) (G1 Evacuation Pause)
[0.335s][info][gc,task     ] GC(3) Using 8 workers of 8 for evacuation
[0.337s][info][gc,phases   ] GC(3)   Pre Evacuate Collection Set: 0.1ms
[0.337s][info][gc,phases   ] GC(3)   Merge Heap Roots: 0.1ms
[0.337s][info][gc,phases   ] GC(3)   Evacuate Collection Set: 1.1ms
[0.337s][info][gc,phases   ] GC(3)   Post Evacuate Collection Set: 0.3ms
[0.337s][info][gc,phases   ] GC(3)   Other: 0.4ms
[0.337s][info][gc,heap     ] GC(3) Eden regions: 75->0(75)
[0.338s][info][gc,heap     ] GC(3) Survivor regions: 1->1(10)
[0.338s][info][gc,heap     ] GC(3) Old regions: 0->0
[0.338s][info][gc,heap     ] GC(3) Archive regions: 0->0
[0.338s][info][gc,heap     ] GC(3) Humongous regions: 0->0
[0.338s][info][gc,metaspace] GC(3) Metaspace: 557K(704K)->557K(704K) NonClass: 526K(576K)->526K(576K) Class: 31K(128K)->31K(128K)
[0.338s][info][gc          ] GC(3) Pause Young (Normal) (G1 Evacuation Pause) 301M->1M(508M) 3.390ms
[0.338s][info][gc,cpu      ] GC(3) User=0.00s Sys=0.00s Real=0.00s
[0.404s][info][gc,start    ] GC(4) Pause Young (Normal) (G1 Evacuation Pause)
[0.404s][info][gc,task     ] GC(4) Using 8 workers of 8 for evacuation
[0.406s][info][gc,phases   ] GC(4)   Pre Evacuate Collection Set: 0.1ms
[0.407s][info][gc,phases   ] GC(4)   Merge Heap Roots: 0.1ms
[0.407s][info][gc,phases   ] GC(4)   Evacuate Collection Set: 1.0ms
[0.407s][info][gc,phases   ] GC(4)   Post Evacuate Collection Set: 0.5ms
[0.407s][info][gc,phases   ] GC(4)   Other: 1.0ms
[0.407s][info][gc,heap     ] GC(4) Eden regions: 75->0(90)
[0.408s][info][gc,heap     ] GC(4) Survivor regions: 1->1(10)
[0.408s][info][gc,heap     ] GC(4) Old regions: 0->0
[0.408s][info][gc,heap     ] GC(4) Archive regions: 0->0
[0.408s][info][gc,heap     ] GC(4) Humongous regions: 0->0
[0.408s][info][gc,metaspace] GC(4) Metaspace: 557K(704K)->557K(704K) NonClass: 526K(576K)->526K(576K) Class: 31K(128K)->31K(128K)
[0.409s][info][gc          ] GC(4) Pause Young (Normal) (G1 Evacuation Pause) 301M->1M(612M) 4.845ms
[0.409s][info][gc,cpu      ] GC(4) User=0.02s Sys=0.00s Real=0.01s
[0.498s][info][gc,start    ] GC(5) Pause Young (Normal) (G1 Evacuation Pause)
[0.498s][info][gc,task     ] GC(5) Using 8 workers of 8 for evacuation
[0.500s][info][gc,phases   ] GC(5)   Pre Evacuate Collection Set: 0.1ms
[0.500s][info][gc,phases   ] GC(5)   Merge Heap Roots: 0.1ms
[0.500s][info][gc,phases   ] GC(5)   Evacuate Collection Set: 0.9ms
[0.500s][info][gc,phases   ] GC(5)   Post Evacuate Collection Set: 0.4ms
[0.500s][info][gc,phases   ] GC(5)   Other: 0.5ms
[0.500s][info][gc,heap     ] GC(5) Eden regions: 90->0(90)
[0.501s][info][gc,heap     ] GC(5) Survivor regions: 1->1(12)
[0.501s][info][gc,heap     ] GC(5) Old regions: 0->0
[0.501s][info][gc,heap     ] GC(5) Archive regions: 0->0
[0.501s][info][gc,heap     ] GC(5) Humongous regions: 0->0
[0.501s][info][gc,metaspace] GC(5) Metaspace: 557K(704K)->557K(704K) NonClass: 526K(576K)->526K(576K) Class: 31K(128K)->31K(128K)
[0.501s][info][gc          ] GC(5) Pause Young (Normal) (G1 Evacuation Pause) 361M->1M(612M) 2.933ms
[0.501s][info][gc,cpu      ] GC(5) User=0.00s Sys=0.00s Real=0.00s
[0.578s][info][gc,start    ] GC(6) Pause Young (Normal) (G1 Evacuation Pause)
[0.578s][info][gc,task     ] GC(6) Using 8 workers of 8 for evacuation
[0.579s][info][gc,phases   ] GC(6)   Pre Evacuate Collection Set: 0.1ms
[0.579s][info][gc,phases   ] GC(6)   Merge Heap Roots: 0.1ms
[0.579s][info][gc,phases   ] GC(6)   Evacuate Collection Set: 0.6ms
[0.580s][info][gc,phases   ] GC(6)   Post Evacuate Collection Set: 0.3ms
[0.580s][info][gc,phases   ] GC(6)   Other: 0.4ms
[0.580s][info][gc,heap     ] GC(6) Eden regions: 90->0(90)
[0.580s][info][gc,heap     ] GC(6) Survivor regions: 1->1(12)
[0.580s][info][gc,heap     ] GC(6) Old regions: 0->0
[0.580s][info][gc,heap     ] GC(6) Archive regions: 0->0
[0.580s][info][gc,heap     ] GC(6) Humongous regions: 0->0
[0.581s][info][gc,metaspace] GC(6) Metaspace: 557K(704K)->557K(704K) NonClass: 526K(576K)->526K(576K) Class: 31K(128K)->31K(128K)
[0.581s][info][gc          ] GC(6) Pause Young (Normal) (G1 Evacuation Pause) 361M->0M(612M) 2.976ms
[0.581s][info][gc,cpu      ] GC(6) User=0.00s Sys=0.00s Real=0.00s
[0.663s][info][gc,start    ] GC(7) Pause Young (Normal) (G1 Evacuation Pause)
[0.663s][info][gc,task     ] GC(7) Using 8 workers of 8 for evacuation
[0.664s][info][gc,phases   ] GC(7)   Pre Evacuate Collection Set: 0.1ms
[0.664s][info][gc,phases   ] GC(7)   Merge Heap Roots: 0.1ms
[0.664s][info][gc,phases   ] GC(7)   Evacuate Collection Set: 0.6ms
[0.664s][info][gc,phases   ] GC(7)   Post Evacuate Collection Set: 0.2ms
[0.665s][info][gc,phases   ] GC(7)   Other: 0.4ms
[0.665s][info][gc,heap     ] GC(7) Eden regions: 90->0(90)
[0.665s][info][gc,heap     ] GC(7) Survivor regions: 1->1(12)
[0.665s][info][gc,heap     ] GC(7) Old regions: 0->0
[0.665s][info][gc,heap     ] GC(7) Archive regions: 0->0
[0.665s][info][gc,heap     ] GC(7) Humongous regions: 0->0
[0.665s][info][gc,metaspace] GC(7) Metaspace: 557K(704K)->557K(704K) NonClass: 526K(576K)->526K(576K) Class: 31K(128K)->31K(128K)
[0.665s][info][gc          ] GC(7) Pause Young (Normal) (G1 Evacuation Pause) 360M->0M(612M) 2.840ms
[0.666s][info][gc,cpu      ] GC(7) User=0.00s Sys=0.00s Real=0.00s
[0.747s][info][gc,start    ] GC(8) Pause Young (Normal) (G1 Evacuation Pause)
[0.747s][info][gc,task     ] GC(8) Using 8 workers of 8 for evacuation
[0.749s][info][gc,phases   ] GC(8)   Pre Evacuate Collection Set: 0.1ms
[0.749s][info][gc,phases   ] GC(8)   Merge Heap Roots: 0.1ms
[0.749s][info][gc,phases   ] GC(8)   Evacuate Collection Set: 0.6ms
[0.749s][info][gc,phases   ] GC(8)   Post Evacuate Collection Set: 0.3ms
[0.749s][info][gc,phases   ] GC(8)   Other: 0.8ms
[0.749s][info][gc,heap     ] GC(8) Eden regions: 90->0(90)
[0.749s][info][gc,heap     ] GC(8) Survivor regions: 1->1(12)
[0.749s][info][gc,heap     ] GC(8) Old regions: 0->0
[0.749s][info][gc,heap     ] GC(8) Archive regions: 0->0
[0.750s][info][gc,heap     ] GC(8) Humongous regions: 0->0
[0.750s][info][gc,metaspace] GC(8) Metaspace: 557K(704K)->557K(704K) NonClass: 526K(576K)->526K(576K) Class: 31K(128K)->31K(128K)
[0.750s][info][gc          ] GC(8) Pause Young (Normal) (G1 Evacuation Pause) 360M->0M(612M) 2.942ms
[0.750s][info][gc,cpu      ] GC(8) User=0.00s Sys=0.00s Real=0.00s
[0.829s][info][gc,start    ] GC(9) Pause Young (Normal) (G1 Evacuation Pause)
[0.829s][info][gc,task     ] GC(9) Using 8 workers of 8 for evacuation
[0.831s][info][gc,phases   ] GC(9)   Pre Evacuate Collection Set: 0.1ms
[0.831s][info][gc,phases   ] GC(9)   Merge Heap Roots: 0.1ms
[0.831s][info][gc,phases   ] GC(9)   Evacuate Collection Set: 0.7ms
[0.831s][info][gc,phases   ] GC(9)   Post Evacuate Collection Set: 0.6ms
[0.831s][info][gc,phases   ] GC(9)   Other: 0.5ms
[0.831s][info][gc,heap     ] GC(9) Eden regions: 90->0(109)
[0.832s][info][gc,heap     ] GC(9) Survivor regions: 1->1(12)
[0.832s][info][gc,heap     ] GC(9) Old regions: 0->0
[0.832s][info][gc,heap     ] GC(9) Archive regions: 0->0
[0.832s][info][gc,heap     ] GC(9) Humongous regions: 0->0
[0.832s][info][gc,metaspace] GC(9) Metaspace: 557K(704K)->557K(704K) NonClass: 526K(576K)->526K(576K) Class: 31K(128K)->31K(128K)
[0.832s][info][gc          ] GC(9) Pause Young (Normal) (G1 Evacuation Pause) 360M->1M(736M) 3.232ms
[0.832s][info][gc,cpu      ] GC(9) User=0.02s Sys=0.00s Real=0.00s
[0.946s][info][gc,start    ] GC(10) Pause Young (Normal) (G1 Evacuation Pause)
[0.947s][info][gc,task     ] GC(10) Using 8 workers of 8 for evacuation
[0.949s][info][gc,phases   ] GC(10)   Pre Evacuate Collection Set: 0.1ms
[0.950s][info][gc,phases   ] GC(10)   Merge Heap Roots: 0.1ms
[0.950s][info][gc,phases   ] GC(10)   Evacuate Collection Set: 0.6ms
[0.950s][info][gc,phases   ] GC(10)   Post Evacuate Collection Set: 0.2ms
[0.950s][info][gc,phases   ] GC(10)   Other: 2.0ms
[0.950s][info][gc,heap     ] GC(10) Eden regions: 109->0(109)
[0.950s][info][gc,heap     ] GC(10) Survivor regions: 1->1(14)
[0.950s][info][gc,heap     ] GC(10) Old regions: 0->0
[0.950s][info][gc,heap     ] GC(10) Archive regions: 0->0
[0.950s][info][gc,heap     ] GC(10) Humongous regions: 0->0
[0.950s][info][gc,metaspace] GC(10) Metaspace: 557K(704K)->557K(704K) NonClass: 526K(576K)->526K(576K) Class: 31K(128K)->31K(128K)
[0.951s][info][gc          ] GC(10) Pause Young (Normal) (G1 Evacuation Pause) 437M->0M(736M) 4.168ms
[0.951s][info][gc,cpu      ] GC(10) User=0.00s Sys=0.00s Real=0.00s
[1.046s][info][gc,start    ] GC(11) Pause Young (Normal) (G1 Evacuation Pause)
[1.047s][info][gc,task     ] GC(11) Using 8 workers of 8 for evacuation
[1.048s][info][gc,phases   ] GC(11)   Pre Evacuate Collection Set: 0.1ms
[1.048s][info][gc,phases   ] GC(11)   Merge Heap Roots: 0.1ms
[1.048s][info][gc,phases   ] GC(11)   Evacuate Collection Set: 0.6ms
[1.048s][info][gc,phases   ] GC(11)   Post Evacuate Collection Set: 0.4ms
[1.049s][info][gc,phases   ] GC(11)   Other: 0.8ms
[1.049s][info][gc,heap     ] GC(11) Eden regions: 109->0(109)
[1.049s][info][gc,heap     ] GC(11) Survivor regions: 1->1(14)
[1.049s][info][gc,heap     ] GC(11) Old regions: 0->0
[1.049s][info][gc,heap     ] GC(11) Archive regions: 0->0
[1.049s][info][gc,heap     ] GC(11) Humongous regions: 0->0
[1.049s][info][gc,metaspace] GC(11) Metaspace: 557K(704K)->557K(704K) NonClass: 526K(576K)->526K(576K) Class: 31K(128K)->31K(128K)
[1.049s][info][gc          ] GC(11) Pause Young (Normal) (G1 Evacuation Pause) 436M->0M(736M) 3.351ms
[1.050s][info][gc,cpu      ] GC(11) User=0.00s Sys=0.00s Real=0.00s
[1.143s][info][gc,start    ] GC(12) Pause Young (Normal) (G1 Evacuation Pause)
[1.143s][info][gc,task     ] GC(12) Using 8 workers of 8 for evacuation
[1.145s][info][gc,phases   ] GC(12)   Pre Evacuate Collection Set: 0.1ms
[1.145s][info][gc,phases   ] GC(12)   Merge Heap Roots: 0.1ms
[1.145s][info][gc,phases   ] GC(12)   Evacuate Collection Set: 0.6ms
[1.145s][info][gc,phases   ] GC(12)   Post Evacuate Collection Set: 0.4ms
[1.145s][info][gc,phases   ] GC(12)   Other: 0.6ms
[1.145s][info][gc,heap     ] GC(12) Eden regions: 109->0(109)
[1.145s][info][gc,heap     ] GC(12) Survivor regions: 1->1(14)
[1.146s][info][gc,heap     ] GC(12) Old regions: 0->0
[1.146s][info][gc,heap     ] GC(12) Archive regions: 0->0
[1.146s][info][gc,heap     ] GC(12) Humongous regions: 0->0
[1.146s][info][gc,metaspace] GC(12) Metaspace: 557K(704K)->557K(704K) NonClass: 526K(576K)->526K(576K) Class: 31K(128K)->31K(128K)
[1.146s][info][gc          ] GC(12) Pause Young (Normal) (G1 Evacuation Pause) 436M->0M(736M) 3.225ms
[1.146s][info][gc,cpu      ] GC(12) User=0.02s Sys=0.00s Real=0.00s
[1.240s][info][gc,start    ] GC(13) Pause Young (Normal) (G1 Evacuation Pause)
[1.241s][info][gc,task     ] GC(13) Using 8 workers of 8 for evacuation
[1.242s][info][gc,phases   ] GC(13)   Pre Evacuate Collection Set: 0.1ms
[1.242s][info][gc,phases   ] GC(13)   Merge Heap Roots: 0.2ms
[1.242s][info][gc,phases   ] GC(13)   Evacuate Collection Set: 0.6ms
[1.243s][info][gc,phases   ] GC(13)   Post Evacuate Collection Set: 0.2ms
[1.243s][info][gc,phases   ] GC(13)   Other: 0.7ms
[1.243s][info][gc,heap     ] GC(13) Eden regions: 109->0(109)
[1.243s][info][gc,heap     ] GC(13) Survivor regions: 1->1(14)
[1.244s][info][gc,heap     ] GC(13) Old regions: 0->0
[1.244s][info][gc,heap     ] GC(13) Archive regions: 0->0
[1.244s][info][gc,heap     ] GC(13) Humongous regions: 0->0
[1.244s][info][gc,metaspace] GC(13) Metaspace: 557K(704K)->557K(704K) NonClass: 526K(576K)->526K(576K) Class: 31K(128K)->31K(128K)
[1.244s][info][gc          ] GC(13) Pause Young (Normal) (G1 Evacuation Pause) 436M->0M(736M) 3.519ms
[1.244s][info][gc,cpu      ] GC(13) User=0.00s Sys=0.00s Real=0.00s
[1.339s][info][gc,start    ] GC(14) Pause Young (Normal) (G1 Evacuation Pause)
[1.339s][info][gc,task     ] GC(14) Using 8 workers of 8 for evacuation
[1.341s][info][gc,phases   ] GC(14)   Pre Evacuate Collection Set: 0.1ms
[1.341s][info][gc,phases   ] GC(14)   Merge Heap Roots: 0.1ms
[1.341s][info][gc,phases   ] GC(14)   Evacuate Collection Set: 0.6ms
[1.341s][info][gc,phases   ] GC(14)   Post Evacuate Collection Set: 0.3ms
[1.341s][info][gc,phases   ] GC(14)   Other: 0.6ms
[1.341s][info][gc,heap     ] GC(14) Eden regions: 109->0(109)
[1.341s][info][gc,heap     ] GC(14) Survivor regions: 1->1(14)
[1.342s][info][gc,heap     ] GC(14) Old regions: 0->0
[1.342s][info][gc,heap     ] GC(14) Archive regions: 0->0
[1.342s][info][gc,heap     ] GC(14) Humongous regions: 0->0
[1.342s][info][gc,metaspace] GC(14) Metaspace: 557K(704K)->557K(704K) NonClass: 526K(576K)->526K(576K) Class: 31K(128K)->31K(128K)
[1.342s][info][gc          ] GC(14) Pause Young (Normal) (G1 Evacuation Pause) 436M->0M(736M) 3.104ms
[1.342s][info][gc,cpu      ] GC(14) User=0.00s Sys=0.00s Real=0.00s
[1.435s][info][gc,start    ] GC(15) Pause Young (Normal) (G1 Evacuation Pause)
[1.435s][info][gc,task     ] GC(15) Using 8 workers of 8 for evacuation
[1.437s][info][gc,phases   ] GC(15)   Pre Evacuate Collection Set: 0.1ms
[1.437s][info][gc,phases   ] GC(15)   Merge Heap Roots: 0.0ms
[1.437s][info][gc,phases   ] GC(15)   Evacuate Collection Set: 0.7ms
[1.437s][info][gc,phases   ] GC(15)   Post Evacuate Collection Set: 0.3ms
[1.437s][info][gc,phases   ] GC(15)   Other: 0.3ms
[1.437s][info][gc,heap     ] GC(15) Eden regions: 109->0(109)
[1.437s][info][gc,heap     ] GC(15) Survivor regions: 1->1(14)
[1.437s][info][gc,heap     ] GC(15) Old regions: 0->1
[1.437s][info][gc,heap     ] GC(15) Archive regions: 0->0
[1.437s][info][gc,heap     ] GC(15) Humongous regions: 0->0
[1.437s][info][gc,metaspace] GC(15) Metaspace: 557K(704K)->557K(704K) NonClass: 526K(576K)->526K(576K) Class: 31K(128K)->31K(128K)
[1.437s][info][gc          ] GC(15) Pause Young (Normal) (G1 Evacuation Pause) 436M->1M(736M) 2.304ms
[1.438s][info][gc,cpu      ] GC(15) User=0.00s Sys=0.00s Real=0.00s
[1.550s][info][gc,start    ] GC(16) Pause Young (Normal) (G1 Evacuation Pause)
[1.550s][info][gc,task     ] GC(16) Using 8 workers of 8 for evacuation
[1.550s][info][gc,phases   ] GC(16)   Pre Evacuate Collection Set: 0.0ms
[1.551s][info][gc,phases   ] GC(16)   Merge Heap Roots: 0.1ms
[1.551s][info][gc,phases   ] GC(16)   Evacuate Collection Set: 0.1ms
[1.551s][info][gc,phases   ] GC(16)   Post Evacuate Collection Set: 0.2ms
[1.551s][info][gc,phases   ] GC(16)   Other: 0.4ms
[1.551s][info][gc,heap     ] GC(16) Eden regions: 109->0(109)
[1.551s][info][gc,heap     ] GC(16) Survivor regions: 1->1(14)
[1.551s][info][gc,heap     ] GC(16) Old regions: 1->1
[1.551s][info][gc,heap     ] GC(16) Archive regions: 0->0
[1.552s][info][gc,heap     ] GC(16) Humongous regions: 0->0
[1.552s][info][gc,metaspace] GC(16) Metaspace: 557K(704K)->557K(704K) NonClass: 526K(576K)->526K(576K) Class: 31K(128K)->31K(128K)
[1.552s][info][gc          ] GC(16) Pause Young (Normal) (G1 Evacuation Pause) 437M->0M(736M) 2.271ms
[1.552s][info][gc,cpu      ] GC(16) User=0.00s Sys=0.00s Real=0.00s
[1.664s][info][gc,start    ] GC(17) Pause Young (Normal) (G1 Evacuation Pause)
[1.664s][info][gc,task     ] GC(17) Using 8 workers of 8 for evacuation
[1.665s][info][gc,phases   ] GC(17)   Pre Evacuate Collection Set: 0.1ms
[1.665s][info][gc,phases   ] GC(17)   Merge Heap Roots: 0.1ms
[1.666s][info][gc,phases   ] GC(17)   Evacuate Collection Set: 0.1ms
[1.666s][info][gc,phases   ] GC(17)   Post Evacuate Collection Set: 0.4ms
[1.666s][info][gc,phases   ] GC(17)   Other: 0.6ms
[1.666s][info][gc,heap     ] GC(17) Eden regions: 109->0(109)
[1.666s][info][gc,heap     ] GC(17) Survivor regions: 1->1(14)
[1.666s][info][gc,heap     ] GC(17) Old regions: 1->1
[1.666s][info][gc,heap     ] GC(17) Archive regions: 0->0
[1.666s][info][gc,heap     ] GC(17) Humongous regions: 0->0
[1.667s][info][gc,metaspace] GC(17) Metaspace: 557K(704K)->557K(704K) NonClass: 526K(576K)->526K(576K) Class: 31K(128K)->31K(128K)
[1.667s][info][gc          ] GC(17) Pause Young (Normal) (G1 Evacuation Pause) 436M->0M(736M) 2.845ms
[1.667s][info][gc,cpu      ] GC(17) User=0.00s Sys=0.00s Real=0.00s
[1.785s][info][gc,start    ] GC(18) Pause Young (Normal) (G1 Evacuation Pause)
[1.785s][info][gc,task     ] GC(18) Using 8 workers of 8 for evacuation
[1.785s][info][gc,phases   ] GC(18)   Pre Evacuate Collection Set: 0.1ms
[1.785s][info][gc,phases   ] GC(18)   Merge Heap Roots: 0.1ms
[1.786s][info][gc,phases   ] GC(18)   Evacuate Collection Set: 0.1ms
[1.786s][info][gc,phases   ] GC(18)   Post Evacuate Collection Set: 0.2ms
[1.786s][info][gc,phases   ] GC(18)   Other: 0.4ms
[1.786s][info][gc,heap     ] GC(18) Eden regions: 109->0(109)
[1.786s][info][gc,heap     ] GC(18) Survivor regions: 1->1(14)
[1.786s][info][gc,heap     ] GC(18) Old regions: 1->1
[1.786s][info][gc,heap     ] GC(18) Archive regions: 0->0
[1.786s][info][gc,heap     ] GC(18) Humongous regions: 0->0
[1.786s][info][gc,metaspace] GC(18) Metaspace: 557K(704K)->557K(704K) NonClass: 526K(576K)->526K(576K) Class: 31K(128K)->31K(128K)
[1.786s][info][gc          ] GC(18) Pause Young (Normal) (G1 Evacuation Pause) 436M->0M(736M) 1.672ms
[1.786s][info][gc,cpu      ] GC(18) User=0.00s Sys=0.00s Real=0.00s
Scanner                  :   1803.928 ms
[1.975s][info][gc,start    ] GC(19) Pause Young (Normal) (G1 Evacuation Pause)
[1.975s][info][gc,task     ] GC(19) Using 8 workers of 8 for evacuation
[1.976s][info][gc,phases   ] GC(19)   Pre Evacuate Collection Set: 0.1ms
[1.976s][info][gc,phases   ] GC(19)   Merge Heap Roots: 0.1ms
[1.976s][info][gc,phases   ] GC(19)   Evacuate Collection Set: 0.2ms
[1.976s][info][gc,phases   ] GC(19)   Post Evacuate Collection Set: 0.3ms
[1.976s][info][gc,phases   ] GC(19)   Other: 0.4ms
[1.976s][info][gc,heap     ] GC(19) Eden regions: 109->0(109)
[1.977s][info][gc,heap     ] GC(19) Survivor regions: 1->1(14)
[1.977s][info][gc,heap     ] GC(19) Old regions: 1->1
[1.977s][info][gc,heap     ] GC(19) Archive regions: 0->0
[1.977s][info][gc,heap     ] GC(19) Humongous regions: 0->0
[1.977s][info][gc,metaspace] GC(19) Metaspace: 636K(832K)->636K(832K) NonClass: 599K(704K)->599K(704K) Class: 36K(128K)->36K(128K)
[1.977s][info][gc          ] GC(19) Pause Young (Normal) (G1 Evacuation Pause) 436M->1M(736M) 2.633ms
[1.978s][info][gc,cpu      ] GC(19) User=0.00s Sys=0.00s Real=0.00s
[2.126s][info][gc,start    ] GC(20) Pause Young (Normal) (G1 Evacuation Pause)
[2.126s][info][gc,task     ] GC(20) Using 8 workers of 8 for evacuation
[2.127s][info][gc,phases   ] GC(20)   Pre Evacuate Collection Set: 0.1ms
[2.127s][info][gc,phases   ] GC(20)   Merge Heap Roots: 0.1ms
[2.127s][info][gc,phases   ] GC(20)   Evacuate Collection Set: 0.2ms
[2.127s][info][gc,phases   ] GC(20)   Post Evacuate Collection Set: 0.2ms
[2.128s][info][gc,phases   ] GC(20)   Other: 0.5ms
[2.128s][info][gc,heap     ] GC(20) Eden regions: 109->0(109)
[2.128s][info][gc,heap     ] GC(20) Survivor regions: 1->1(14)
[2.128s][info][gc,heap     ] GC(20) Old regions: 1->1
[2.128s][info][gc,heap     ] GC(20) Archive regions: 0->0
[2.128s][info][gc,heap     ] GC(20) Humongous regions: 0->0
[2.128s][info][gc,metaspace] GC(20) Metaspace: 636K(832K)->636K(832K) NonClass: 599K(704K)->599K(704K) Class: 36K(128K)->36K(128K)
[2.129s][info][gc          ] GC(20) Pause Young (Normal) (G1 Evacuation Pause) 437M->1M(736M) 2.710ms
[2.129s][info][gc,cpu      ] GC(20) User=0.00s Sys=0.00s Real=0.00s
BR + String.split        :    285.644 ms
[2.329s][info][gc,start    ] GC(21) Pause Young (Normal) (G1 Evacuation Pause)
[2.329s][info][gc,task     ] GC(21) Using 8 workers of 8 for evacuation
[2.330s][info][gc,phases   ] GC(21)   Pre Evacuate Collection Set: 0.1ms
[2.330s][info][gc,phases   ] GC(21)   Merge Heap Roots: 0.1ms
[2.330s][info][gc,phases   ] GC(21)   Evacuate Collection Set: 0.2ms
[2.331s][info][gc,phases   ] GC(21)   Post Evacuate Collection Set: 0.2ms
[2.331s][info][gc,phases   ] GC(21)   Other: 0.7ms
[2.331s][info][gc,heap     ] GC(21) Eden regions: 109->0(109)
[2.331s][info][gc,heap     ] GC(21) Survivor regions: 1->1(14)
[2.331s][info][gc,heap     ] GC(21) Old regions: 1->1
[2.331s][info][gc,heap     ] GC(21) Archive regions: 0->0
[2.332s][info][gc,heap     ] GC(21) Humongous regions: 0->0
[2.332s][info][gc,metaspace] GC(21) Metaspace: 639K(832K)->639K(832K) NonClass: 602K(704K)->602K(704K) Class: 36K(128K)->36K(128K)
[2.332s][info][gc          ] GC(21) Pause Young (Normal) (G1 Evacuation Pause) 437M->1M(736M) 3.259ms
[2.332s][info][gc,cpu      ] GC(21) User=0.02s Sys=0.00s Real=0.00s
BR + StringTokenizer     :    226.105 ms
[2.381s][info][gc,heap,exit] Heap
[2.381s][info][gc,heap,exit]  garbage-first heap   total 753664K, used 132143K [0x0000000607c00000, 0x0000000800000000)
[2.381s][info][gc,heap,exit]   region size 4096K, 34 young (139264K), 1 survivors (4096K)
[2.381s][info][gc,heap,exit]  Metaspace       used 639K, committed 832K, reserved 1114112K
[2.381s][info][gc,heap,exit]   class space    used 36K, committed 128K, reserved 1048576K

GC 로그 결과 분석

결과부터 말하자면 Scanner로 읽을 때 GC는 총 18번 발생했으며, BufferedReader로 읽을 때는 한 번만 발생했다.

[0.268s][info][gc,heap     ] GC(2) Eden regions: 75->0(75)
[0.268s][info][gc,heap     ] GC(2) Survivor regions: 1->1(10)
[0.268s][info][gc,heap     ] GC(2) Old regions: 0->0
[0.268s][info][gc,heap     ] GC(2) Archive regions: 0->0
[0.269s][info][gc,heap     ] GC(2) Humongous regions: 0->0
[0.269s][info][gc,metaspace] GC(2) Metaspace: 555K(704K)->555K(704K) NonClass: 523K(576K)->523K(576K) Class: 31K(128K)->31K(128K)
[0.269s][info][gc          ] GC(2) Pause Young (Normal) (G1 Evacuation Pause) 301M->1M(508M) 2.809ms
[0.269s][info][gc,cpu      ] GC(2) User=0.00s Sys=0.02s Real=0.00s

두번째 GC를 보면, Eden 영역의 더이상 사용하지 않는 75개의 데이터는 삭제처리했으며 리전을 75로 늘렸다.
(첫번째 GC에서 11-> 75로 늘렸다.)

Survivor 영역은 1개가 유지되었으며 리전을 10으로 늘렸다.

참고로 Metaspace는 클래스 구조에 대한 메타 정보이기 때문에 큰 변동이 없다.

[0.409s][info][gc          ] GC(4) Pause Young (Normal) (G1 Evacuation Pause) 301M->1M(612M) 4.845ms

그리고 세번째 GC에서는 Eden영역이 빠르게 차오르는 것을 보고 301MB에서 612MB로 힙 사이즈를 늘린 것을 확인할 수 있다.

[1.786s][info][gc,heap     ] GC(18) Eden regions: 109->0(109)
[1.786s][info][gc,heap     ] GC(18) Survivor regions: 1->1(14)
[1.786s][info][gc,heap     ] GC(18) Old regions: 1->1
[1.786s][info][gc,heap     ] GC(18) Archive regions: 0->0
[1.786s][info][gc,heap     ] GC(18) Humongous regions: 0->0
[1.786s][info][gc,metaspace] GC(18) Metaspace: 557K(704K)->557K(704K) NonClass: 526K(576K)->526K(576K) Class: 31K(128K)->31K(128K)
[1.786s][info][gc          ] GC(18) Pause Young (Normal) (G1 Evacuation Pause) 436M->0M(736M) 1.672ms
[1.786s][info][gc,cpu      ] GC(18) User=0.00s Sys=0.00s Real=0.00s

Scanner에 의한 마지막18번째 GC를 보면 Eden영역의 리전 109로 늘어난 것을 확인할 수 있다.

즉, Scanner로 대용량의 데이터를 읽을 경우, Minor GC가 자주 일어나는 것을 확인할 수 있다.
심지어 읽기만하고 사용하지 않기 때문에, Eden 영역이 많이 안찼을 뿐, 실제로 계속 사용하는 값이라면 Major GC까지 일어났을 수 있다.

8. 결론

대용량의 데이터를 읽을 때는 Scanner보다는 버퍼를 사용하는 BufferedReaeder를 사용하는 게 좋다.

그러나, 정규식을 활용해야한다면 BufferedReader를 사용할 경우, 직접 파싱하는 코드를 작성해야하므로 Scanner를 사용하는 게 좋을 수 도 있다.

항상 좋은 건 없다.

9. 참고

System.in부터 Scanner, BufferedReader부분은 다음 글을 매우 많이 참고했다.

 

JAVA [자바] - 입력 뜯어보기 [Scanner, InputStream, BufferedReader]

이 글을 지금 이 시점에 써야 할까 고민을 많이 했다. 사실 자바를 그냥 다룰 줄만 아는 것에 목표를 둔다면 이 글이 무의미할 수도 있다. 그러나 자바에 대해 조금이라도 관심이 있고 더 배우고

st-lab.tistory.com

GC 로깅은 Claude의 도움을 받았다.

'우아한 테크 코스 8기' 카테고리의 다른 글

동시성 테스트를 하다 발견한 Docker의 CPU 계산법  (1) 2026.04.01
불변 클래스 record  (0) 2026.03.20
Enum 캐싱은 정말 빠를까?  (0) 2026.03.19
우아한 테크 코스 8기 Level 1 - 1주차  (0) 2026.03.03
[우아한 테크 코스 8기] 최종 합격  (0) 2026.01.23
'우아한 테크 코스 8기' 카테고리의 다른 글
  • 동시성 테스트를 하다 발견한 Docker의 CPU 계산법
  • 불변 클래스 record
  • Enum 캐싱은 정말 빠를까?
  • 우아한 테크 코스 8기 Level 1 - 1주차
koreaioi
koreaioi
  • koreaioi
    koreaioi
    koreaioi
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기 (187)
      • JAVA (3)
      • 알고리즘 (90)
        • 백준 (11)
        • String(문자열) (12)
        • Array(1, 2차원 배열) (13)
        • Two pointers, Sliding windo.. (6)
        • HashMap, TreeSet(해쉬, 정렬지원 S.. (5)
        • Stack, Queue(자료구조) (8)
        • Sorting and Searching(정렬, 이.. (10)
        • Recursive, Tree, Graph(DFS,.. (14)
        • DFS, BFS 활용 (6)
        • 다시 시작! (2)
        • 기초 수학 (1)
      • 일상 (26)
      • Github (1)
      • MSA 공부 (4)
      • 경제, 금융, 디지털, 시사 (3)
      • 라즈베리파이 (10)
      • 프로젝트에서 일어난 일 (22)
      • FrontEnd 공부 (9)
        • React (8)
      • Spring (2)
      • 기술 세미나 (2)
      • DB (3)
      • 우아한 테크 코스 8기 (10)
      • 잡생각 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
koreaioi
Scanner vs BufferedReader (+ 간단한 GC)
상단으로

티스토리툴바