반응형

JVM Data Area

1. Method Area (메서드 영역)

설명:

  • 클래스 수준의 정보가 저장되는 공간이다.
  • 클래스 로딩 시점에 JVM에 의해 로드되고, 클래스가 언로드될 때까지 유지된다.

저장되는 데이터:

  • 클래스 이름, 부모 클래스 이름, 메서드 정보, 필드 정보
  • static 변수
  • constant pool (상수 풀)

사용 시점:

  • 클래스가 처음 로드될 때 해당 정보들이 이 영역에 저장된다.

설정 방법:

  • 이 영역은 PermGen (Java 7 이하) 또는 Metaspace (Java 8 이상)로 구성된다.
  • 설정 예:
    • Java 7 이하: XX:PermSize, XX:MaxPermSize
    • Java 8 이상: XX:MetaspaceSize, XX:MaxMetaspaceSize

 

2. Heap Area (힙 영역)

설명:

  • 자바에서 생성된 객체가 저장되는 영역이다.
  • GC(Garbage Collector)의 대상이 되는 주요 영역이다.

저장되는 데이터:

  • 인스턴스 변수
  • 배열
  • 객체 데이터

사용 시점:

  • new 키워드를 통해 객체가 생성될 때마다 힙에 저장된다.

설정 방법:

  • Xms (초기 힙 크기), Xmx (최대 힙 크기) 옵션으로 조절 가능
  • bash 복사편집 java -Xms256m -Xmx1024m MyApp

 

3. Stack Area (스택 영역)

설명:

  • 각 스레드마다 생성되며, 메서드 호출 시 프레임(Stack Frame)을 저장하는 공간이다.

저장되는 데이터:

  • 지역 변수
  • 매개 변수
  • 연산 중간 결과
  • 리턴 값
  • 메서드 호출 시의 정보 (프레임)

사용 시점:

  • 메서드가 호출될 때마다 새로운 스택 프레임이 생성되고, 메서드가 종료되면 제거된다.

설정 방법:

  • Xss 옵션으로 각 스레드의 스택 크기를 설정 가능
  • bash 복사편집 java -Xss512k MyApp

 

4. Program Counter (PC) Register

설명:

  • 각 스레드마다 존재하며, 현재 실행 중인 JVM 명령어의 주소를 저장한다.

저장되는 데이터:

  • 현재 실행 중인 명령어의 주소 (bytecode 위치)

사용 시점:

  • JVM 명령어가 실행될 때, 다음에 실행할 명령어의 위치를 추적한다.

설정 방법:

  • JVM이 내부적으로 관리하며, 별도의 설정은 제공하지 않는다.

 

5. Native Method Stack (네이티브 메서드 스택)

설명:

  • 자바가 아닌 네이티브 코드(C, C++)를 호출할 때 사용되는 스택이다.
  • 예: System.gc() 같은 메서드는 내부적으로 네이티브 메서드를 호출한다.

저장되는 데이터:

  • 네이티브 메서드 호출에 필요한 정보와 지역 변수

사용 시점:

  • native 키워드가 선언된 메서드가 호출될 때

설정 방법:

  • 일반적으로 설정하지 않지만, JVM 구현체에 따라 스택 크기를 조절할 수 있다.

 

요약

영역 저장되는 데이터 생성 시점 주요 설정

Method Area 클래스 정보, static, 상수 풀 클래스 로딩 시 -XX:MetaspaceSize, -XX:MaxMetaspaceSize
Heap 객체, 배열 객체 생성 시 -Xms, -Xmx
Stack 지역 변수, 프레임 메서드 호출 시 -Xss
PC Register 명령어 위치 스레드 시작 시 (설정 불가)
Native Method Stack 네이티브 호출 정보 native 메서드 호출 시 JVM 의존적

필요한 경우 GC 튜닝이나 OutOfMemoryError 대응을 위해 이 영역들의 크기를 조정하게 된다. 각 영역은 JVM이 스레드 및 애플리케이션 실행 상태를 관리하기 위한 필수 구성 요소이므로, 시스템 성능 및 안정성에 영향을 줄 수 있다.

 

 

반응형
반응형

Trie를 이용한 접두사 검색 (Autocomplete 기능 구현)

 

import java.util.*;

class TrieNode {
    TrieNode[] children;
    boolean isEndOfWord;

    public TrieNode() {
        children = new TrieNode[26]; // 알파벳 소문자 기준
        isEndOfWord = false;
    }
}

class Trie {
    private TrieNode root;

    public Trie() {
        root = new TrieNode();
    }

    public void insert(String word) {
        TrieNode node = root;
        for (char c : word.toCharArray()) {
            int index = c - 'a';
            if (node.children[index] == null) {
                node.children[index] = new TrieNode();
            }
            node = node.children[index];
        }
        node.isEndOfWord = true;
    }

