달력

22025  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

'이것저것 > 낙서장' 카테고리의 다른 글

음악 샀다~~  (0) 2005.05.31
조엘 온 소프트웨어..... 돈 굳었다..  (0) 2005.05.30
만원 충전 ^^  (0) 2005.05.26
[축] 금요일 교대 회동  (2) 2005.05.21
책 사따 -.-;;  (3) 2005.05.18
Posted by tornado
|

문화상품권 2장 있었는데... 종복이 한장 주고..

만원은 네이버에 투자했당..

음악 절라게 사야쥐... ㅋ

누가 문화상품권 안주나??

'이것저것 > 낙서장' 카테고리의 다른 글

조엘 온 소프트웨어..... 돈 굳었다..  (0) 2005.05.30
[펌] [펌 귀여운 고양이 ㅋㅋ;;  (0) 2005.05.26
[축] 금요일 교대 회동  (2) 2005.05.21
책 사따 -.-;;  (3) 2005.05.18
netbeans 로 바꿔따..  (0) 2005.05.18
Posted by tornado
|

지금 닷넷 2003 서버 쓴다..

거기에 SQL서버 깔아서 사용하려고 하는데..

SQL Server 를 깔기 전에.. 바이러스 프로그램, 익스플로러 돌아다니면서 생긴 응용프로그램들..

기타 잡다한 프로그램들이 먼저 설치가 되었다.

 

이 상태에서 SQL Server 를 설치하려고 하니까 계속 오류(메세지는 까먹음 -.-) 발생 ;;

 

설치된 프로그램 하나씩 삭제해 가면서.. 리부팅 ...

그리고 SQL Server 설치 시도...

음.. 설치 된다...

 

모냐 -.-;

 

장난하냐? 장난해?

'.NET' 카테고리의 다른 글

[링크] 닷넷용 웹메뉴....  (0) 2005.06.10
[펌] Log4Net 간단한 사용법 설명  (1) 2005.06.03
[링크] 조타..  (0) 2005.05.25
[펌] MSDN 라이브러리  (0) 2005.05.25
checked+ 옵션  (0) 2005.05.24
Posted by tornado
|

예전에 어디다 적어놨던거 같은데... 찾으니 없어서 다시 적음 -.-;

간단한 것이지만 까먹고 나면 문서 찾아봐야 하고 해서 ...


그럼 본문 시작.......


java.util.Collections 클래스에는 sort(List list) 라는 정적 메소드와

sort(List list, Comparator c) 라는 메서드가 있다.


이넘들을 이용해서 객체를 정렬 할 수 있다..

문제는 사용자 정의 객체(대표적으로 Java Bean) 들은 정렬대상에서 제외 된다.

예를 들면..


class TestBean{
 int pk;
 String name;

 public void setPk(int pk){ this.pk = pk; }
 public int getPk(){ return pk; }
 public void setName(String name){ this.name = name; }
 public String getName(){ return name; }

 public String toString(){
  return "[pk = " + pk + " , name = " + name + "]";
 }

}


이런 클래스가 하나 있다.

이 클래스에는 pk 라는 변수가 있는데.. 이 번호를 기준으로 객체를 정렬하고 싶다.

main 메소드를 만들어 정렬을 수행해 보자..

import java.util.*;

public class CompareToTest{
 public static void main(String[] args){
 
  System.out.println("정렬정렬 김정렬..");
  List list = new ArrayList();

  int[] arr = new int[]{8,3,4,6,1,2,7,5,9};
  String[] name = new String[]{"a", "z","y", "k","l","o","t","q", "f"};

  TestBean bean = null;
  for(int i = 0; i < arr.length; i++){
   bean = new TestBean();
   bean.setPk(arr[i]);
   bean.setName(name[i]);

   list.add(bean);
  }

  System.out.println("정렬 전");

  for(int i = 0; i < list.size(); i++){
   bean = (TestBean)list.get(i);
   System.out.println(bean);
  }

  Collections.sort(list);  // <-- 여기서 정렬...

  System.out.println("정렬 후");
  for(int i = 0; i < list.size(); i++){
   bean = (TestBean)list.get(i);
   System.out.println(bean);
  }
 }
}


이 클래스를 실행하면...


정렬정렬 김정렬..
정렬 전
[pk = 8 , name = a]
[pk = 3 , name = z]
[pk = 4 , name = y]
[pk = 6 , name = k]
[pk = 1 , name = l]
[pk = 2 , name = o]
[pk = 7 , name = t]
[pk = 5 , name = q]
[pk = 9 , name = f]
java.lang.ClassCastException
 at java.util.Arrays.mergeSort(Arrays.java:1152)
 at java.util.Arrays.mergeSort(Arrays.java:1163)
 at java.util.Arrays.sort(Arrays.java:1079)
 at java.util.Collections.sort(Collections.java:113)
 at CompareToTest.main(CompareToTest.java:28)
Exception in thread "main"


이런 에러가 발생하게 된다..

에러가 발생하는 건 당연한 이야기 이다.

Collections.sort() 메서드에서 무슨 근거로.. List 안에 들어있는 객체들을 정렬하겠냐 말이쥐..

그럼 이걸 정렬되게 하려면 어떻게 하면 되나...


java.lang 패키지에 있는 Comparable 인터페이스를 구현하면 된다.


java.lang.Comparable 인터페이스에는 compareTo(Object o) 라는 메서드가 있다.

이 녀석을 재정의 하면 된다..

재정의 규칙은 다음과 같다.


o.pk 가 현재 PK 보다 크다면  1 을 반납

o.pk 가 현재 pk 보다 작다면 -1 을 반납

o.pk 가 현재 pk 와 같다면 0 을 반납.


이러면 모든게 끝난다.


그럼 수정한 예를 보자.

class TestBean implements Comparable{
 int pk;
 String name;

 public void setPk(int pk){ this.pk = pk; }
 public int getPk(){ return pk; }
 public void setName(String name){ this.name = name; }
 public String getName(){ return name; }

 public String toString(){
  return "[pk = " + pk + " , name = " + name + "]";
 }


 // 구현 메소드
 public int compareTo(Object o){
  TestBean bean = (TestBean)o;
 
  if(bean.pk < this.pk) return 1;
  else if(bean.pk > this.pk) return -1;
  else return 0;
 }
}


이 예제를 실행하면 아래와 같이 나올것이다..


정렬정렬 김정렬..
정렬 전
[pk = 8 , name = a]
[pk = 3 , name = z]
[pk = 4 , name = y]
[pk = 6 , name = k]
[pk = 1 , name = l]
[pk = 2 , name = o]
[pk = 7 , name = t]
[pk = 5 , name = q]
[pk = 9 , name = f]
정렬 후
[pk = 1 , name = l]
[pk = 2 , name = o]
[pk = 3 , name = z]
[pk = 4 , name = y]
[pk = 5 , name = q]
[pk = 6 , name = k]
[pk = 7 , name = t]
[pk = 8 , name = a]
[pk = 9 , name = f]


Collections.sort(List list) 외에 Arrays.sort(Object[] a) 도 같은 결과가 나온다.


TestBean 의 내부변수인 pk 로 정렬을 해보았다..

이 상태에서... name 으로 비교를 해 볼수도 있다.

방법은 아주 단순하고 간단하다.

바로 java.util.Comparator 인터페이스를 상속하여.. 새로운 클래스를 구현하고 그 클래스를 정렬하는 곳에 알려주면 된다.


java.util.Comparator 인터페이스에는 구현해야할 메소드가 두 개 있다.

public int compare(Object o1, Object o2)

public boolean equals(Object obj)


이렇게 두개만 구현해 주면 된다..


그럼 이름으로 정렬하기 위해 새로운 클래스를 하나 만들어보자.

class MyComparator implements Comparator{
 public int compare(Object o1, Object o2){
  return ((TestBean)o1).getName().compareTo(((TestBean)o2).getName());
 }
 
 public boolean equals(Object o){
  return true;
 }
}

그리고 테스트를 위해 main 메서드의 내부를 아래와 같이 수정했다.

import java.util.*;

public class CompareToTest{
 public static void main(String[] args){
 
  System.out.println("정렬정렬 김정렬..");
  List list = new ArrayList();

  int[] arr = new int[]{8,3,4,6,1,2,7,5,9};
  String[] name = new String[]{"a", "z","y", "k","l","o","t","q", "f"};

  TestBean bean = null;
  for(int i = 0; i < arr.length; i++){
   bean = new TestBean();
   bean.setPk(arr[i]);
   bean.setName(name[i]);

   list.add(bean);
  }

  //-------------------------
  // 추가된 부분
  //-------------------------
  TestBean temp = new TestBean();
  temp.setPk(1);
  temp.setName("m");
  list.add(temp);


  System.out.println("정렬 전");

  for(int i = 0; i < list.size(); i++){
   bean = (TestBean)list.get(i);
   System.out.println(bean);
  }

  Collections.sort(list);

  System.out.println("정렬 후");
  for(int i = 0; i < list.size(); i++){
   bean = (TestBean)list.get(i);
   System.out.println(bean);
  }

  //-------------------------
  // 추가된 부분
  //-------------------------

  Collections.sort(list, new MyComparator()); 

  System.out.println("Comparator 구현 후");
  for(int i = 0; i < list.size(); i++){
   bean = (TestBean)list.get(i);
   System.out.println(bean);
  }
 }
}



이 클래스를 실행하면 아래와 같은 결과가 나온다...


정렬정렬 김정렬..
정렬 전
[pk = 8 , name = a]
[pk = 3 , name = z]
[pk = 4 , name = y]
[pk = 6 , name = k]
[pk = 1 , name = l]
[pk = 2 , name = o]
[pk = 7 , name = t]
[pk = 5 , name = q]
[pk = 9 , name = f]
[pk = 1 , name = m]
정렬 후
[pk = 1 , name = l]
[pk = 1 , name = m]
[pk = 2 , name = o]
[pk = 3 , name = z]
[pk = 4 , name = y]
[pk = 5 , name = q]
[pk = 6 , name = k]
[pk = 7 , name = t]
[pk = 8 , name = a]
[pk = 9 , name = f]
Comparator 구현 후
[pk = 8 , name = a]
[pk = 9 , name = f]
[pk = 6 , name = k]
[pk = 1 , name = l]
[pk = 1 , name = m]

[pk = 2 , name = o]
[pk = 5 , name = q]
[pk = 7 , name = t]
[pk = 4 , name = y]
[pk = 3 , name = z]



훔.. 말주변이 없어서 더이상 설명이 안되네.....

머 두개의 클래스(TestBean 과 MyComparator ) 를 합쳐서 지지고 볶구 해도 되겠징.. ^^;

또는 보기 좋게~ static 메서드로 만들어도 되겠고..

또는...

또는...

또는...

또는....

또는......


머리 깨지네 ㅋ

Posted by tornado
|

[링크] 조타..

.NET 2005. 5. 25. 11:33
Posted by tornado
|

[펌] MSDN 라이브러리

.NET 2005. 5. 25. 10:57

MSDN 라이브러리

MSDN 라이브러리에 오신것을 환영 합니다. 개발에 관련된 제품및 기술에 대한 예제 코드 및 관련 정보를 제공 합니다.   
http://www.microsoft.com/Korea/MSDN/library/default.aspx


  • 사용자 지정 데이터 바인딩

    Michael Weinhardt가 코드를 사용하지 않고도 사용자 지정 형식을 완전한 목록 데이터 원본으로 만들 수 있는 여러 가지 새로운 디자이너 향상 기능 및 추가 기능에 대해 설명합니다.   

  • C# 2.0 명령줄 컴파일러 작업

    C# 명령줄 컴파일러인 csc.exe를 사용하여 응용 프로그램을 빌드하는 과정을 살펴봅니다. 이 과정에서, C# 2.0에서만 사용할 수 있는 확장 /reference 플래그 및 강력한 이름 지원 등의 다양한 컴파일러 옵션을 소개합니다.   

  • ClickOnce를 사용한 Windows Forms 응용 프로그램 배포

    ClickOnce 기술을 살펴보고 다른 배포 기술과 비교하며 사용 중인 응용 프로그램에서 이 기술을 사용하는 방법을 알아봅니다.   

  • Microsoft .NET Compact Framework용 배포 패턴

    Microsoft .NET Compact Framework를 사용하여 작성한 응용 프로그램을 배포하는 데 적용할 수 있는 패턴을 설명합니다.   

  • 속성, 명령 및 이벤트

    최신 "Avalon" 릴리스에서 사용할 수 있는 속성, 명령 및 이벤트를 통해 확장/축소 컨트롤을 빌드하는 방법을 소개합니다.   

  • Visual Studio Tools for Office, 버전 2003을 사용한 전문 주식 배당 시스템 구축

    Visual Studio Tools for Office(VSTO), 버전 2003을 사용하여 Microsoft Visual Basic .NET에서 Microsoft Excel 주식 배당 솔루션을 만드는 방법을 알아봅니다.   

  • ADO.NET 2.0의 새로운 DataSet 기능

    DataSet .NET Framework 클래스 및 이 클래스와 밀접하게 관련된 클래스의 새로운 ADO.NET 2.0 기능에 대해 살펴봅니다.   

  • 명령 프롬프트에서 Visual C++ Toolkit 2003 사용하기

    Visual C++ Toolkit 2003과 함께 제공되는 Microsoft Visual C++ 컴파일러를 명령줄에서 사용하는 방법을 설명합니다.   

  • C# 2.0에서 편집하며 계속하기 기능 사용

    Visual C# 2005의 새로운 디버깅 기능인 편집하며 계속하기를 사용하는 방법에 대해 간략하게 설명합니다.   

  • 그래픽 및 꾸밈형 글꼴로 Office 2003 리서치 서비스 향상

    개발자는 적절한 그래픽 및 꾸밈형 글꼴를 사용하여 리서치 작업창에 결과를 표시함으로써 Microsoft Office 2003 리서치 서비스 기능을 향상시킬 수 있습니다. 이 기사에서는 이러한 기술을 사용하여 전자 상거래 리서치 서비스에서 효과적으로 제품 브랜드를 알리는 방법을 보여 줍니다.   

  • ASP.NET 2.0 지역화 기능: 웹 응용 프로그램 지역화에 대한 새로운 접근

    ASP.NET 2.0을 사용하면 다양한 culture 및 로캘을 지원하는 응용 프로그램을 손쉽게 만들 수 있습니다.   

  • 유효성 검사 컨트롤의 동적 생성

    사용자 입력 컨트롤에 자동으로 적용되는 ASP.NET 유효성 검사 컨트롤의 동적 생성을 제어할 XML 구성 파일 사용 방법에 대해 설명합니다.   

  • Visual Basic 2005의 언어 향상

    새롭게 향상된 Visual Basic 2005의 여러 가지 기능을 알아보고 간단한 코드 조각을 제공하여 이러한 여러 기능이 작동하는 방법을 보여 줍니다.   

  • ADO.NET 2.0의 XML 데이터 형식 지원: SQL Server 2005에서 XML 처리하기

    Microsoft ADO.NET 2.0 및 Microsoft SQL Server 2005의 향상된 XML 지원을 함께 사용하여 응용 프로그램의 XML 데이터를 보다 쉽게 처리할 수 있는 방법에 대해 알아봅니다.   

  • .NET 개발자의 관점에서 파악한 Word 개체 모델

    Microsoft Visual Studio Tools for the Microsoft Office System(VSTO)을 이용하여 Microsoft Office Word 2003에서 제공되는 개체를 활용하는 방법을 설명합니다.   

  • .NET 개발자의 관점에서 파악한 Excel 개체 모델

    Microsoft Office Excel 2003에서 제공되는 개체 중 일부를 설명하고 이를 사용하여 Microsoft Visual Studio Tools for the Microsoft Office System(VSTO)와 함께 관리되는 코드 솔루션을 만드는 방법을 설명합니다.   

  • WSE 2.0 및 Sun JWSDP 1.4를 사용한 WS-Security 상호 운용성

    이 기사에서는 Microsoft WSE 2.0 및 Sun JWSDP 1.4 간의 WS-Security 상호 운용성을 설명합니다.   

  • Navision에 메시지 보내기: Navision과의 상호 작용

    ERP를 다른 기술과 통합하는 것이 불가능하다는 점에서 많은 사람들이 Navision을 폐쇄형 응용 프로그램으로 인식하고 있습니다. 이 기사의 주된 목적은 이러한 인식이 잘못되었다는 것을 보여 주는 데 있습니다.   

  • 리플렉션을 사용하여 비즈니스 개체를 ASP.NET 폼 컨트롤에 바인딩

    리플렉션을 사용하여 단 한 줄의 코드로 비즈니스 개체를 ASP.NET Web Forms에 바인딩하면 복잡한 작업이 단순해지고 오류가 줄어듭니다.   

  • HTTP 모듈과 처리기를 사용하여 플러그형 ASP.NET 구성 요소 만들기

    이 기사에서는 Scott Mitchell과 Atif Aziz가 HTTP 모듈과 처리기를 사용하여 오류 로깅을 ASP.NET 응용 프로그램에 추가하는 방법에 대해 설명합니다.   

  • 13가지 주의 사항: Visual C++ .NET 프로그램을 Visual Studio 2005로 이식하기 전에 알아야 할 13가지 내용

    개발자가 응용 프로그램을 Microsoft Visual Studio 2005로 이식할 때 주의해야 할 내용에 대해 Stan Lippman이 소개합니다.   

  • .NET 및 WinFX로 이동: C/C++ 응용 프로그램을 위한 로드맵

    이 기사는 새 응용 프로그램이나 기존 응용 프로그램에서 현재 Microsoft .NET Framework를 사용하지 않고 있는 C++ 프로그래머를 위한 것입니다.   

  • Microsoft Office System에서 ADO.NET DataSet 사용

    이 문서에서는 Microsoft Office System에서 응용 프로그램에 사용하기 위해 ADO.NET DataSet 개체를 만들고 이를 통해 Office 솔루션과 ADO.NET 사이에 필수적인 연결을 만드는 방법에 대해 설명합니다.   

  • Visual Studio Tools for Office : VSTO를 사용하여 Excel에서 웹 서비스 액세스

    Microsoft Visual Studio Tools for Office : VSTO를 사용하여 주식 정보 웹 서비스를 Excel 2003 워크시트에 통합하는 방법을 보여줍니다.   

  • .NET 개발자를 위해 쉽게 만들어진 스마트 문서

    이 문서에서는 관리되는 래퍼인 Vertigo Managed Smart Documents Wrapper와 Microsoft Visual Studio .NET 2003 프로젝트 서식 파일 세트에 대해 설명합니다.   

  • SQL Server Data Mining: 플러그 인 알고리즘

    SQL Server 2005 Data Mining을 사용하여 알고리즘 수준에서 직접 집계하는 방법을 설명합니다. 이 기능은 타사 알고리즘 개발자가 언어 및 데이터 형식 면에서 지원할 수 있는 대상을 제한하지만, 핵심 데이터 마이닝 알고리즘 구현의 최상위 수준에서 데이터 처리, 구문 분석, 메타데이터 관리, 세션 및 행 집합 작성 코드를 구현해야 하는 개발자의 부담을 덜어줍니다.   

  • Schematron을 사용하여 XML 문서 유효성 검사 향상

    Dare Obasanjo는 Schematron XML 유효성 검사 언어를 사용하여 W3C XML 스키마 기능 이상으로 XML 문서에서 제약 조건을 적용하는 방법에 대해 설명합니다.   

  • ADO.NET DataSet를 Reporting Services 데이터 원본으로 사용

    ADO.NET DataSet를 데이터 원본으로 사용할 수 있도록 하는 Reporting Services의 데이터 처리 확장을 구축하는 방법에 대해 설명합니다.   

  • Office 2003 Edition용 Research Service Development Extras 도구 키트 시작

    Microsoft Office Research Service Development Extras 도구 키트는 Microsoft Office 2003용 리서치 서비스 구축을 최대한 경험할 수 있도록 여러 가지 도구 및 샘플 코드를 제공합니다. 네 개 기사 중 하나인 이 기사에서는 Research Services Development Extras 도구 키트와 함께 제공되는 항목에 관해 설명하고 자세한 정보를 볼 수 있는 관련 문서 및 사이트를 소개합니다.   

  • SQL Server 2005 데이터 변환 서비스의 퍼지 조회 및 퍼지 그룹화

    본 문서에서는 SQL Server 2005 DTS(데이터 변환 서비스)의 퍼지 조회 변환 및 퍼지 그룹화 변환에 대해 설명합니다.   

  • 더욱 탄탄한 기초 위에 ASP.NET 페이지 작성하기

    상속을 통해 Page 클래스 등의 공통 Microsoft ASP.NET 클래스에 기능을 추가할 수 있습니다. 그러면 공통 장소에 기능을 추가하고 이를 모든 페이지에서 사용하도록 할 수 있습니다. 이 기사에서 Dino는 페이지 새로 고침 처리, 긴 프로세스 지원 및 포커스 제어를 Page 클래스에 추가합니다.   

  • ADO.NET 및 Oracle을 통한 고급 데이터 액세스

    ADO.NET 1.1을 사용하여 복잡한 Oracle 데이터 형식에서 데이터를 검색하는 방법을 살펴봅니다.   

  • Visual Studio Tools for Office, Version 2005를 사용한 Excel 구매서 응용 프로그램 구축

    Microsoft Visual Studio Tools for the Microsoft Office System, Version 2005 베타 1과 Microsoft Visual Studio, Version 2005 베타 1을 사용해 Microsoft Visual C#로 작성된 Excel 구매서 솔루션의 데모를 볼 수 있습니다.   

  • 콘텐츠 순환의 묘미

    Duncan Mackenzie가 ASP.NET의 간단한 "콘텐츠 순환" 작성에 대해 설명합니다.   

  • ASP.NET 2.0의 마스터 페이지

    마스터 페이지에서는 일관된 주제와 스타일을 따르는 ASP.NET 페이지를 만들 수 있습니다. Stephen Walther기 이 새로운 기능을 활용하는 방법을 설명합니다.   

  • ASP.NET 2.0 내부 변경 사항

    ASP.NET 2.0은 이전 버전인 ASP.NET 1.1과 완벽하게 호환되지만, ASP.NET의 많은 요소들이 내부적으로 변경되었습니다. 변경된 요소에는 코드 모델, 컴파일, 페이지 주기 등이 있습니다. 이 기사에서는 이러한 변경 사항에 대해 간단히 설명합니다.   

  • ADO.NET 2.0의 스키마

    데이터 원본에서 메타데이터에 액세스하기 위한 ADO.NET 2.0의 향상된 지원 기능에 대해 알아봅니다.   

  • Office용 Visual Studio 도구 , 버전 2005의 새 기능

    Microsoft Office System용 Microsoft Visual Studio 도구, 버전 2005 베타 1에는 Microsoft Office System용 Visual Studio 도구, 버전 2003에는 없는 새로운 기능이 추가되었습니다. 이 새로운 기능은 프로젝트 시스템, Microsoft Office Word 2003 및 Microsoft Office Excel 2003용 비주얼 디자이너, 보기 컨트롤, 작업창 지원, 비주얼 데이터 바인딩, 데이터 캐싱, 서버 쪽 프로그래밍입니다.   

  • InfoPath 2003에서 데이터 디지털 서명

    Microsoft Office InfoPath 2003 서비스 팩(SP) 1은 새로운 디지털 서명 기능과 함께 디지털 서명을 프로그래밍 방식으로 작업하기 위한 InfoPath 개체 모델의 추가 기능을 제공합니다.   

  • 데이터베이스 개발자를 위한 SQL Server 2005 개요

    이 기사에서는 Microsoft SQL Server 2005의 새로운 데이터베이스 개발 기능에 대한 개요를 제공합니다.   

  • ADO.NET 2.0 기능 매트릭스

    ADO.NET 2.0에는 새로운 기본 클래스 공급자 모델, 모든 공급자를 위한 기능 및 System.Data.SqlClient의 변경 사항이 포함되어 있습니다. 새 기능의 개요 및 사용 예제, 그리고 모든 공급자에게 공통적인 기능과 SqlClient 고유의 기능을 보여 주는 차트를 살펴보십시오.   

  • XML을 SQL로 변환: .NET Framework에서 SQLXML Bulkload 사용

    Amar Nalla가 RSS 피드 데이터를 데이터베이스에 분산시키는 .NET Framework 기반 응용 프로그램을 작성하여 XML 입력을 SQL 데이터로 변환하는 데 사용할 수 있는 SQLXML의 Bulkload 기능에 대해 설명합니다.   

  • WinFS 형식 시스템을 통한 WinFS 이해

    이 칼럼에서는 WinFS 플랫폼을 프로그래밍할 때 사용되는 형식 시스템에 대해 살펴봅니다. 다운로드할 수 있는 샘플에서는 WinFS API를 사용하여 WinFS 형식 시스템에서 작업하는 방법을 확인할 수 있습니다.   

  • 개발자를 위한 스마트폰 애플리케이션 보안 및 코드 서명 모델 방법에 대한 가이드

    스마트폰 애플리케이션 보안 모델과 관련해 애플리케이션 개발자가 이해해야 할 내용과 Windows Mobile 기반 스마트폰을 시장에 출시할 경우 무선 통신 사업자가 채택하고 있는 다양한 정책 선택에 대해 설명 드립니다.   

  • Windows XP 서비스 팩 2를 위한 웹 사이트 미세 조정

    웹 사이트가 ActiveX 컨트롤, 파일 다운로드, 팝업 창 등에 영향을 미치는 Windows XP SP2의 새로운 보안 기능들과 제대로 동작할 수 있도록 필요한 사항들을 조정하십시오.   

  • Office: Office 개발의 이해

    Microsoft Office System은 강력한 통합 프로그램, 서버 및 서비스 모음을 제공하므로 개발자들은 효율적인 프로세스 및 사용자 간의 신속하고 편리한 정보 연결을 가능하게 만들어 주는 완벽한 비즈니스 솔루션을 구축할 수 있습니다.   

  • Information Bridge Framework

    Information Bridge Framework는 개발자의 개발 비용을 절감하고 Microsoft Office 기반 정보 통합 솔루션의 유연성, 관리성, 보안성 및 확장성을 향상시켜 줍니다.   

  • XML : XPath와 XmlReader의 최고의 기능 결합

    Dare Obasanjo가 XPath를 인식하는 XmlReader를 사용하여 효율적으로 대형 XML 문서를 필터링 및 처리할 수 있는 XPathReader에 대해 설명합니다. XPathReader를 사용하면 대형 문서를 순차적으로 처리하고 XPath 식에 의해 일치하는 식별된 하위 트리를 추출할 수 있습니다.   

  • Visual Studio : Visual Studio 2005 Class Designer

    Visual Studio Class Designer를 사용하면 클래스 구조와 관계를 시각화하고 시각 디자인 환경에서 새 클래스를 만들고 클래스를 쉽게 refactor할 수 있습니다. 이 백서에서는 이러한 작업에 대해 설명합니다.   

  • Visual Studio : Visual Studio 2005 Team System: 배포용 분산 시스템 디자인

    Visual Studio 2005 Team System에서 분산 응용 프로그램을 만드는 데 사용할 수 있는 소프트웨어 디자인 도구에 대해 설명합니다.   

  • Visual C++ : .NET Framework의 관리되는 응용 프로그램 쓰기

    C++ 프로그래머를 위한 기능 중 일부를 보여 주며, .NET Framework와 함께 제공되는 BCL(기본 클래스 라이브러리)을 사용하여 얻을 수 있는 일부 생산성 이점에 대해 설명합니다.   

  • Visual C++ : 런타임 및 컴파일 시의 보안 검사

    개발자가 응용 프로그램의 견고성과 보안을 향상시킬 수 있도록 하는 Visual C++ 컴파일러 및 라이브러리 기능을 설명합니다.   

  • Visual C++ : Visual C++ 최적화 개요

    Visual C++ 2003 컴파일러에서 제공하는 다양한 코드 최적화 기능 중 몇 가지를 설명합니다.   

  • Visual C++ : C++의 ISO 표준 준수

    Visual C++를 사용하여 .NET Framework를 C++ 응용 프로그램에 통합하는 방법을 보여 줍니다.   

  • Mobile & Embedded : 화면 방향 인식 응용 프로그램 개발

    Windows Mobile 기반 장치에서 세로 및 가로 모드를 표시하는 방법, 이 기능의 배경, 이 기능을 사용할 수 있는 모바일 응용 프로그램 개발 정보, 그리고 제안 사항과 예제가 포함된 새 개발자 지침에 대해 알아 봅니다.   

  • ASP.NET : ASP.NET의 정규식

    정규식은 텍스트로 작업할 때 매우 유용한 도구입니다. 사용자 입력의 유효성을 검사해야 하거나, 문자열 내의 패턴을 검색해야 하거나, 효과적으로 텍스트 서식을 다시 지정해야 할 경우 정규식을 사용하면 좋습니다.   

  • .NET : .NET Enterprise Services 성능

    다른 활성화 및 호출 패턴에 적용될 때의 원시 COM+ 및 .NET Enterprise Services 구성 요소 성능을 확인합니다. .NET Enterprise Services 구성 요소를 C++의 COM+ 구성 요소처럼 빨리 실행하기 위한 지침과 함께 고성능 .NET Enterprise Service 구성 요소를 만드는 데 도움이 되는 주요 권장 사항을 살펴봅니다.   

  • SQL : SQL Server 연결 기본 사항

    SQL Server 2000 클라이언트는 API 스택, 개체 라이브러리 및 프로토콜을 사용하여 SQL Server에 연결됩니다. Ken Henderson이 각 요소를 하나씩 살펴보고 동작 원리와 상호 운용되는 방법을 설명합니다.   

  • Windows : 깜박이 부서

    곧 발표될 Windows 운영 체제 'Longhorn' 릴리스의 프레젠테이션 하위 시스템인 'Avalon'의 낮은 수준 렌더링 기술인 미디어 통합 계층에 대해 설명합니다.   

  • 기타 : 새롭게 대두되는 스마트 클라이언트

    최근 수 년간 웹 응용 프로그램에 지대한 관심이 모아지면서, 클라이언트의 향상과 함께 클라이언트 쪽 개발에 대해 다시 연구해야 할 필요성이 대두되었습니다. Microsoft 지역 담당 이사들이 저술하는 이 새 칼럼 .NET in the Real World에서 Billy Hollis가 스마트 클라이언트에 대해 설명하고 현재 스마트 클라이언트를 사용하여 응용 프로그램을 빌드하는 방법을 설명합니다.   

  • 기타 : WinFS 101: 새 Windows 파일 시스템 소개

    Tom Rizzo가 새 'Longhorn' 저장소 하위 시스템(코드 이름: 'WinFS')이 필요한 이유, WinFS에서 데이터 오버로드 문제를 해결하는 방법 및 앞으로 여러 달에 걸쳐 칼럼에서 연재할 내용에 대해 간략하게 설명하면서 새 칼럼을 시작합니다.   

  • Visual C++ : 응용 프로그램의 private 개체 보안 기술

    Windows 운영 체제의 다양한 보안 기능을 응용 프로그램에서 사용하려는 경우 Windows 보안 인증의 기본 기능을 사용하여 보안 설명자를 직접 만들 수 있습니다.   

  • Visual C++ : Microsoft Visual C++ 2005를 사용한 프로필 기준 최적화

    응용 프로그램을 실제 고객 시나리오에 맞게 조정할 수 있는 강력한 새 기능인 Microsoft Visual C++ 2005(이전의 Visual C++ 'Whidbey')의 프로필 기준 최적화(profile-guided optimization)에 대해 설명합니다. 실제로 20% 이상 성능을 향상시킬 수 있습니다.   

  • Visual C# : 사용자 지정 유효성 검사 구성 요소 라이브러리로 Windows Forms 확장

    데이터 유효성 검사는 명확한 데이터 캡처 및 후속 처리와 보고 작업에 핵심적인 단계입니다. 이 기사에서는 Windows Forms를 기초로 하는 프로그래밍 방식 유효성 검사 인프라를 살펴봅니다. 또한 그러한 기본 정보를 통해 ASP.NET의 유효성 검사 컨트롤을 사용하는 것과 유사한 보다 생산적인 유효성 검사 환경을 제공하도록 디자인된 사용자 지정 유효성 검사 구성 요소 라이브러리를 개발하는 방법을 설명합니다.   

  • Windows Forms 자동화

    Name 속성을 사용하여 Microsoft Windows Forms 컨트롤을 고유하게 식별하는 방법을 살펴봅니다. Windows Forms를 처리하도록 Visual Test를 업그레이드하는 방법에 대해서도 설명합니다. 이 문서에 있는 소스 코드를 적용하여 기존 자동화 프레임워크를 유사한 방법으로 업그레이드할 수 있습니다. 이 문서에는 Windows Forms에서 기본적으로 지원하지 않는 일부 Microsoft Win32 API도 있습니다. 이 문서가 Windows Forms를 자동화하는 완전한 단일 솔루션, Windows Forms 컨트롤에서 작동하지 않는 모든 Visual Test 메서드를 위한 대체 메서드, Visual Test에 상응하는 항목이 없는 Windows Forms 컨트롤을 자동화하기 위한 Visual Test 유사 인터페이스를 제공하는 것은 아닙니다.   

  • SQL : .NET 개발자를 위한 저장 프로시저 평가

    .NET 프로그래밍 언어를 주로 사용하는 개발자를 위해 SQL Server 저장 프로시저를 소개합니다. 저장 프로시저 사용의 장단점을 비롯하여 Microsoft Visual Studio .NET 2003에서 제공하는 저장 프로시저 작업 도구의 개요를 살펴보고 몇 가지 유용한 예제를 배워 봅니다.   

  • SQL : SQL Server 'Yukon' 전체 텍스트 검색: 기본 기능 및 향상된 기능

    개발자 및 데이터베이스 관리자를 위한 SQL Server 'Yukon' 전체 텍스트 검색의 장점 및 새 기능을 살펴봅니다.   

  • ASP.NET : ASP.NET Whidbey의 향상된 캐싱 기능

    ASP.NET Whidbey에서 사용할 수 있는 새 캐싱 기능을 살펴봅니다. ASP.NET 응용 프로그램 개발자는 이 캐싱 기능을 사용하여 차세대 ASP.NET 응용 프로그램의 성능을 크게 향상시킬 수 있습니다.   

  • Office : Word 2003 및 Visual Basic .NET을 사용하여 사용자 지정 맞춤법 검사기 만들기

    Microsoft Office Word 2003의 개체 및 메서드를 사용하여 강력한 응용 프로그램을 만들 수 있습니다. 이 기사에서는 Word 개체 모델과 Microsoft Visual Basic .NET을 함께 사용하여 간단한 맞춤법 검사기를 만드는 방법을 설명합니다. 이 맞춤법 검사기의 기능을 응용 프로그램에 추가할 수 있습니다.   

  • XML : .NET Framework에서 XML을 표시하는 방법에 대한 유용한 정보

    Dare Obasanjo가 단일 프로세스의 구성 요소와 AppDomain 간에 공유되는 XML 기반 데이터를 표시하는 데 사용할 수 있는 옵션을 살펴 보고 각 방법의 디자인 장단점에 대해 설명합니다.   

Posted by tornado
|

LG - CD-RW GEC-8230B

네로 6.6.0.1 버전 실행시 nero express 넘어가는 과정에서 꺼지는 군요~ --;;

win xp 에서 모든과정 아주 잘됨.

네로 6.3.0.2 버전 에서는 다른건 되는데 영화굽기가 않되네요.

5.x 대 버전도 않되고.

여기저기 검색해봐도 명확한 답이 없네요.. ?



    
  0% 0% (0명중)
: 윈2003 웹에디션에서 인터넷 공유 안되나요?
: 서비스 설정에 대해서요..

(총 3건) ※ 타 회원에 대한 욕설이나 비방은 예고없이 삭제됩니다
 
공태영 (kong3306) | 2004-11-08 오전 8:38수정 | 삭제
어쩜 저랑 똑같은 증상입니까? 검색하다가 같은 질문이길래 반가워했는데 명쾌한 답글이 하나도 없어서...원인 찾으시면 저한테도 알려주세요....
공태영 (kong3306) | 2004-11-19 오전 8:40수정 | 삭제
아직 해결 못보셨나여? 그럼 저한테 연락 주세요....
김지웅 (jwkimc21) | 2004-12-19 오전 12:15수정 | 삭제
C:\Program Files\Common Files\Ahead\AudioPlugins\ 폴더및에
msa.dll 화일을 지우거나 다른이름으로 수정하면 아무 문제없이 실행됩니다!
Posted by tornado
|

checked+ 옵션

.NET 2005. 5. 24. 12:36

Professional C#  책 보다가..

 

자바 byte 는 -128 ~ 127 까지 나온다.

 

byte b = 0;

 

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

    System.out.println(b++);

}

 

