자바

JAVA 자바 System 클래스 프로그램 종료 exit() /// 가비지 컬렉터 gc()

알통몬_ 2017. 3. 14. 10:23
반응형

System 클래스

 자바 프로그램은 JVM 위에서 실행됩니다. 

운영체제의 모든 기능을 자바 코드로 직접 접근하기란 어렵습니다. 

java.lang 패키지에 속하는 System 클래스를 이용하면 운영체제의 일부 기능을 이용할 수 있습니다. 

프로그램 종료, 기보드로부터 입력, 모니터로 출력, 메모리 정리, 현재 시간 읽기, 

시스템 프로퍼티 읽기, 환경 변수 읽기 등이 가능합니다.

System. 클래스의 모든 필드와 메서드는 정적 필드와 정적 메서드로 구성.


프로그램 종료 exit()현재 실행하고 있는 프로세스를 강제 종료시키는 역할

 JVM을 강제적으로 종료시킬 때도 있습니다. 

이때 System 클래스의 exit() 메서드를 호출하면 됩니다. 

exit()메서드는 int 매개값을 지정하도록 되어있습니다. 

이 값을 종료 상태값이라고 합니다. 일반적으로 정상 종료일 경우 0,

비정상 종료일 경우 0이외의 다른 값을 줍니다.

System.exit(0);


어떠한 값을 주더라도 종료가 되는데, 특정 값이 입력되었을 경우에만 종료를 하고 싶다면 

자바의 보안 관리자를 직접 설정해서 종료 상태값을 확인하면 됩니다. 

System.exit()가 실행되면 보안 관리자의 checkExit()메서드가 자동 호출되는데, 

이 메서드에서 종료 상태값을 조사해서 특정 값이 입력되지 않으면

SecurityException을 발생시켜 System.exit()를 호출한 곳에서 예외처리를 할 수 있도록 해줍니다.

checkExit()가 정상적으로 실행되면 JVM은 종료됩니다. 

아래는 종료 상태 값으로 5가 입력되면 JVM을 종료하도록 보안관리자를 설정한 것입니다.

System.setSecurityManager(new SecurityManaget() {

   @Override

    public void checkExit(int status) {

       in(status != 5){

           throws new SecurityException();

       }

    }

});

예제를 보겠습니다.

public class ExitExample {

public static void main(String[] args)  {

//보안 관리자 설정

System.setSecurityManager(new SecurityManager(){

@Override

public void checkExit(int status) {

if(status != 5) {

throw new SecurityException(); // status가 5가되면 프로세스 종료

}

}

});

for(int i=0; i<10; i++) {

//i값 출력

System.out.println(i);

try {

//JVM 종료 요청

System.exit(i); // i 가 5가되는 때에 프로세스가 종료된다.

} catch(SecurityException e) { }

}

}

}




가비지 컬렉터 실행  gc()

 자바는 메모리를 JVM이 알아서 자동으로 관리합니다. 메모리가 부족할 때와 CPU가 한가할 때에 

가비지 컬렉터를 실행시켜 사용하지 않는 객체를 자동 제거. 

Cars myCar = new Cars(); 를 선언한 후 

myCar = null; 다시 null을 대입했다면 myCar는 객체의 번지를 잃게 됩니다. 

객체의 번지를 모르니 더 이상 Car 객체는 사용할 수가 없고 이제부터 쓰레기가 됩니다.

또는

Cars myCar = new Cars(); // 이전 참조 객체

myCar = new Cars(); // 현재 참조 객체 

이전 객체 번지를 잃었기 때문에 이전 객체는 쓰레기가 됩니다.


Garbage Collector는 직접 코드로 실행시킬 수는 없고, 

JVM에게 가능한한 빨리 실행해 달라고 요청은 할 수 있습니다. 이것이 System.gc() 메서드입니다. 

System.gc() 메서드가 호출되면 쓰레기 수집기가 바로 실행되는 것은 아니고 

JVM은 빠른 시간 내에 실행시키기 위해 노력합니다.

System.gc();


gc() 메서드는 메모리가 열악하지 않은환경이라면 거의 사용할 일이 없습니다. 


사용 예제를 보겠습니다.

public class GcExample {

public static void main(String[] args) {

Employees emp;

emp = new Employees(1);// 쓰레기가 됨.

emp = null;

emp = new Employees(2);// 쓰레기가 .

emp = new Employees(3);

System.out.print("emp가 최종적으로 참조하는 사원번호: ");

System.out.println(emp.eno);

System.gc();

}

}

class Employees {

public int eno;

public Employees(int eno) {

this.eno = eno;

System.out.println("Employees(" + eno + ") 가 메모리에 생성됨");

}


public void finalize() {

System.out.println("Employees(" + eno + ") 이 메모리에서 제거됨");

}

}



반응형