SSISO Community

시소당

자바 퍼퍼먼스 높이기 1

게시글  시간:  2002/09/06  07:11:00  오후
양인상  
새로운  답글  달기    새로운  답글  달기

"본자료는  JavaTime에서  퍼왔습니다.  몇개로  나눠서  올리겠습니다  ^^"

JDK1.3버전  이후로  지원되는  HotSpot  VM은  기본적으로  Hip에  동적으로  할당된  Object는  거의  회수할  수  있다고  한다.  하지만  이  기능으로  인해서  VM은  엄청난  OverHead를  가지게  된다.  무리한  Object의  생성은  생성  당시에도  많은  OverHead를  초래하지만,  생성된  Object를  회수하기  위해서는  더  많은  작업이  요구된다.  이를  해결하기  위한  몇  가지  Tip이  있는데,  Avoiding  Garbage  Collection,  Object  재사용,  static  instance  variable의  사용에  의한  단일  클래스  인스턴스  구현  방법  등이  그것이다.  핵심은  가능한  Object  생성을  피하자는  것이다.


▶  Avoiding  Garbage  Collection(static  method사용)
예제1)
String  string="55";
int  theInt=new  Integer(string).intValue();

예제2)
String  string="55";
int  theInt=Integer.parseInt(string);

예  제1)에서는  Integer  클래스를  생성한  다음  string에서  정수값을  추출해  냈다.  Object를  생성하고  초기화하는  과정은  상당한  cpu  집약적인  작업이고,  Hip  영역에  Object가  생성되고  수집되기  때문에  가비지  컬렉터  작업을  수반한다.  가능한  Object의  Instance가  필요  없는  static  메소드를  사용한다.  예제2)  참조.


▶  Avoiding  Garbage  Collection(임시  Object  생성  금지)
가  장  흔한  예로  String  Object의  append를  위해서  (+)  연산을  사용하는  것을  들  수  있다.  (+)  연산자를  사용해서  String  Object를  append할  경우  우리가  생각하는  것  보다  훨씬  더  많은  임시  Object가  생성되고,  가비지  컬렉터에  의해  다시  수집된다.  String  Object의  append연산을  위해서는  StringBuffer  클래스를  사용한다.  예제1)과  예제2)  참조

예제1)
String  a="Hello";
a=a+"World";
System.out.println(a);

예제2)
StringBuffer  a=new  StringBuffer();
a.append("Hello");
a.append("World");
System.out.println(a.toString());

어  떤  메소드는  Object의  복사본을  반환하는  경우가  있다.  대표적인  예로  스트링  클래스의  trim()  메소드를  들  수  있다.  trim()메소드가  수행되면  기존의  Object는  수집되고,  기존  Object의  복사본이  사용되게  된다.  임시  Object  생성과  복사본을  반환하는  메소드가  루프  안에서  사용될  경우  무수히  많은  Object가  생성되고  수집되기  때문에  심각한  문제를  야기하게  된다.  루프  내부에서  Object를  생성하는  것은  가급적  피해야  한다.

예제3)
for(i=0;i<1000;i++){
Date  a=new  Date();
:
}

예제4)
Date  a;
for(i=0;i<1000;i++){
a=new  Date();
:
a=null;
}

예  제3)과  예제4)는  현재  날짜와  시간을  얻어오기  위해  루프  안에서  Object를  생성했다.  보통  set으로  시작하는  메소드는  Object의  Instance  값을  재정의  한다.  API를  충분히  참조한  다음  지원  메소드가  없을  경우,  클래스를  상속받아  요구에  적합한  메소드를  만드는  방법도  고려할  필요가  있다.  기존  API를  이용한  Object  초기화  방법은  아래  Object  재사용(메소드를  사용한  Object  초기화)  부분  참조.


▶  Avoiding  Garbage  Collection(primitive  data  type  사용)
Date  클래스나  String  클래스의  값들중  int나  long  형으로  표현하여  사용할  수  있는  경우가  있다.  예를  들어

String  a="1492";
String  b="1997";

과  같을  경우  a와  b는  굳이  String  형으로  표현하지  않아도  된다.  하지만  여기서  주의할  점은  Object의  값을  기본  데이타형으로  Casting  하는  작업이  오히려  시간이  더  많이  걸릴  수도  있는  것이다.
클래스의  인스턴스  변수로  기본  데이타형을  사용하면  Object의  크기도  줄어들고,  Object  생성  시간도  줄일  수  있다.


▶  Object  재사용(Pool  Management)
Object  재사용  기법으로  흔히  Pool  Management  기법을  사용한다.  이는  임의  갯수의  Object를  미리  생성해  두고  이를  Vector  클래스를  사용해서  관리하는  방법이다.  해당  Object를  사용하기  위해서  Pool의  Vector에  있는  Object를  하나  가져오고,  다  사용하고  나면  다시  Pool에  반납한다.  이는  기존에  공개되어  있는  Hans  Bergsten의  Connection-Pool의  PoolManager클래스에서  사용되고  있다.(Professional  JAVA  Server  Programming.  정보문화사.  2000.4.4.  제9장  연결풀링  부분  참조)  Object  Pool을  사용할  경우,  반환되는  Object가  초기화되어  반환되지  않을  경우  다음에  Pool에서  Object를  가져와서  사용하게  되면  문제를  야기할  수  있기  때문에  초기  클래스  Design시  꼼꼼하게  따져  봐야  한다.


▶  Object  재사용(메소드를  사용한  Object  초기화)
예제1)
StringBuffer  sb=new  StringBuffer();
sb.append("Hello");
out.println(sb.toString());
sb=null;
sb=new  StringBuffer();
sb.append("World");
out.println(sb.toString());

예제1)과  같이  사용할  경우  하나의  인스턴스  변수를  사용하기는  하지만,  두  번의  초기화  과정을  거치게  된다.

예제2)
StringBuffer  sb=new  StringBuffer();
sb.append("Hello");
out.println(sb.toString());
sb.setLength(0);
sb.append("World");
out.println(sb.toString());

위와  같이  각  클래스에서  지원해  주는  메소드를  사용하여  Object를  재사용  할  수  있다.  

출처  :  http://www.ibm.com//developerworks/kr/forums/dw_thread.jsp?forum=7&thread=569&cat=4

625 view

4.0 stars