자바에서 이 코드는 127 이후의 연산은 -128, -127, -126 .. 이런식으로 계산 된다.

런타임에서도 체크가 안되고.. 값을 찍어봐야 한다. 짜증이쥐 -.-;

 

C# 에서는 checked 라는게 있다.

 

using System;

public class OverFlowCheck{
 public static void Main(){
  sbyte b = 0;
  

  for(int i = 0; i < 130; i++)
  { 
   checked
   {
    b++;
    Console.WriteLine("value : {0}" , b);
   }
  }
  
 }
}

 

이 코드는 실행시에 overflow 를 알려준다.

또는 checked{} 부분을 없애고..

컴파일 시에

csc /checked+ XXX.cs 라고 컴파일하고 실행하게 되면

다시 overflow 를 알려준다.

 

자바 byte 는 c# 의 sbyte 랑 같은거임 ...

 

편리한 기능이 너무너무 많음 ...

 

 

 

Posted by tornado
|
Posted by tornado
|

다들 만나서 너무너무 반가웠습니다~~~~

그리고 다들 점점 잘 풀려가고 있는거 같아 제 마음이 뿌듯~~ 했네요 ^^

 

먼저 존칭 생략하고...

박종복 / 서용원 / 조대훈 / 전지현 / 유희성

 

