2013년 9월 5일 목요일

자바 VM 로딩 시간을 줄이는 배치프로그램 [출처] 오라클자바커뮤니티

VM 로딩 시간을 줄이는 배치프로그램

여러 개의 자바 프로그램이 동시적으로 배치 형태로 실행된다고 했을 때 매번 실행을 위해 VM이 실행 됩니다. 이 경우 자바 프로그램이 실행될 때 마다 VM이 실행되므로 프로그램의 크기가 작을 경우 실행 시간의 대부분은 VM을 로딩하는 시간이 될 수도 있습니다.

아래에 VM 로딩을 줄이기 위한 배치 프로그램을 소개하니 참고 바랍니다.

우선 실행할 프로그램 목록을 담아두는 txt 파일을 하나를 만듭니다.

-------------
startList.txt
-------------

#아래의 프로그램이 배치로 실행 됩니다.
Loader SW
Loader EV
Loader VO
Loader VI



----------------
LoadingBatch.java
----------------
import java.util.List;
import java.util.LinkedList;
import java.util.Iterator;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileInputStream;
import java.lang.reflect.Method;

public class LoadingBatch {

       
        public static void main(String[] args) throws Exception{
                if (args.length != 1) {
                        System.out.println("Usage : java LoadingBatch [startList.txt]");
                        return;
                }
               
                //program.list 파일을 읽어 실행할 명령을 List에 받아옴
                List<String> list = loadBatchJobs(args[0]);
               
                String cmd = null;
               
               
                //List에 있는 명령을 반복하면서 실행을 위해 runApp 메소드 호출
                for(Iterator<String> i=list.listIterator(); i.hasNext();) {
                        cmd = i.next();
                        runApp(cmd);    //Loader SW, Loader EV, Loader VO, Loader VI 등 명령을 실행
                }                               
        }
       
       
        public static List<String> loadBatchJobs(String fName) throws Exception{
                LinkedList<String> list = new LinkedList<String>();
                BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fName)));
               
                String cmd = null;
               
                while((cmd = br.readLine()) != null) {
                        cmd = cmd.trim();
                        if (cmd.startsWith("#")) continue;  //주석 처리를 위해
                        list.add(cmd);                      //각 자바 실행 명령을 List에 담는디
                }
               
                return list;
        }
       
       
        public static void runApp(String cmd) throws Exception {
                String[] cmds = cmd.split(" ");   //실행할 프로그램과 인자를 구분
                String className = cmds[0];       //실행할 프로그램
                String[] args = null;             //인자는 몇개가 될지 모르니...
               
                if (cmds.length > 1) {            //프로그램과 인자를 가지고 있는 경우
                        args = new String[cmds.length - 1];
                        System.arraycopy(cmds, 1, args, 0, cmds.length -1);  //인자를 args 배열에 COPY
                }
               
                Class c = Class.forName(className);  //클래스 로딩
               
                Method m = c.getMethod("main", new Class[]{String[].class}); //Loader라는 클래스의 main 메소드를 얻어옴
               
                m.invoke(null, new Object[]{args});  //인자를 주어 프로그램을 실행 합니다.
        }       
}

댓글 없음:

댓글 쓰기