    public List<String> getWordsWithPrefix(String prefix) {
        List<String> result = new ArrayList<>();
        TrieNode node = root;
        for (char c : prefix.toCharArray()) {
            int index = c - 'a';
            if (node.children[index] == null) {
                return result;
            }
            node = node.children[index];
        }
        findWords(node, new StringBuilder(prefix), result);
        return result;
    }

    private void findWords(TrieNode node, StringBuilder prefix, List<String> result) {
        if (node.isEndOfWord) {
            result.add(prefix.toString());
        }
        for (char c = 'a'; c <= 'z'; c++) {
            int index = c - 'a';
            if (node.children[index] != null) {
                prefix.append(c);
                findWords(node.children[index], prefix, result);
                prefix.deleteCharAt(prefix.length() - 1);
            }
        }
    }
}
반응형

'Java' 카테고리의 다른 글

[Java]JVM Data Area  (1) 2025.05.21
Java 7 functions  (0) 2023.06.18
JDK, JRE, JVM이란?  (0) 2023.06.15
[ERROR]cannot find symbol  (0) 2023.05.29
[ERROR]Illegal modifier for the interface field Observer.name; only public, static & final are permitted  (0) 2023.05.29
반응형

Java version 7 functions

 

Functions

1. try-with-resources

try (InputStream in = new FileInputStream(inFile); // try에 자원 객체를 전달하면 finally 블록으로 종료 처리를 하지 않아도 try 코드 블록이 끝나면 자동으로 자원을 종료해주는 기능.
     OutputStream out = new FileOutputStream(outFile)) {
    ...
} catch(IOException ex) {
    ...
}

 

2. multicatch

try (InputStream in = new FileInputStream(inFile); // try에 자원 객체를 전달하면 finally 블록으로 종료 처리를 하지 않아도 try 코드 블록이 끝나면 자동으로 자원을 종료해주는 기능.
     OutputStream out = new FileOutputStream(outFile)) {
    ...
} catch(IOException ex) {
    ...
}

 

3. switch-case에 문자열 지원

String str = "비밀";

switch(str) {
    case "진실": ...
         break;
    case "비밀": ...
         break;
    ...
    default: ...
         break;
}

 

4. Fork/Join

  • 어떤 계산 작업을 할 때 여러 개로 나누어 계산한 후 결과를 모으는 작업합니다.
  • 별도로 구현하지 않아도 라이브러리에서 Work Stealing 작업을 알아서 수행합니다.
// 기본
long total = 0;
for(int loop = from; loop <= to; loop++) {
	total += loop;
}

// Fork/Join
public class ForkJoinSample {
	static final ForkJoinPool mainPool = new ForkJoinPool();
    
	public static void main(String[] args) {
		long from = 0;
		long to = 10;
		GetSum sum = new GetSum(from, to);
		
		// 계산을 수행하는 객체를 넘겨주어 작업을 실행하고 결과를 받음
		Long result = mainPool.invoke(sum);
		System.out.println("total:" + result);
	}
}

public clas GetSum extends RecursiveTask<Long> {
	long from, to;
    
  public GetSum(long from, long to) {
    this.from = from;
    this.to = to;
	}

	public Long compute() {
		long gap = to - from;
		
		// 작업 단위가 작을 경우
		if(gap <= 3) {
			long result = 0;
		  for(int loop = from; loop <= to; loop++) {
			  result += loop;
			}
		  
			return result;
		}
		
		// 작업 단위가 클 경우
		// 두 개의 작업으로 나누어 동시에 실행시키고, 두 작업이 끝날 때 까지 결과를 기다림
		long middle = (from + to) / 2;
		GetSum prev = new GetSum(from, middle);
		prev.fork();
		GetSum post = new GetSum(middle + 1, to);
		// compute() 함수는 람다식을 통해서 기존의 값에 어떻게 연산을 할지 지정할 수 있습니다.
		return post.compute() + prev.join();
        
  }
}

 

5. ECC 암호화 기능 제공

반응형
반응형
반응형

문제

현재 Mac pro1에 vscode에서 javac를 통해 컴파일하고 나서 실행할려고 했는데 컴파일에서 cannot find symbol error가 발생했습니다. 원인은 package 때문에 발생했습니다.

 

해결

package를 제거해주거나 위치 설정을 잡아 줍니다.

반응형
반응형
반응형

interface 생성 중 객체 생성 할 때 private으로 설정을 해서 Illegal modifier for the interface field Observer.name; only public, static & final are permitted 에러가 발생했습니다.

 

발생 원인은 interface는 외부로 공개되는 메소드를 정의하는 것인데 private 객체를 선언 했기 때문입니다.

error를 해결하는 방법은 private을 public, static & final 수정해주면 됩니다.

반응형

'Java' 카테고리의 다른 글

[JAVA]Trie를 이용한 접두사 검색 (Autocomplete 기능 구현)  (0) 2025.03.16
Java 7 functions  (0) 2023.06.18
JDK, JRE, JVM이란?  (0) 2023.06.15
[ERROR]cannot find symbol  (0) 2023.05.29
AOP이란?  (0) 2023.05.11

+ Recent posts