이렇게 다섯명 만나서... 교대 곱창집에서... 곱창 먹고... 밥비벼 먹고...

맥주 한잔 하고... 집에 왔음 ..

 

곱창 열라 맛있었음....

 

2차로 갔던 맥주집은 안주가 3000 원 ㅡㅡ;

좀 삐리리하긴 하더만 ㅋ..

빳빳한 노가리 -.-; 

담에는 마장동 육회 강력추천 합니다...

 

 

 

'이것저것 > 낙서장' 카테고리의 다른 글

[펌] [펌 귀여운 고양이 ㅋㅋ;;  (0) 2005.05.26
만원 충전 ^^  (0) 2005.05.26
책 사따 -.-;;  (3) 2005.05.18
netbeans 로 바꿔따..  (0) 2005.05.18
[펌] 직급  (0) 2005.05.16
Posted by tornado
|

MySQL 1067 에러...

SQL 2005. 5. 20. 16:13

오늘 .NET 2003 깔았다.

기존에 회사 내부 인트라넷이 MySQL 로 되어있어서... MySQL 을 계속 사용해야 한다.

포맷하고.. 닷넷 서버 깔고... MySQL 깔고 ... 서비스 시작하려니..

MySQL 1067 에러 발생...

 

c:/Windows 디렉토리에 my.ini 파일이 없다 .... 당근 없쥐..

 

그래서 아래와 같이 생성...

 

[WinMySQLAdmin]
Server=D:/mysql/bin/mysqld-max.exe
[mysqld]
basedir=D:/mysql
datadir=D:/mysql/data

 

 

저장하고...

d:/mysql/bin 디렉토리에 가서

mysqld-max-nt --install

 

한 담에..

net start mysql  

 

1067 에러 해결....

Posted by tornado
|
질문: 메신저 7.0으로 업댓하고 나니 로그인이 안됩니다. landofoz / 2005-04-19 12:17

MSN메신저를 7.0을 깔고나니

죄송합니다. 지금은 MSN Messenger에 로그인 할 수 없습니다. 나중에 다시 시도해 주세요. 80072efd

이런 메세지가 뜨더라구요..

여태 잘 쓰고 있었는데.. 로그인이 안되네요..

몇번을 삭제하고 다시 깔아도 안되네요..

왜 그럴까요~ T_T

답변: re: 메신저 7.0으로 업댓하고 나니 로그인이 안됩니다. shawncha00 / 2005-04-15 23:24
인증서 캐시를 지우시고 DLL 파일 사전 등록 하시면 됩니다.먼저 메신저를 종료 합니다. (작업표시줄에 있는 메신저 아이콘까지 종료)작업표시줄 시작 > 제어판 > 네트워크 연결 설정 또는 변경 > 내용탭 > ...


Posted by tornado
|

C# 1일째...

클래스 패스 잡고.. 책의 첫 예제를 해봤다..

역시나... 에러 발생....

 

D:\dotnet\ex>csc /t:exe TestApp.cs
Microsoft (R) Visual C# .NET Compiler version 7.10.6001.4
for Microsoft (R) .NET Framework version 1.1.4322
Copyright (C) Microsoft Corporation 2001-2002. All rights reserved.

error CS5001: 'd:\dotnet\ex\TestApp.exe' 프로그램에 정의된 진입점이 없습니다.

 

이런 에러 발생 ㅡㅡ

 

뭔가 봤더니..

 

Java App 하던 버릇때문에...

public static void main   <---- 자바는 메서드 이름이 소문자로 시작...

 

근데 C# 은...

public static void Main <-- 대문자 시작 ㅡㅡ

 

간단하게 첫 삽질을 시작했다

'.NET' 카테고리의 다른 글

.NET 2003 서버에 SQL 서버 설치시 문제발생!!  (0) 2005.05.25
[링크] 조타..  (0) 2005.05.25
[펌] MSDN 라이브러리  (0) 2005.05.25
checked+ 옵션  (0) 2005.05.24
[펌] Web Application Stress 테스트 사용방법  (0) 2005.05.16
Posted by tornado
|

 

내돈 ㅜㅜ;;

'이것저것 > 낙서장' 카테고리의 다른 글

만원 충전 ^^  (0) 2005.05.26
[축] 금요일 교대 회동  (2) 2005.05.21
netbeans 로 바꿔따..  (0) 2005.05.18
[펌] 직급  (0) 2005.05.16
7000 히트 이벤트!!!  (2) 2005.05.13
Posted by tornado
|

Opus - Live Is Life
 
랄랄라 랄라라 랄라 랄라라        
자 모두 다같이        

랄라 랄라라 랄라 랄라라  
랄라 랄라라 랄라 랄라라  

살맛 나는 게 인생이야        
그게 인생이야        
살아 움직이는 거야        
인생에 대해 얘기해보자고...        

우리는 모두가 힘을 가졌을 때
우리는 최선을 다하는 거야
주어진 순간마다 말이야,
남은 인생은 생각하지마        
그러면 우리 모드는
힘을 얻을 수 있어
우리 모두는 최선을 다하는 거야   
모든 노래를 모두가 부르는 거야       

살맛 나는 게 인생이야        
그게 인생이야        
살아 움직이는 거야    
인생에 대해 얘기해보자고...          

살맛 나는 게 인생이야,
우리 모두는 힘을 느끼는 거야
살맛 나는 게 인생이야,
어서 일어나 춤을 춰봐        
살맛 나는 게 인생이야,
살아가고 있는 느낌을 줘봐       
살맛 나는 게 인생이야,
그건 최고의 기분일 거야        

우리는 모두가 힘을 가졌을 때
우리는 최선을 다하는 거야
주어진 순간마다 말이야,
남은 인생은 생각하지마  
그러면 우리 모드는 힘을 얻을 수 있어
우리 모두는
최선을 다하는 거야        
모든 노래를 모두가 부르는 거야        

반복
모든 것이 끝났을 땐,
우리 모두는 최선을 다하는 거야
다가올 미래의 매 순간들은
최선에 대한 하나의 추억이지
우리 모두가 힘을 얻었고,
우리 모두가 최선을 다했기에
모든 노래를...
모두가 부르는 거야        
모두 노래하자고...        
인생은 그래서 살맛 나는거지
 
Nanananana        
Nanananana (all together now)
        
Nanananana        
Nanananana        

Life - nanananana        
Life is life - nanananana        
Dabadababa life - nanananana        
Life - nanananana        

When we all get the power,
we all get the best        
And every minute of an hour
we'll think about the rest
And you all get the power,
you all get the best        
When everyone gets everything
and every song, Everybody sings        

Life is life - nanananana        
Life is life - nanananana        
Life is life - nanananana        
Dadabababa life - nanananana        

Life is life,
and we all feel the power       
Life is life,
get up, stand up and dance   
Life is life,
when the feeling of the people
Life is life,
is the feeling of the best        

When we all get the power,
we all get the best        
And every minute of an hour
we'll think about the rest
And you all get the power,
you all get the best        
When everyone gets everything
and every song, Everybody sings        

반복
As the moment is over,
we call it the best 
Every minute of the future is
a memory of the best
'Cause we all gave the power,
we all gave the best
When everyone gets
everything and every song
Everybody sings:        
Life is life
Posted by tornado
|

이클립스 쓰다가.... 인텔리제이로 바꾸려 했다가....

넷빈즈로 와따...

첫 느낌은.... 일단 만족.......

 

회사 전체가 닷넷으로 바꿀 분위기인데...

몇일이나 쓰련지 ^^;

 

 

'이것저것 > 낙서장' 카테고리의 다른 글

[축] 금요일 교대 회동  (2) 2005.05.21
책 사따 -.-;;  (3) 2005.05.18
[펌] 직급  (0) 2005.05.16
7000 히트 이벤트!!!  (2) 2005.05.13
[펌] K리그- 골키퍼.. 너 이제 죽었네..=ㅅ=;  (0) 2005.05.12
Posted by tornado
|
JVM GC와 메모리 튜닝



모든 Java Application은 JVM(Java Virtual Machine)위에서 동작한다.
이 JVM이 동작하는데 있어서, 메모리의 구조와 특히 GC는 Application의 응답시간과 성능에 밀접한 관계를 미친다. 이번 강좌에서는 JVM 의 메모리 구조와 GC 알고리즘 (JDK 1.4.X에 포함된 새로운 알고리즘 포함) 그리고, JVM의 메모리 튜닝을 통한 Application의 성능향상방법에 대해서 알아보도록 하자.


1.GC란 무엇인가?


GC는 Garbage Collection의 약자로 Java 언어의 중요한 특징중의 하나이다.
GC는 Java Application에서 사용하지 않는 메모리를 자동으로 수거하는 기능을 말한다.
예전의 전통적인 언어 C등의 경우 malloc, free등을 이용해서 메모리를 할당하고, 일일이 그 메모리를 수거해줘야했다. 그러나 Java 언어에서는 GC 기술을 사용함에 따라서 개발자로 하여금 메모리 관리에서 부터 좀더 자유롭게 해주었다.


2.GC의 동작 방법은 어떻게 되는가?


1) JVM 메모리 영역

GC의 동작 방법을 이해하기 위해서는 Java의 메모리 구조를 먼저 이해할 필요가 있다.
일반적으로 Application에서 사용되는 객체는 오래 유지 되는 객체보다, 생성되고 얼마안있어서 사용되지 않는 경우가 많다. <그림 1 참조>


<그림 1. 메모리 foot print>


그래서 Java에서는 크게 두가지 영역으로 메모리를 나누는데 Young 영역과 Old 영역이 그것이다.
Young 영역은 생긴지 얼마 안된 객체들을 저장하는 장소이고, Old영역은 생성된지 오래된 객체를 저장하는 장소이다. 각 영역의 성격이 다른 만큼 GC의 방법도 다르다.
먼저 Java의 메모리 구조를 살펴보자.


<그림 2. Java 메모리 구조>


Java의 메모리 영역은 앞에서 이야기한 두 영역 (Young 영역,Old 영역)과 Perm 영역 이렇게 3가지로 영역으로 구성된다.


<표 1. Java 메모리 영역>



2) GC 알고리즘

그러면 이 메모리 영역을 JVM이 어떻게 관리하는지에 대해서 알아보자.
JVM은 New/Young 영역과, Old영역 이 두영역에 대해서만 GC를 수행한다. Perm영역은 앞에서 설명했듯이 Code가 올라가는 부분이기 때문에, GC가 일어날 필요가 없다. Perm영역은 Code가 모두 Load되고 나면 거의 일정한 수치를 유지한다.


○ Minor GC
먼저 New/Young영역의 GC방법을 살펴보자 New/Young 영역의 GC를 Minor GC라고 부르는데, New/Young영역은 Eden과 Survivor라는 두가지 영역으로 또 나뉘어 진다. Eden영역은 Java 객체가 생성되자 마자 저장이 되는곳이다. 이렇게 생성된 객체는 Minor GC가 발생할때 Survivor 영역으로 이동된다.

Survivor 영역은 Survivor 1과 Suvivor2 영역 두 영역으로 나뉘어 지는데, Minor GC가 발생하면 Eden과 Survivor1에 Alive되어 있는 객체를 Suvivor2로 복사한다. 그리고 Alive되어 있지 않는 객체는 자연히 Suvivor1에 남아있게 되고, Survivor1과 Eden영역을 Clear한다. (결과적으로 Alive된 객체만 Survivor2로 이동한것이다.)
다음번 Minor GC가 발생하면 같은 원리로 Eden과 Survivor2영역에서 Alive되어 있는 객체를 Survivor1에 복사한다. 계속 이런 방법을 반복적으로 수행하면서 Minor GC를 수행한다.

이렇게 Minor GC를 수행하다가, Survivor영역에서 오래된 객체는 Old영역으로 옮기게 된다.

이런 방식의 GC 알고리즘을 Copy & Scavenge라고 한다. 이 방법은 매우 속도가 빠르며 작은 크기의 메모리를 Collecting하는데 매우 효과적이다. Minor GC의 경우에는 자주 일어나기 때문에, GC에 소요되는 시간이 짧은 알고리즘이 적합하다.

이 내용을 그림을 보면서 살펴보도록 하자.


<그림 3-1. 1st Minor GC>


Eden에서 Alive된 객체를 Suvivor1으로 이동한다. Eden 영역을 Clear한다.


<그림 3-2. 2nd Minor GC>


Eden영역에 Alive된 객체와 Suvivor1영역에 Alive된 객체를 Survivor 2에 copy한다.
Eden영역과 Suvivor2영역을 clear한다.


<그림 3-3. 3rd Minor GC>


객체가 생성된 시간이 오래지나면 Eden과 Suvivor영역에 있는 오래된 객체들을 Old 영역으로 이동한다.


○ Full GC

Old 영역의 Garbage Collection을 Full GC라고 부르며, Full GC에 사용되는 알고리즘은 Mark & Compact라는 알고리즘을 이용한다. Mark & Compact 알고리즘은 전체 객체들의 reference를 쭉 따라가다면서 reference가 연결되지 않는 객체를 Mark한다. 이 작업이 끝나면 사용되지 않는 객체를 모두 Mark가 되고, 이 mark된 객체를 삭제한다.<그림 4 참고> (실제로는 compact라고 해서, mark된 객체로 생기는 부분을 unmark된 즉 사용하는 객체로 메꾸어 버리는 방법이다.)

Full GC는 매우 속도가 느리며, Full GC가 일어나는 도중에는 순간적으로 Java Application이 멈춰 버리기 때문에, Full GC가 일어나는 정도와 Full GC에 소요되는 시간은 Application의 성능과 안정성에 아주 큰 영향을 준다.


<그림 4. Full GC>




3. GC가 왜 중요한가?


Garbage Collection중에서 Minor GC의 경우 보통 0.5초 이내에 끝나기 때문에 큰문제가 되지 않는다. 그러나 Full GC의 경우 보통 수초가 소요가 되고, Full GC동안에는 Java Application이 멈춰버리기 때문에 문제가 될 수 있다.
예를 들어 게임 서버와 같은 Real Time Server를 구현을 했을때, Full GC가 일어나서 5초동안 시스템이 멈춘다고 생각해보자.
또 일반 WAS에서도 5~10초동안 멈추면, 멈추는동안의 사용자의 Request가 Queue에 저장되었다가 Full GC가 끝난후에 그 요청이 한꺼번에 들어오게 되면 과부하에 의한 여러 장애를 만들 수 있다..
그래서 원할한 서비스를 위해서는 GC를 어떻게 일어나게 하느냐가 시스템의 안정성과 성능에 큰 변수로 작용할 수 있다.


4. 다양한 GC 알고리즘


앞에서 설명한 기본적인 GC방법 (Scavenge 와 Mark and compact)이외에 JVM에서는 좀더 다양한 GC 방법을 제공하고 그 동작방법이나 사용방법도 틀리다. 이번에는 다양한 GC 알고리즘에 대해서 알아보자. 현재 (JDK 1.4)까지 나와 있는 JVM의 GC방법은 크게 아래 4가지를 지원하고 있다.

- Default Collector
- Parallel GC for young generation (from JDK 1.4 )
- Concurrent GC for old generation (from JDK 1.4)
- Incremental GC (Train GC)

1) Default Collector
이 GC 방법은 앞에서 설명한 전통적인 GC방법으로 Minor GC에 Scavenge를, Full GC에 Mark & compact 알고리즘을 사용하는 방법이다. 이 알고리즘에는 이미 앞에서 설명했기 때문에 별도의 설명을 하지는 않는다.

JDK 1.4에서부터 새로 적용되는 GC방법은 Parallel GC와 Concurrent GC 두가지 방법이 있다. Parallel GC는 Minor GC를 좀더 빨리하게 하는 방법이고 (Throughput 위주) Concurrent GC는 Full GC시에 시스템의 멈춤(Pause)현상을 최소화하는 GC방법이다.

2) Parallel GC
JDK1.3까지 GC는 하나의 Thread에서 이루어진다. Java가 Multi Thread환경을 지원함에도 불구하고, 1 CPU에서는 동시에 하나의 Thread만을 수행할 수 밖에 없기때문에, 예전에는 하나의 CPU에서만 GC를 수행했지만, 근래에 들어서 하나의 CPU에서 동시에 여러개의 Thread를 실행할 수 있는 Hyper Threading기술이나, 여러개의 CPU를 동시에 장착한 HW의 보급으로 하나의 HW Box에서 동시에 여러개의 Thread를 수행할 수 있게 되었다.

JDK 1.4부터 지원되는 Parallel GC는 Minor GC를 동시에 여러개의 Thread를 이용해서 GC를 수행하는 방법으로 하나의 Thread를 이용하는것보다 훨씬 빨리 GC를 수행할 수 있다.


<그림 7. Parallel GC 개념도>


<그림 7> 을 보자 왼쪽의 Default GC방법은 GC가 일어날때 Thread들이 작업을 멈추고, GC를 수행하는 thread만 gc를 수행한다. (그림에서 파란영역), Parallel GC에서는 여러 thread들이 gc를 수행이 가능하기 때문에, gc에 소요되는 시간이 낮아진다.

Parallel GC가 언제나 유익한것은 아니다. 앞에서도 말했듯이 1CPU에서는 동시에 여러개의 thread를 실행할 수 없기 때문에 오히혀 Parallel GC가 Default GC에 비해서 느리다. 2 CPU에서도 Multi thread에 대한 지원이나 계산등을 위해서 CPU Power가 사용되기 때문에, 최소한 4CPU의 256M 정도의 메모리를 가지고 있는 HW에서 Parallel GC가 유용하게 사용된다.

Parallel GC는 크게 두가지 종류의 옵션을 가지고 있는데,Low-pause 방식과 Throughput 방식의 GC방식이 있다.

Solaris 기준에서 Low-pause Parallel GC는 ?XX:+UseParNewGC 옵션을 사용한다. 이 모델은 Old 영역을 GC할때 다음에 설명할 Concurrent GC방법과 함께 사용할 수 있다. 이 방법은 GC가 일어날때 빨리 GC하는것이 아니라 GC가 발생할때 Application이 멈춰지는 현상(pause)를 최소화하는데 역점을 뒀다.

Throughput 방식의 Parallel GC는 ?XX:+UseParallelGC (Solaris 기준) 옵션을 이용하며 Old 영역을 GC할때는 Default GC (Mark and compact)방법만을 사용하도록 되어 있다.Minor GC가 발생했을때, 되도록이면 빨리 수행하도록 throughput에 역점을 두었다.

그외에도 ParallelGC를 수행할때 동시에 몇개의 Thread를 이용하여 Minor영역을 Parallel GC할지를 결정할 수 있는데, -XX:ParallelGCThreads= 옵션을 이용하여 Parallel GC에 사용되는 Thread의 수를 지정할 수 있다.

3) Concurrent GC

앞에서도 설명했듯이, Full GC즉 Old 영역을 GC하는 경우에는 그 시간이 길고 Application이 순간적으로 멈춰버리기 때문에, 시스템 운용에 문제가 된다.

그래서 JDK1.4부터 제공하는 Concurrent GC는 기존의 이런 Full GC의 단점을 보완하기 위해서 Full GC에 의해서 Application이 멈추어 지는 현상을 최소화 하기 위한 GC방법이다.
Full GC에 소요되는 작업을 Application을 멈추고 진행하는것이 아니라, 일부는 Application이 돌아가는 단계에서 수행하고, 최소한의 작업만을 Application이 멈췄을때 수행하는 방법으로 Application이 멈추는 시간을 최소화한다.


<그림 8. Concurrent GC 개념도>


그림 8에서와 같이 Application이 수행중일때(붉은 라인) Full GC를 위한 작업을 수행한다. (Sweep,mark) Application을 멈추고 수행하는 작업은 일부분 (initial-mark, remark 작업)만을 수행하기 때문에, 기존 Default GC의 Mark & Sweep Collector에 비해서 Application이 멈추는 시간이 현저하게 줄어든다.

Solaris JVM에서는 -XX:+UseConcMarkSweepGC Parameter를 이용해 세팅한다.

4) Incremental GC (Train GC)

Incremental GC또는 Train GC라고도 불리는 GC방법은 JDK 1.3에서부터 지원된 GC방법이다. 앞에서 설명한 Concurrent GC와 비슷하게, 의도 자체는 Full GC에 의해서 Application이 멈추는 시간을 줄이고자 하는데 있다.

Incremental GC의 작동방법은 간단하다. Minor GC가 일어날때 마다 Old영역을 조금씩 GC를 해서 Full GC가 발생하는 횟수나 시간을 줄이는 방법이다.


<그림 9. Incremental GC 개념도>


그림 9에서 보듯이. 왼쪽의 Default GC는 FullGC가 일어난후에나 Old 영역이 Clear된다. 그러나, 오른쪽의 Incremental GC를 보면 Minor GC가 일어난후에, Old 영역이 일부 Collect된것을 볼 수 있다.

Incremental GC를 사용하는 방법은 JVM 옵션에 ?Xinc 옵션을 사용하면 된다.
Incremental GC는 많은 자원을 소모하고, Minor GC를 자주일으키고, 그리고 Incremental GC를 사용한다고 Full GC가 없어지거나 그 횟수가 획기적으로 줄어드는 것은 아니다. 오히려 느려지는 경우가 많다. 필히 테스트 후에 사용하도록 하자.

※ Default GC이외의 알고리즘은 Application의 형태나 HW Spec(CPU수, Hyper threading 지원 여부), 그리고 JVM 버전(JDK 1.4.1이냐 1.4.2냐)에 따라서 차이가 매우 크다. 이론상으로는 실제로 성능이 좋아보일 수 있으나, 운영환경에서는 여러 요인으로 인해서 기대했던것만큼의 성능이 안나올 수 있기 때문에, 실환경에서 미리 충분한 테스트를 거쳐서 검증한후에 사용해야 한다.


5. GC 로그는 어떻게 수집과 분석


JVM에서는 GC 상황에 대한 로그를 남기기 위해서 옵션을 제공하고 있다.
Java 옵션에 ?verbosegc 라는 옵션을 주면되고 HP Unix의 경우 ?verbosegc ?Xverbosegc 옵션을 주면 좀더 자세한 GC정보를 얻을 수 있다. GC 정보는 stdout으로 출력이 되기 때문에 “>” redirection등을 이용해서 file에 저장해놓고 분석할 수 있다.

Example ) java ?verbosegc MyApplication

그럼 실제로 나온 GC로그를 어떻게 보는지를 알아보자.


<그림 5. 일반적인 GC 로그, Windows, Solaris>


<그림 5>는 GC로그 결과를 모아논 내용이다. (실제로는 Application의 stdout으로 출력되는 내용과 섞여서 출력된다.)
Minor GC는 ”[GC “로 표기되고, Full GC는 “[Full GC”로 표기된다.
그 다음값은 Heap size before GC인데,GC 전에 Heap 사용량 ( New/Young 영역 + Old 영역 + Perm 영역)의 크기를 나타낸다.

Heap size after GC는 GC가 발생한후에 Heap의 사용량이다. Minor GC가 발생했을때는 Eden과 Survivor 영역으 GC가 됨으로 Heap size after GC는 Old영역의 용량과 유사하다.(Minor GC에서 GC되지 않은 하나의 Survivor영역내의 Object들의 크기도 포함해야한다.)

Total Heap Size는 현재 JVM이 사용하는 Heap Memory양이다. 이 크기는 Java에서 ?ms와 ?mx 옵션으로 조정이 가능한데. 예를 들어 ?ms512m ?mx1024m로 해놓으면 Java Heap은 메모리 사용량에 따라서 512~1024m사이의 크기에서 적절하게 늘었다 줄었다한다. (이 늘어나는 기준과 줄어드는 기준은 (-XX:MaxHeapFreeRatio와 ?XX:MinHeapFreeRation를 이용해서 조정할 수 있으나 JVM vendor에 따라서 차이가 나기때문에 각 vendor별 JVM 메뉴얼을 참고하기 바란다.) Parameter에 대한 이야기는 추후에 좀더 자세히하도록 하자.

그 다음값은 GC에 소요된 시간이다.

<그림 5>의 GC로그를 보면 Minor GC가 일어날때마다 약 20,000K 정도의 Collection이 일어난다. Minor GC는 Eden과 Suvivor영역 하나를 GC하는 것이기 때문에 New/Young 영역을 20,000Kbyte 정도로 생각할 수 있다.

Full GC때를 보면 약44,000Kbyte에서 1,749Kbyte로 GC가 되었음을 볼 수 있다. Old영역에 큰 데이타가 많지 않은 경우이다. Data를 많이 사용하는 Application의 경우 전체 Heap이 512이라고 가정할때, Full GC후에도 480M정도로 유지되는 경우가 있다. 이런 경우에는 실제로 Application에서 Memory를 많이 사용하고 있다고 판단할 수 있기 때문에 전체 Heap Size를 늘려줄 필요가 있다.

이렇게 수집된 GC로그는 다소 보기가 어렵기 때문에, 좀더 쉽게 분석할 수 있게 하기 위해서 GC로그를 awk 스크립트를 이용해서 정제하면 분석이 용이하다.


<표 2. gc.awk 스크립트>


이 스크립트를 작성한후에 Unix의 awk 명령을 이용해서

% awk ?f gc.awk GC로그파일명

을 쳐주면 아래<표 3>와 같이 정리된 형태로 GC 로그만 추출하여 보여준다.


<표 3. gc.awk 스크립트에 의해서 정재된 로그>


Minor와 Major는 각각 Minor GC와 Full GC가 일어날때 소요된 시간을 나타내며, Alive는 GC후에 남아있는 메모리양, 그리고 Freed는 GC에 의해서 collect된 메모리 양이다.

이 로그파일은 excel등을 이용하여 그래프등으로 변환해서 보면 좀더 다각적인 분석이 가능해진다.

※ JDK 1.4에서부터는 ?XX:+PrintGCDetails 옵션이 추가되어서 좀더 자세한 GC정보를 수집할 수 있다.


※ HP JVM의 GC Log 수집

HP JVM은 전체 heap 뿐 아니라 ?Xverbosegc 옵션을 통해서 Perm,Eden,Old등의 모든 영역에 대한 GC정보를 좀더 정확하게 수집할 수 있다.

Example ) java ?verbosegc ?Xverbosegc MyApplication ß (HP JVM Only)

HP JVM의 GC정보는 18개의 필드를 제공하는데 그 내용을 정리해보면 <표 4.>와 같다.

<GC : %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12 %13 %14 %15 %16 %17 %18>


<표 4. HP JVM GC 로그 필드별 의미>


이 로그를 직접 보면서 분석하기는 쉽지가 않다. 그래서, HP에서는 좀더 Visual한 환경에서 분석이 가능하도록 HPJtune이라는 툴을 제공한다. 다음 URL에서 다운로드 받을 수 있다.

http://www.hp.com/products1/unix/java/java2/hpjtune/index.html


<그림 6. HP Jtune을 이용해서 GC후 Old영역의 변화 추이를 모니터링하는 화면>




6. GC 관련 Parameter


GC관련 설정값을 보기전에 앞서서 ?X와 ?XX 옵션에 대해서 먼저 언급하자. 이 옵션들은 표준 옵션이 아니라, 벤더별 JVM에서 따로 제공하는 옵션이기 때문에, 예고 없이 변경되거나 없어질 수 있기 때문에, 사용전에 미리 JVM 벤더 홈페이지를 통해서 검증한다음에 사용해야한다.

1) 전체 Heap Size 조정 옵션

전체 Heap size는 ?ms와 ?mx로 Heap 사이즈의 영역을 조정할 수 있다. 예를 들어 ?ms512m ?mx 1024m로 설정하면 JVM은 전체 Heap size를 application의 상황에 따라서 512m~1024m byte 사이에서 사용하게 된다. 그림2의 Total heap size

메모리가 모자를때는 heap을 늘리고, 남을때는 heap을 줄이는 heap growing과 shirinking 작업을 수행하는데, 메모리 변화량이 큰 애플리케이션이 아니라면 이 min heap size와 max heap size는 동일하게 설정하는 것이 좋다. 일반적으로 1GB까지의 Heap을 설정하는데에는 문제가 없으나, 1GB가 넘는 대용량 메모리를 설정하고자 할 경우에는 별도의 JVM 옵션이 필요한 경우가 있기때문에 미리 자료를 참고할 필요가 있다.

※ IBM AIX JVM의 경우
%export LDR_CNTRL=MAXDATA=0x10000000
%java -Xms1500m -Xmx1500m MyApplication

2) Perm size 조정 옵션

Perm Size는 앞에서도 설명했듯이, Java Application 자체(Java class etc..)가 로딩되는 영역이다. J2EE application의 경우에는 application 자체의 크기가 큰 편에 속하기 때문에, Default로 설정된 Perm Size로는 application class가 loading되기에 모자른 경우가 대부분이기 때문에, WAS start초기나, 가동 초기에 Out Of Memory 에러를 유발하는 경우가 많다.

PermSize는 -XX:MaxPermSize=128m 식으로 지정할 수 있다.
일반적으로 WAS에서 PermSize는 64~256m 사이가 적절하다.

3) New 영역과 Old 영역의 조정New 영역은 ?XX:NewRatio=2 에 의해서 조정이 된다.
NewRatio Old/New Size의 값이다. 전체 Heap Size가 768일때, NewRatio=2이면 New영역이 256m, Old 영역이 512m 로 설정이 된다.
JVM 1.4.X에서는 ?XX:NewSize=128m 옵션을 이용해서 직접 New 영역의 크기를 지정하는 것이 가능하다.

4) Survivor 영역 조정 옵션
-XX:SurvivorRatio=64 (eden/survivor 의 비율) :64이면 eden 이 128m일때, survivor영역은 2m가 된다.

5) -server와 ?client 옵션
JVM에는 일반적으로 server와 client 두가지 옵션을 제공한다.
결론만 말하면 server 옵션은 WAS와 같은 Server환경에 최적화된 옵션이고, client옵션은 워드프로세서와 같은 client application에 최적화된 옵션이다. 그냥 언뜻 보기에는 단순한 옵션 하나로보일 수 있지만, 내부에서 돌아가는 hotspot compiler에 대한 최적화 방법과 메모리 구조자체가 아예 틀리다.

○ -server 옵션

server용 application에 최적화된 옵션이다. Server application은 boot up 시간 보다는 user에 대한 response time이 중요하고, 많은 사용자가 동시에 사용하기 때문에 session등의 user data를 다루는게 일반적이다. 그래서 server 옵션으로 제공되는 hotspot compiler는 java application을 최적화 해서 빠른 response time을 내는데 집중되어 있다.

또한 메모리 모델 역시, 서버의 경우에는 특정 사용자가 서버 운영시간동안 계속 서버를 사용하는게 아니기 때문에 (Login하고, 사용한 후에는 Logout되기 때문에..) 사용자에 관련된 객체들이 오래 지속되는 경우가 드물다. 그래서 상대적으로 Old영역이 작고 New 영역이 크게 배정된다. <그림 7. 참조 >

○ -client 옵션

client application은 워드프로세서 처럼 혼자 사용하는 application이다. 그래서 client application은 response time보다는 빨리 기동되는데에 최적화가 되어 있다. 또한대부분의 client application을 구성하는 object는GUI Component와 같이 application이 종료될때까지 남아있는 object의 비중이 높기 때문에 상대적으로 Old 영역의 비율이 높다.


<그림 7. ?server와 ?client 옵션에 따른 JVM Old와 New영역>


이 두옵션은 가장 간단한 옵션이지만, JVM의 최적화에 아주 큰부분을 차지하고 있는 옵션이기 때문에, 반드시 Application의 성격에 맞춰서 적용하기 바란다.
(※ 참고로, SUN JVM은 default가 client, HPJVM는 default가 server로 세팅되어 있다.)

○ GC 방식에 대한 옵션

GC 방식에 대한 옵션은 앞에서도 설명했지만, 일반적인 GC방식이외에, Concurrent GC,Parallel GC,Inceremental GC와 같이 추가적인 GC Algorithm이 존재한다. 옵션과 내용은 앞장에서 설명한 “다양한 GC알고리즘” 을 참고하기 바란다.


7.JVM GC 튜닝


그러면 이제부터 지금까지 설명한 내용을 기반으로 실제로 JVM 튜닝을 어떻게 하는지 알아보도록 하자.

STEP 1. Application의 종류와 튜닝목표값을 결정한다.

JVM 튜닝을 하기위해서 가장 중요한것은 JVM 튜닝의 목표를 설정하는것이다. 메모리를 적게 쓰는것이 목표인지, GC 횟수를 줄이는것이 목표인지, GC에 소요되는시간이 목표인지, Application의 성능(Throughput or response time) 향상인지를 먼저 정의한후에. 그 목표치에 근접하도록 JVM Parameter를 조정하는것이 필요하다.

STEP 2. Heap size와 Perm size를 설정한다.

-ms와 ?mx 옵션을 이용해서 Heap Size를 정한다. 일반적으로 server application인 경우에는 ms와 mx 사이즈를 같게 하는것이 Memory의 growing과 shrinking에 의한 불필요한 로드를 막을 수 있어서 권장할만하다.

ms와mx사이즈를 다르게 하는 경우는 Application의 시간대별 memory 사용량이 급격하게 변화가 있는 Application에 효과적이다.
PermSize는 JVM vendor에 따라 다소 차이가 있으나 일반적으로 16m정도이다. Client application의 경우에는 문제가 없을 수 있지만, J2EE Server Application의 경우 64~128m 사이로 사용이 된다.

Heap Size와 Perm Size는 아래 과정을 통해서 적정 수치를 얻어가야한다.

STEP 3. 테스트 & 로그 분석.

JVM Option에 GC 로그를 수집하기 위한 ?verbosegc 옵션을 적용한다. (HP의 경우 ?Xverbosegc 옵션을 적용한다.)

LoadRunner나 MS Strest(무료로 MS社의 홈페이지에서 다운로드 받을 수 있다.)와 같은 Strest Test툴을 통해서 Application에 Strest를 줘서. 그 log를 수집한다. 튜닝에서 있어서 가장 중요한것은 목표산정이지만, 그만큼이나 중요한것은 실제 Tuning한 Parameter가 Application에 어떤 영향을 주는지를 테스트하는 방법이 매우 중요하다. 그런 의미에서 적절한 Strest Tool의 선정과, Strest Test 시나리오는 정확한 Tuning을 위해서 매우 중요한 요인이다.

○ Perm size 조정
아래 그림8.은 HP JVM에서 ?Xverbosegc 옵션으로 수집한 GC log를 HP Jtune을 통해서 graph로 나타낸 그래프이다. 그림을 보면 Application이 startup되었을때 Perm 영역이 40m에서. 시간이 지난후에도 50m 이하로 유지되는것을 볼 수 있다. 특별하게 동적 classloading등이 수십m byte가 일어나지 않는등의 큰 변화요인이 없을때, 이 application의 적정 Perm 영역은 64m로 판단할 수 있다.


<그림 8. GC 결과중 Perm 영역 그래프>


○ GC Time 수행 시간 분석

다음은 GC에 걸린 시간을 분석해보자. 앞에 강좌 내용에서도 설명햇듯이. GC Tuning에서 중요한 부분중 하나가 GC에 소요되는 시간 특히 Full GC 시간이다.

지금부터 볼 Log는 모社의 물류 시스템의 WAS 시스템 GC Log이다. HP JVM을 사용하며, -server ?ms512m ?mx512m 옵션으로 기동되는 시스템이다.

그림 9를 보면 Peak 시간 (첫번째 동그라미) 14시간동안에 Full GC(동그란점)가 7번일어난것을 볼 수 있다. 각각에 걸린 시간은2.5~6sec 사이이다.
여기서 STEP 1.에서 설정한 AP Tuning의 목표치를 참고해야하는데.

Full GC가 길게 일어나서 Full GC에 수행되는 시간을 줄이고자 한다면 Old 영역을 줄이면 Full GC가 일어나는 횟수는 늘어나고, 반대로 Full GC가 일어나는 시간을 줄어들것이다.

반대로 Full GC가 일어나는 횟수가 많다면, Old 영역을 늘려주면 Full GC가 일어나는 횟수는 상대적으로 줄어들것이고 반대로 Full GC 수행시간이 늘어날 것이다.

특히 Server Application의 경우Full GC가 일어날때는 JVM자체가 멈춰버리기 때문에, 그림 9의 instance는 14시간동안 총 7번 시스템이 멈추고, 그때마다 2.5~6sec가량 시스템이 response를 못하는 상태가 된것이다. 그래서 멈춘 시간이 고객이 납득할만한 시간인지를 판단해야 하고, 거기에 적절한 Tuning을 해야한다.

Server Application에서 Full GC를 적게일어나게하고, Full GC 시간을 양쪽다 줄이기 위해서는 Old영역을 적게한후에, 여러개의 Instance를 동시에 뛰어서 Load Balancing을 해주면, Load가 분산되기 때문에 Full GC가 일어나는 횟수가 줄어들테고, Old 영역을 줄였기 때문에, Full GC에 드는 시간도 줄어들것이다. 또한 각각의 FullGC가 일어나는동안 하나의 서버 instance가 멈춰져 있어도, Load Balancing이 되는 다른 서버가 response를 하고 있기때문에, Full GC로 인한 Application이 멈추는것에 의한 영향을 최소화할 수 있다.


<그림 9. GC 소요시간>


데이타에 따라서 GC Tuning을 진행한후에는 다시 Strest Test를 진행해서 응답시간과 TPS(Throughput Per Second)를 체크해서 어떤 변화를 주었는지를 반드시 체크해봐야한다.


<그림 10. GC후의 Old 영역>


그림 10은 GC후에 Old 영역의 메모리 변화량을 나타낸다.

금요일 업무시간에 메모리 사용량이 올라가다가. 주말에가서 완만한 곡선을 그리는것을 볼 수 있다. 월요일 근무시간에 메모리 사용량이 매우 많고, 화요일에도 어느정도 메모리 사용량이 있는것을 볼 수 있다. 월요일에 메모리 사용량이 많은것을 볼때, 이 시스템의 사용자들이 월요일에 시스템 사용량이 많을 수 있다고 생각할 수 있고, 또는 다른 주의 로그를 분석해봤을때 이 주만 월요일 사용량이 많았다면, 특별한 요인이나 Application 변경등이 있었는지를 고려해봐야할것이다.

이 그래프만을 봤을때 Full GC가 일어난후에도 월요일 근무시간을 보면 Old 영역이 180M를 유지하고 있는것을 볼 수 있다. 이 시스템의 Full GC후의 Old영역은 80M~180M를 유지하는것을 볼 수 있다. 그래서 이 시스템은 최소 180M이상의 Old 영역을 필요로하는것으로 판단할 수 있다.

STEP 4. Parameter 변경.
STEP 3에서 구한 각 영역의 허용 범위를 기준으로 Old영역과 New 영역을 적절하게 조절한다.
PermSize와 New영역의 배분 (Eden,Survivor)영역등을 조정한다.
PermSize는 대부분 Log에서 명확하게 나타나기 때문에, 크게 조정이 필요가 없고 New영역내의 Eden과 Survivor는 거의 조정하지 않는다. 가장 중요한것은 Old영역과 New 영역의 비율을 어떻게 조정하는가가 관건이다.

이 비율을 결정하면서, STEP1에서 세운 튜닝 목표에 따라서 JVM의 GC Algorithm을 적용한다. GC Algorithm을 결정하는 기본적인 판단 내용은 아래와 같다.



이렇게 Parameter를 변경하면서 테스트를 진행하고, 다시 변경하고 테스트를 진행하는 과정을 거쳐서 최적의 Parameter와 GC Algorithm을 찾아내는것이 JVM의 메모리 튜닝의 이상적인 절차이다.


지금까지 JVM의 메모리 구조와 GC 모델 그리고 GC 튜닝에 대해서 알아보았다.

정리하자면 GC 튜닝은 Application의 구조나 성격 그리고, 사용자의 이용 Pattern에 따라서 크게 좌우 되기때문에, 얼마만큼의 Parameter를 많이 아느냐 보다는 얼마만큼의 테스트와 로그를 통해서 목표 값에 접근하느냐가 가장 중요하다
Posted by tornado
|

 

find /dev -type f

 


일케 쳐서......



/dev/MAKEDEV

 


이거 이외에 다른것들이 나오면...  해킹당한게다 ㅡㅡ;




Posted by tornado
|
첫줄에서 =G 하면 들여쓰기 됨 ..

'OS > LINUX' 카테고리의 다른 글

[펌] 자주쓰는 아파치 설정사항  (0) 2005.05.31
[리눅스] 해킹당했는지??  (0) 2005.05.18
[펌] 파일 옮기기  (0) 2005.05.16
[펌] tripwire설치 및 운영가이드  (0) 2005.05.11
[phpschool 펌] mod_rewrite 추가 설치...  (0) 2005.05.03
Posted by tornado
|
인사용어 영어로 해석해논 것 | Life Intelligence2003/12/10 22:38
http://blog.naver.com/blah82/140000436535

인사 조직 관련용어

 

 

   

   구분  조직    영문표현  Organization

▶조직도
▶업무분장
▶본사
총괄
담당
팀(부서)

▶필드
지역담당
지역본부
영업지원담당(본부)
지점
영업지원과
영업소
출장소
영업팀
딜러
모범딜러
표준딜러
일반딜러
합동딜러


▶Organization Chart
▶Work Allotment(Responsibilities & Duties)
▶Head Office
General
Division
Team(Department)
Section(Part)

▶Field
Regional Division
Regional Headquarter
Regional Sales Support Department
Sales Branch
Sales Branch Support Section
Sales Branch Office
Sales Office
Sales Team
Dealer
Excellent Dealer
Standard Dealer
General Dealer
Joint Dealer

 

   조직명    Organization Title
  
▶관리담당
▶경영재무담당
▶마케팅담당
▶영업지원담당
▶고객담당
▶직판담당
▶팀(부서)
인사팀
노사협력팀
총무팀
교육연수팀
경영기획팀
관재팀
내부감사팀
회계팀
자금팀
채권팀
전산실
마케팅팀
광고팀
상품계획팀
e-Business팀
***지원팀
대리점지원팀
프로젝트팀
직판팀

   
▶Adminstration Division
▶Management & Finance Division
▶Marketing Division
▶Sales Support Division
▶Customer Consulting Division
▶Government & Fleet Sales Division
▶Team(Department)
Personnel Team
Labor Relations Team
General Affairs Team
Education & Training Team
Management Planning Team
Property custody Team
Internal Auditing Team
Accounting Team
Finance Team
Credit & Arrears Team
M.I.S Team
Marketing Team
Advertising Team
Product Planning Team
e-Business Team
***Sales Support Team
Dealer Support Team
Project Team
Fleet Sales Team

 

   직급   Job Classification
    
▶직위
▶호봉
▶임원
사장
부사장
전무
상무
이사
사외이사
고문
감사
이사부장

▶직원
부장
차장
과장
대리
주임
사원
공장
직장
조장
기사원
용역
운전원

    
▶Position
▶Pay Grade
▶Executives
President
Vice President
Executive Managing Director
Managing Director
Executive Director
Outside Director
Advising Director
Auditing Director
Director

▶Staff
General Manager
Deputy General Manager
Manager
Assistant Manager
Senior Clerk
Clerk
Supervising Mechanic
Senior Mechanic
Junior Mechanic
Mechanic
Hired Services
Driver

 

    직책    Duty

▶대표이사
▶총괄임원
▶담당인원
▶본부장
▶팀장(부서장)
▶지점장
▶출장소장
▶과책임자
▶영업팀장


▶Representative Director
▶General Executive Director
▶Division Executive Director
▶Regional Headquarter Manager
▶Team Leader (Department Manager)
▶Branch Manager
▶Sales Office Manager
▶Section Manager
▶Sales Team Leader

 

    인사명령    Personnel Order

▶파견
▶휴직
▶승격
▶승급
▶인사위원회
포상
공로상
모범상
근속상
판매우수상


▶Dispatch
▶Lay-off
▶Promotion
▶Grade-up
▶Personnel Committee
Award
Distinguished Service Award
Good Conduct Award
Long Service Award
Outstanding Performance Salesperson Award

'이것저것 > 낙서장' 카테고리의 다른 글

책 사따 -.-;;  (3) 2005.05.18
netbeans 로 바꿔따..  (0) 2005.05.18
7000 히트 이벤트!!!  (2) 2005.05.13
[펌] K리그- 골키퍼.. 너 이제 죽었네..=ㅅ=;  (0) 2005.05.12
범인은 누구?n~!  (0) 2005.05.04
Posted by tornado
|