# IBM SDK for Linux, Java Technology Edition, 버전 6

# SDK 및 런타임 안내서

버전 6 릴리스 0
참고

이 정보 및 이 정보가 지원하는 제품을 사용하기 전에 주의사항의 정보를 읽으십시오.

저작권 정보

이 개정판은 다중 플랫폼의 IBM SDK and Runtime Environment for Linux에 적용됩니다.

이 안내서는 새 개정판에 별도로 명시하지 않는 한 다음 및 모든 후속 릴리스와 수정에 적용됩니다.

- Intel 아키텍처의 IBM 32-bit SDK and Runtime Environment for Linux, Java Technology Edition, 버전 6
- AMD64/EM64T 아키텍처의 IBM 64-bit SDK and Runtime Environment for Linux, Java Technology Edition, 버전 6
- System i(TM) 및 System p(TM) 아키텍처의 IBM 32-bit SDK and Runtime Environment for Linux, Java Technology Edition, 버전 6
- System i 및 System p 아키텍처의 IBM 64-bit SDK and Runtime Environment for Linux, Java Technology Edition, 버전 6
- System z 아키텍처의 IBM 31-bit SDK and Runtime Environment for Linux, Java Technology Edition, 버전 6
- System z 아키텍처의 IBM 64-bit SDK and Runtime Environment for Linux, Java Technology Edition, 버전 6

(C) Copyright Sun Microsystems, Inc. 1997, 2007, 901 San Antonio Rd., Palo Alto, CA 94303 USA. All rights reserved.

Copyright International Business Machines Corporation 2003, 2007. All rights reserved.

# 목차

서문
개요
규약
버전 호환성
다른 IBM JVM에서 이주
System z에 지원되는 하드웨어
SDK 및 Runtime Environment의 컨텐츠
Runtime Environment 클래스 및 도구
SDK 도구 및 참조 정보
SDK 및 Runtime Environment 설치 및 구성
SDK 업그레이드
Red Hat Enterprise Linux(RHEL) 4에 설치
Red Hat Enterprise Linux(RHEL) 5에 설치
RHEL 5의 SELinux를 사용하여 Java 실행
64-bit 구조에 32-bit SDK 설치
RPM 파일로 설치
.tgz 파일로 설치
JPackage 호환 가능 형식, 포맷 사용
Linux용 SDK 및 Runtime Environment 구성
경로 설정
클래스 경로 설정
Linux용 SDK 및 Runtime Environment 설치 제거
Red Hat Package Manager(RPM) 패키지 설치 제거
압축된 TAR(Tape Archive) 패키지 및 Linux용 설치 제거
Java 응용프로그램 실행
java 및 javaw 명령
버전 정보 얻기
Java 옵션 및 시스템 특성 지정
표준 옵션
java 명령의 글로벌화
JIT(just-in-time) 컴파일러
JIT 사용 안함
JIT 사용
JIT가 사용 가능한지 여부 판별
가비지 콜렉션 정책 지정
가비지 콜렉션 옵션
일시정지 시간
일시정지 시간 단축
힙이 가득 찬 환경
Euro 기호 지원
대체 글꼴 구성 파일
| |
인도어 및 태국어 입력 메소드 사용
SDK를 사용하여 Java 응용프로그램 개발
| |
XML 사용
| |
XL-TXE-J로 이주
| |
XML 참조 정보
Java 응용프로그램 디버깅
JDB(Java Debugger)
응용프로그램을 실행 중인 JVM이 32-bit인지 64-bit인지 판별
JVM의 신호 처리 방법
JVM에서 사용되는 신호
신호 체인 라이브러리에 원시 코드 드라이버 링크
JNI 응용프로그램 작성
블록된 커넥터의 스레드 레벨 복구 지원
대형 페이지 메모리 할당 구성
CORBA 지원
ORB 추적을 위한 시스템 특성
ORB 조정을 위한 시스템 특성
ORM에 대한 Java 보안 권한
ORB 구현 클래스
RMI over IIOP
RMI 연결 핸들러 풀 구현
향상된 BigDecimal
Plug-in, 애플릿 뷰어 및 Web Start
(Linux IA 32비트 및 PPC32에만 해당) Java Plug-in 사용
지원되는 브라우저
Java Plug-in 설치 및 구성
공통 DOM(Document Object Model) 지원
DBCS 매개변수 사용
애플릿에 대한 작업
애플릿 뷰어로 애플릿 실행
애플릿 뷰어로 애플릿 디버깅
(Linux IA 32-bit, PPC32 및 PPC64에만 해당) Web Start 사용
Web Start 실행
(Linux IA 32-bit에만 해당) Web Start SSV(Secure Static Versioning)
Java 응용프로그램 운송
JVM 사이에 클래스 데이터 공유
클래스 데이터 공유 개요
클래스 데이터 공유 사용 및 구성
캐시 작성, 채우기, 모니터링 및 삭제
성능 및 메모리 이용
클래스 데이터 공유 사용에 대한 고려사항 및 제한사항
캐시 크기 한계
런타임 바이트 코드 수정
운영 체제 제한사항
SharedClassPermission 사용
클래스를 공유하기 위한 사용자 정의 클래스 로더 채택
Java Communications API(JavaComm) 사용
압축 파일에서 Java Communications API 설치
RPM 파일에서 Java Communications API 설치
Java Communications API 파일의 위치
직렬 및 병렬 포트의 액세스 모드 변경
javax.comm.properties 파일에 디바이스 지정
IBM ThinkPad에서 직렬 포트 사용
Java Communications API의 제한사항 인쇄
Java Communications API 설치 제거
Red Hat Package Manager(RPM) 패키지 설치 제거
압축된 TAR(Tape Archive) 패키지 설치 제거
Java Communications API 문서
ISV(독립 소프트웨어 벤더)에 대한 서비스 및 지원
내게 필요한 옵션
Swing에서 JComboBox 구성요소의 키보드 종단
Web Start 내게 필요한 옵션(Linux IA 32-bit, PPC32 및 PPC64에만 해당)
이 책에 대한 고객 의견
부록A. 비표준 옵션
부록B. 알려진 제한사항
주의사항
상표

# 서문

이 사용자 안내서는 IBM(R) SDK and Runtime Environment for Linux(R), Java(TM) Technology Edition, 버전 6에 대한 일반 정보와 IBM 구현을 Sun 구현과 비교한 차이점에 대한 구체적인 정보를 제공합니다.

이 사용자 안내서는 http://java.sun.com의 Sun 웹 사이트에 나와 있는 다른 다양한 문서와 함께 읽으십시오.

테스트된 Linux용 SDK 및 Runtime Environment 배포판의 목록은 http://www-106.ibm.com/developerworks/java/jdk/linux/tested.html을 참조하십시오.

(Intel(R) 32비트 플랫폼에만 해당) 다음과 같은 가상화 환경이 지원됩니다.

- VMWare
- Xen
- Microsoft(R) Virtual Server

진단 안내서는 Java용 IBM Virtual Machine에 대한 자세한 정보를 제공합니다.

이 사용자 안내서는 릴리스의 일부이며 특정 릴리스에만 적용할 수 있습니다. 사용 중인 릴리스에 해당하는 사용자 안내서인지 확인하십시오.

"Runtime Environment" 및 "JVM(Java Virtual Machine)"이라는 용어는 이 사용자 안내서에서 서로 교환 가능하도록 사용됩니다.

|사소하거나 명백한 변경사항 이외에 이 사용자 안내서 버전에 대한 기술적 |변경사항은 Information Center에서는 파란색 갈짓자 무늬 장식으로 표시되고, HTML 또는 컬러 인쇄본에서는 |변경사항 왼쪽의 수직 막대가 빨간색으로 표시되며, PDF에서는 변경사항 왼쪽에 수직 막대가 표시됩니다.

프로그램 코드는 항공기, 항공 교통, 항공기 네비게이션 또는 항공기 통신과 같은 온라인 제어의 실시간 응용프로그램이나 핵 기지의 설계, 구축, 조작 또는 관리에 사용하도록 디자인되거나 의도되지 않았습니다.

# 개요

IBM SDK는 Java 6 코어 API(Application Program Interface)에 부합하는 애플릿 및 응용프로그램을 작성하고 실행하기 위한 개발 환경입니다.

SDK에는 Java 응용프로그램을 실행할 수 있는 Runtime Environment for Linux가 있습니다. SDK를 설치한 경우 Runtime Environment가 포함됩니다.

Runtime Environment에는 Java Virtual Machine 및 지원 파일(디버그할 수 없는 .so 파일 및 클래스 파일 포함)이 있습니다. Runtime Environment에는 SDK에 있는 클래스의 서브세트만 포함되며, 런타임에 Java 프로그램을 지원할 수 있으나 Java 프로그램을 컴파일할 수는 없습니다. Linux용 Runtime Environment에는 appletviewer, Java 컴파일러(javac) 또는 개발 시스템 전용 클래스 등의 개발 도구는 포함되어 있지 않습니다.

또한 IA32, PPC32/PPC64 및 AMD64/EM64T 플랫폼의 경우 Linux용 Runtime Environment와 함께 사용할 수 있는 Java 통신 API(application programming interface) 패키지가 제공됩니다. 자세한 정보는 Java Communications API(JavaComm) 사용을 참조하십시오.

license_xx.html 파일에는 Runtime Environment for Linux 소프트웨어의 라이센스 계약이 들어 있습니다. 여기서 xx는 언어의 약어입니다. 라이센스 계약을 보거나 인쇄하려면 웹 브라우저에서 이 파일을 여십시오.

## 규약

이 사용자 안내서에서는 SDK의 기본 설치 디렉토리를 /opt/ibm/java-i386-60/라고 합니다. Linux IA 32비트를 사용하고 있으면 기본 설치 디렉토리가 달라집니다.

여기에 나열된 플랫폼에는 여러 기본 설치 디렉토리가 있습니다. /opt/ibm/java-i386-60/을 사용 중인 플랫폼의 디렉토리로 바꾸십시오.

- Linux IA 32-bit: /opt/ibm/java-i386-60/
- Linux AMD 64-bit: /opt/ibm/java-x86_64-60/
- Linux PPC 32-bit: /opt/ibm/java-ppc-60/
- Linux PPC 64-bit: /opt/ibm/java-ppc64-60/
- Linux System z(TM) 31-bit: /opt/ibm/java-s390-60/
- Linux System z 64-bit: /opt/ibm/java-s390x-60/

Korn 쉘 명령은 이 사용자 안내서 전체의 예제에 사용됩니다.

## 버전 호환성

일반적으로 SDK의 이전 버전에서 실행된 모든 애플릿 또는 응용프로그램은 IBM SDK for Linux, v6에서 정확하게 실행됩니다. 이 릴리스로 컴파일한 클래스가 이전 릴리스에서 작동하는지는 보장할 수 없습니다.

릴리스 사이의 호환성 문제에 대한 정보는 다음 Sun 웹 사이트를 참조하십시오.

|http://java.sun.com/javase/6/webnotes/compatibility.html

http://java.sun.com/j2se/5.0/compatibility.html

http://java.sun.com/j2se/1.4/compatibility.html

http://java.sun.com/j2se/1.3/compatibility.html

다른 제품(예: IBM WebSphere(R) Application Server)의 일부로 SDK를 사용 중이고 이전 레벨의 SDK(v5.0)에서 업그레이드하는 경우, 직렬화된 클래스가 호환되지 않을 수도 있습니다. 그러나 서비스 새로 고치기 사이에는 클래스가 호환됩니다.

## 다른 IBM JVM에서 이주

버전 5.0부터 IBM Runtime Environment for Linux에는 IBM Virtual Machine for Java 및 JIT(Just-In-Time) 컴파일러의 새 버전이 있습니다.

이전 IBM Runtime Environment에서 이주 중인 경우에는 다음에 주의하십시오.

- Sun JVM과 일치시키기 위해 JVM 공유 라이브러리 libjvm.so이 jre/lib/<arch>/j9vm 및 jre/lib/<arch>/classic에 저장되어 있습니다.
- 버전 5.0 이후로는 JVMMI(JVM Monitoring Interface)는 더 이상 사용할 수 없습니다. 대신 JVMTI(JVM Tool Interface)를 사용하는 JVMMI 응용프로그램을 재작성해야 합니다. JVMTI는 기능상으로 JVMMI와 같지 않습니다. JVMTI에 대한 정보는 http://java.sun.com/javase/6/docs/technotes/guides/jvmti/ and the 진단 안내서를 참조하십시오.
- 버전 5.0 이후로 JNI의 구현은 JNI 스펙을 준수하지만 버전 1.4.2 구현과는 다릅니다. 새 구현은 오브젝트를 계속 보유하는 대신에 오브젝트의 사본을 리턴합니다. 이러한 차이점이 JNI 응용프로그램 코드의 오류를 일으킬 수 있습니다. JNI 코드 디버깅에 대한 정보는 부록A. 비표준 옵션의 -Xcheck:jni를 참조하십시오.
- 버전 5.0 이후로 -verbose:gc를 사용하여 얻은 가비지 콜렉터 상세 로그의 형식 및 컨텐츠가 변경되었습니다. 이제 데이터가 XML로 포맷됩니다. 데이터 내용은 JVM의 가비지 콜렉션 구현에 대한 변경사항을 반영하게 되므로 출력된 대부분의 통계가 변경되었습니다. 새로운 포맷 및 데이터로 작업할 수 있도록 verbose GC 출력을 처리하는 모든 프로그램을 변경해야 합니다. 새 verbose GC 데이터의 예제는 진단 안내서를 참조하십시오.
- IBM JRE의 SDK 1.4 버전에는 core.jar이라는 파일에 JVM 특정 클래스가 있었습니다. 버전 5.0 이후로 이 클래스는 vm.jar이라는 파일에 있습니다.
- IBM JRE의 이전 버전에서는 jre/lib 디렉토리에 rt.jar이라는 파일이 포함되어 있습니다. 버전 1.4 이후로는 이 파일이 jre/lib 디렉토리의 다중 JAR 파일로 바뀌었습니다.
- |추가 산업 호환성 및 사용되지 않는 API 정보는 |Sun의 |Java 6 호환성 문서 및 |Sun의 |Java 6 사용되지 않는 API 목록을 참조하십시오.
- -verbose:Xclassdep를 사용하여 호출하는 추적 클래스 종속성은 지원되지 않습니다. -verbose:Xclassdep를 지정하는 경우 JVM은 오류 메시지를 발행하며, 시작되지 않습니다.

## System z에 지원되는 하드웨어

System z 31-bit 및 64-bit SDK와 Runtime Environment는 System z9(TM) 및 zSeries(R) 하드웨어에서 실행됩니다.

SDK 및 Runtime Environment는 다음 서버 또는 동등한 제품에서 실행됩니다.

- z9-109
- z990
- z900
- z890
- z800

# SDK 및 Runtime Environment의 컨텐츠

SDK에는 몇 가지 개발 도구와 JRE(Java Runtime Environment)가 있습니다. 이 절에서는 SDK 도구 및 Runtime Environment의 컨텐츠에 대해 설명합니다.

전체가 Java로 작성된 응용프로그램에는 IBM SDK의 디렉토리 구조(또는 해당 디렉토리 내의 파일)에 대한 종속성이 없어야 합니다. SDK의 디렉토리 구조(또는 해당 디렉토리의 파일)에 대한 종속성으로 인해 응용프로그램 이식성 문제가 발생할 수 있습니다. JNI(

사용자 안내서, Javadoc 및 함께 제공되는 라이센스, 저작권 파일, javadoc 및 데모 디렉토리는 이 SDK for Linux에 포함된 유일한 문서입니다. Sun 웹 사이트(http://java.sun.com)를 방문하여 Sun의 소프트웨어 문서를 보거나 Sun 웹 사이트에서 Sun의 소프트웨어 문서 패키지를 다운로드할 수 있습니다.

## Runtime Environment 클래스 및 도구

표준 Runtime Environment와 함께 사용할 수 있는 클래스 및 도구의 목록입니다.

- 코어 클래스 -- 플랫폼용으로 컴파일된 클래스 파일로, 컴파일러 및 해석기가 이 파일을 액세스하려면 압축된 상태여야 합니다. 이러한 클래스를 수정하지 마십시오. 대신 서브클래스를 작성하고 필요한 곳에서 대체하십시오.
- JRE 도구 -- 다음 도구는 Runtime Environment의 일부이며 달리 지정하지 않은 경우 /opt/ibm/java-i386-60/jre/bin 디렉토리에 있습니다.
  ikeyman(iKeyman GUI 유틸리티)
    키, 인증서 및 인증 요청을 관리할 수 있습니다. 자세한 정보는 함께 제공된 보안 안내서 및 http://www.ibm.com/developerworks/java/jdk/security를 참조하십시오. SDK도 이 유틸리티의 명령행 버전을 제공합니다.
  java(Java 해석기)
    Java 클래스를 실행합니다. Java 해석기는 Java 프로그래밍 언어로 작성된 프로그램을 실행합니다.
  javaw(Java 해석기)
    java 명령과 동일한 방법으로 Java 클래스를 실행하지만 콘솔 창을 사용하지 않습니다.
  (Linux IA 32-bit, PPC32 및 PPC64에만 해당) javaws(Java Web Start)
    Java 응용프로그램의 배치 및 관리를 사용합니다. 자세한 정보는 웹 사이트 Web Start 실행의 내용을 참조하십시오.
  jextract(덤프 추출기)
    시스템이 생성한 덤프를 jdmpview에서 사용할 수 있는 일반 형식으로 변환합니다. 자세한 정보는 jdmpview를 참조하십시오.
  keytool(키 및 인증 관리 도구)
    해당되는 공용 키를 인증하는 개인용 키 및 연관된 X.509 인증 체인의 키 스토어(데이터베이스)를 관리합니다.
  kinit
    Kerberos ticket-granting 티켓을 얻어 캐시에 넣습니다.
  klist
    로컬 신임 캐시 및 키 테이블에 항목을 표시합니다.
  ktab
    로컬 키 테이블에 저장된 프린시펄 이름 및 서비스 키를 관리합니다.
  pack200
    Java gzip 압축 프로그램을 사용하여 JAR 파일을 압축된 pack200 파일로 변환합니다.
  policytool(정책 파일 작성 및 관리 도구)
    설치의 Java 보안 정책을 정의하는 외부 정책 구성 파일을 작성하고 수정합니다.
  rmid(RMI 활성화 시스템 디먼)
    오브젝트를 JVM(Java Virtual Machine)에 등록하여 활성화할 수 있도록 활성화 시스템 디먼을 시작합니다.
  rmiregistry(Java 원격 오브젝트 레지스트리)
    현재 호스트의 지정된 포트에서 원격 오브젝트 레지스트리를 작성하고 시작합니다.
  tnameserv(CORBA(Common Object Request Broker Architecture) 임시 이름 지정 서비스)
    CORBA 임시 이름 지정 서비스를 시작합니다.
  unpack200
    pack200에서 생성된 packed 파일을 JAR 파일로 변환합니다.

## SDK 도구 및 참조 정보

표준 SDK에 포함된 도구 및 참조 정보 목록입니다.

다음 도구는 SDK의 파트이며 /opt/ibm/java-i386-60/bin 디렉토리에 있습니다.
  appletviewer(Java 애플릿 뷰어)
    웹 브라우저 밖에서 애플릿을 테스트하고 실행합니다.
  apt(어노테이션 처리 도구)
    시험할 지정된 소스 파일 세트에 존재하는 어노테이션을 기반으로 어노테이션 프로세서를 찾고 실행합니다.
  extcheck(Extcheck 유틸리티)
    대상 jar 파일과 현재 설치된 확장 jar 파일 간의 버전 충돌을 검색합니다.
  (Linux IA 32-bit, PPC32 및 PPC64에만 해당) HtmlConverter(Java Plug-in HTML 변환기)
    애플릿이 포함된 HTML 페이지를 Java Plug-in을 사용할 수 있는 형식으로 변환합니다.
  idlj(IDL to Java 컴파일러)
    주어진 IDL 파일에서 Java 바인딩을 생성합니다.
  ikeycmd(iKeyman 명령행 유틸리티)
    명령행에서 키, 인증서 및 인증 요청을 관리할 수 있습니다. 자세한 정보는 함께 제공된 보안 안내서 및 http://www.ibm.com/developerworks/java/jdk/security를 참조하십시오.
  jar(Java 아카이브 도구)
    여러 파일을 단일 JAR(Java Archive) 파일로 결합합니다.
  jarsigner(JAR 서명 및 확인 도구)
    JAR 파일에 대한 서명을 생성하고 날인된 JAR 파일의 서명을 확인합니다.
  java-rmi.cgi(HTTP-CGI 요청 전달 도구)
    HTTP를 통한 RMI 요청을 승인하고 이를 포트로 수신하는 RMI 서버에 전달합니다.
  javac(Java 컴파일러)
    Java 프로그래밍 언어로 작성한 프로그램을 바이트 코드(컴파일된 Java 코드)로 컴파일합니다.
  javadoc(Java 문서 생성기)
    Java 소스 파일에서 API 문서의 HTML 페이지를 생성합니다.
  javah(C 헤더 및 스텁 파일 생성기)
    이를 사용하여 원시 메소드를 Java 프로그래밍 언어로 작성한 코드에 연관시킬 수 있습니다.
  javap(클래스 파일 디스어셈블러)
    컴파일된 파일을 디스어셈블하고 바이트코드의 표시를 인쇄할 수 있습니다.
  javaw(Java 해석기)
    java 명령과 동일한 방법으로 Java 클래스를 실행하지만 콘솔 창을 사용하지 않습니다.
  (Linux IA 32-bit, PPC32 및 PPC64에만 해당) javaws(Java Web Start)
    Java 응용프로그램의 배치 및 관리를 사용합니다. 자세한 정보는 웹 사이트 Web Start 실행의 내용을 참조하십시오.
  jconsole(JConsole 모니터링 및 관리 도구)
    GUI를 사용하여 로컬 및 원격 JVM을 모니터합니다. JMX 준수.
  jdb(Java 디버거)
    Java 프로그램을 디버그하도록 도와줍니다.
  jdmpview(교차 플랫폼 덤프 포맷터)
    덤프를 분석합니다. 자세한 정보는 진단 안내서를 참조하십시오.
  native2ascii(Native-To-ASCII 변환기)
    원본 인코딩 파일을 Latin-1이나 Unicode 또는 둘 다로 인코드된 문자가 포함된 ASCII 파일로 변환합니다.
  rmic(Java RMI(Remote Method Invocation) 스텁 변환기)
    원격 오브젝트의 스텁, 스켈레톤 및 타이를 생성합니다. RMI-IIOP(RMI over Internet Inter-ORB Protocol) 지원이 포함됩니다.
  schemagen
    Java 클래스에서 참조된 이름 공간마다 스키마 파일을 작성합니다.
  serialver(직렬화 버전 명령)
    전개되는 클래스로 복사하기에 적합한 포맷으로 하나 이상의 클래스에 대한 serialVersionUID를 리턴합니다.
  wsgen
    JAX_WS 웹 서비스에 사용되는 JAX-WS 휴대용 아티팩트를 생성합니다.
  wsimport
    WSDL 파일에서 JAX-WS 휴대용 아티팩트를 생성합니다.
  xjc
    XML 스키마 파일을 컴파일합니다.
포함 파일
  JNI 프로그램용 C 헤더입니다.
데모
  데모 디렉토리에는 사용 가능한 샘플 소스 코드, 데모, 응용프로그램 및 애플릿을 포함하는 많은 서브디렉토리가 있습니다. |버전 6부터 RMI-IIOP 데모는 SDK에 포함되지 않습니다.
저작권
  SDK for Linux 소프트웨어에 대한 저작권 표시입니다.
라이센스

  라이센스 파일 /opt/ibm/java-i386-60/docs/content/<locale>/LA_<locale>에는 Linux용 SDK 소프트웨어(여기서 <locale>은 로케일의 이름(예: en))에 대한 라이센스 계약이 포함되어 있습니다. 라이센스 계약을 보거나 인쇄하려면 웹 브라우저에서 이 파일을 여십시오.

# SDK 및 Runtime Environment 설치 및 구성

RPM 파일 또는 .tgz 파일 둘 중 하나로 IBM Java SDK 및 Runtime Environment를 설치할 수 있습니다. 이 Java 설치에 시스템의 모든 사용자가 액세스할 수 있도록 하지 않으려면 .tgz 설치 메소드를 사용하십시오. 루트 액세스 권한이 없으면 .tgz 파일을 사용하십시오.

RPM 파일을 사용하여 설치하는 경우 Java 파일은 /opt/ibm/java-i386-60/에 설치됩니다. 이 안내서의 예제에서는 이 디렉토리에 Java를 설치했다고 가정합니다.

## SDK 업그레이드

이전 릴리스에서 SDK를 업그레이드하려면, 업그레이드를 시작하기 전에 모든 구성 파일 및 보안 정책 파일을 백업하십시오.

업그레이드 프로세스 동안에 이러한 파일이 겹쳐쓰여지기 때문에 업그레이드 후에 복원하거나 다시 구성해야만 합니다. 기존 파일을 복원하기 전에 형식이나 파일의 옵션이 변경되었을 수도 있으므로 새 파일의 구문을 확인하십시오.

## Red Hat Enterprise Linux(RHEL) 4에 설치

SDK는 기본적으로 Red Hat Enterprise Linux(RHEL)에서 설치되지 않은 공유 라이브러리에 따라 달라집니다.

RHEL 4에서 이러한 라이브러리가 들어 있는 RPM은 다음과 같습니다.

- `compat-libstdc++-33-3.2.3` and `xorg-x11-deprecated-libs-6.8.1`(zSeries 이외의 플랫폼)
- `compat-libstdc++-295-2.95.3` 및 `xorg-x11-deprecated-libs-6.8.1`(zSeries)

RHEL 4 설치 시 이러한 라이브러리를 포함하려면 다음을 수행하십시오.

1. 패키지 기본값 화면이 표시되면 설치할 패키지 세트 사용자 정의를 선택하십시오.
2. 패키지 그룹 선택 화면에서 X Windows 시스템 아래에 있는 세부사항을 선택하고 `xorg-x11-deprecated-libs`를 선택했는지 확인하십시오.
3. 개발 옵션 아래에서 레거시 소프트웨어 개발을 선택하십시오.

## Red Hat Enterprise Linux(RHEL) 5에 설치

SDK는 기본적으로 Red Hat Enterprise Linux(RHEL)에서 설치되지 않은 공유 라이브러리에 따라 달라집니다.

RHEL 5에서 이러한 라이브러리가 들어 있는 RPM은 다음과 같습니다.

- `libXp-1.0.0-8`(모든 플랫폼)
- `compat-libstdc++-33-3.2.3`(zSeries 이외의 플랫폼)
- `compat-libstdc++-296-2.95.3`(zSeries)

RHEL 5 설치 시 이러한 라이브러리를 포함하려면 다음을 수행하십시오.

1. 소프트웨어 선택 화면에서 지금 사용자 정의를 선택하십시오.
2. 다음 화면의 왼쪽 패널에서 기본 시스템을 선택하고 오른쪽 패널에서 레거시 소프트웨어 지원을 선택하십시오. 선택하면 compat-libstdc++ 패키지가 설치됩니다.
3. libXp 패키지는 필수이지만 GUI 설치 시 설치하도록 선택할 수 없습니다. 설치가 완료되면 쉘을 열고 Red Hat 설치 매체에서 libXp 패키지를 찾아 설치하십시오. 예를 들어, 32비트 Intel 플랫폼에 `rpm -i /media/cdrom/Server/libXp-1.0.0-8.i386.rpm`을 설치합니다.

### RHEL 5의 SELinux를 사용하여 Java 실행

SELinux를 사용할 수 있는 Red Hat Enterprise Linux 버전 5에서 IBM SDK for Java를 실행하려면 Java를 기본 디렉토리에 설치하거나 명령을 입력해야 합니다.

Java가 기본 디렉토리에 설치되어 있지 않으면 다음을 입력하십시오.

    chcon -R -t texrel_shlib_t <path_of_sdk>

여기서 `<path_of_sdk>`는 Java를 설치한 디렉토리입니다.

SELinux에 대한 자세한 정보는 Red Hat 문서에서 SELinux 소개를 참조하십시오.

## 64-bit 구조에 32-bit SDK 설치

SDK를 실행하려면 먼저 SDK(32비트 또는 64비트)에 필요한 모든 라이브러리 버전을 정확하게 설치해야 합니다.

RHEL4의 경우 Compatibility Arch Support 패키지 그룹에서 64비트 버전의 패키지를 사용할 수 있습니다.

RPM 도구를 사용하면 사용자의 RPM 명령에 `--queryformat "%{NAME}.%{ARCH}\n"` 옵션을 추가하여 설치한 패키지 버전이 무엇인지 확인할 수 있습니다. 예를 들면 다음과 같습니다.

    /home/username : rpm --queryformat "%{NAME}.%{ARCH}\n" -q libstdc++
    libstdc++.x86_64
    libstdc++.i386

## RPM 파일로 설치

RPM 파일로 설치 프로시저

rpm 도구를 사용하여 JVM을 업그레이드하려면 이전 버전을 설치 제거해야 합니다. 두 개의 JVM 버전을 각각 다른 위치에 설치하려면 rpm 강제 실행 옵션을 사용하여 버전의 충돌을 무시하고 .tgz 파일의 JVM을 설치하십시오.

1. 쉘 프롬프트를 열고 루트인지 확인하십시오.
2. 쉘 프롬프트에서 `rpm -ivh <RPM file>`을 입력하십시오. 예를 들면 다음과 같습니다.

       rpm -ivh ibm-java2-<arch>-sdk-6.0-0.0.<arch>.rpm

   또는

       rpm -ivh ibm-java2-<arch>-jre-6.0-0.0.<arch>.rpm

   여기서 `<arch>`는 아키텍처(i386, x86_64, ppc, ppc64, s390 또는 s390x)를 나타냅니다.

## .tgz 파일로 설치

.tgz 파일로 설치 프로시저

1. Java 패키지 파일을 저장할 디렉토리를 작성하십시오. 이 안내서의 예제에서는 /opt/ibm/java-i386-60/에 설치했다고 가정합니다. 안내서의 /opt/ibm/java-i386-60/를 Java를 설치한 디렉토리로 바꾸십시오.
2. 쉘 프롬프트에서 `tar -zxvf <.tgz file>`을 입력하십시오.

       tar -zxvf ibm-java2-sdk-60-linux-<arch>.tgz

   또는

       tar -zxvf ibm-java2-jre-60-linux-<arch>.tgz

   여기서 `<arch>`는 아키텍처(i386, x86_64, ppc, ppc64, s390 또는 s390x)를 나타냅니다.

3. SELinux(Security-Enhanced Linux)를 실행하는 경우 시스템에 대한 Java 공유 라이브러리를 식별해야 합니다. 유형은 다음과 같습니다.

       chcon -R -t texrel_shlib_t /opt/ibm/java2-i386-60/jre
       chcon -R -t texrel_shlib_t /opt/ibm/java2-i386-60/bin
       chcon -R -t texrel_shlib_t /opt/ibm/java2-i386-60/lib

## JPackage 호환 가능 형식, 포맷 사용

에서 IBM Java 패키지를 JPackage 호환 가능 형식으로 사용할 수도 있습니다.

이제 SDK를 간단하게 관리하기 위해 기본 Java Runtime Environment, Development Kit, Plug-in, JDBC, 데모, 사운드, 소스 및 글꼴과 같이 여러 구성요소를 별도의 RPM으로 사용할 수 있습니다. "jpackage-utils" RPM(http://jpackage.org에서 다운로드 가능)을 통해 시스템에서 다중 Java RPM을 괸리할 수 있으며, 또한 IBM SDK에서도 전제조건입니다. JPackage 스펙에 대한 자세한 정보는 http://jpackage.org를 참조하십시오.

## Linux용 SDK 및 Runtime Environment 구성

Red Hat Advanced Server의 글꼴 인코딩 불일치

주: (Linux IA 32비트 중국어 사용자에 한해) 중국어를 기본 언어로 사용하는 환경에서 제품을 설치하는 경우 Red Hat Advanced Server의 글꼴 인코딩에서 불일치사항이 발생할 수 있으므로 기본 언어를 영어로 설정하여 설치를 완료한 다음, 이를 중국어로 변경하는 것이 좋습니다. 그렇지 않으면 중국어 글꼴이 표시되지 않을 수도 있습니다.

### 경로 설정

PATH 환경 변수를 변경하면, 해당 경로의 기존 Java 실행기가 대체됩니다.

PATH 환경 변수를 사용하면 Linux에서는 현재 디렉토리에서 javac, java 및 javadoc와 같은 프로그램 및 유틸리티를 찾을 수 있습니다. PATH의 현재 값을 표시하려면 명령 프롬프트에 다음을 입력하십시오.

      echo $PATH

해당 경로에 Java 실행기를 추가하려면 다음을 수행하십시오.

1. 홈 디렉토리에 있는 쉘 시작 파일(쉘에 따라 다르며, 일반적으로 .bashrc)을 편집하여 절대 경로를 PATH 환경 변수에 추가하십시오. 예:

       export PATH=/opt/ibm/java-i386-60/bin:/opt/ibm/java-i386-60/jre/bin:$PATH

2. 다시 로그온하거나 업데이트된 쉘 스크립트를 실행하여 새 PATH 변수를 활성화하십시오.

경로를 설정한 후 임의의 디렉토리의 명령 프롬프트에 이름을 입력하여 도구를 실행할 수 있습니다. 예를 들어, 명령 프롬프트에서 Myfile.Java 파일을 컴파일하려면 다음을 입력하십시오.

    javac Myfile.Java

### 클래스 경로 설정

클래스 경로는 SDK 도구(예: java, javac 및 javadoc)에게 Java 클래스 라이브러리가 있는 위치를 알려줍니다.

다음과 같은 경우에만 클래스 경로를 명시적으로 설정해야 합니다.

- 직접 개발하거나 현재 디렉토리에 없는 새로운 라이브러리 또는 클래스 파일이 필요한 경우
- bin 및 lib 디렉토리의 위치를 변경하여 상위 디렉토리가 더 이상 동일하지 않은 경우.
- 동일한 시스템에서 다른 런타임 환경을 사용하는 응용프로그램을 개발하거나 실행할 계획인 경우.

CLASSPATH 환경 변수의 현재 값을 표시하려면 쉘 프롬프트에 다음 명령을 입력하십시오.

      echo $CLASSPATH

다른 런타임 환경(별도로 설치한 다른 버전 포함)을 사용하는 응용프로그램을 개발하고 실행하는 경우, 각 응용프로그램에 대해 명시적으로 CLASSPATH 및 PATH를 설정해야 합니다. 여러 응용프로그램을 동시에 실행하며 다른 런타임 환경을 사용하는 경우, 각 응용프로그램을 자체 쉘 프롬프트에서 실행해야 합니다.

## Linux용 SDK 및 Runtime Environment 설치 제거

Linux용 SDK 및 Runtime Environment를 제거하는 프로세스는 사용한 설치 유형에 따라 다릅니다.

자세한 지시사항을 보려면 RPM(Red Hat Package Manager) 패키지 설치 제거 또는 압축된 TAR(Tape Archive) 패키지 설치 제거를 참조하십시오.

### Red Hat Package Manager(RPM) 패키지 설치 제거

Red Hat Package Manager(RPM) 패키지 설치 제거 프로시저

RPM 패키지를 설치한 경우 Linux용 SDK 또는 Runtime Environment를 설치 제거하려면 다음을 수행하십시오.

1. 설치한 RPM 패키지를 확인하려면 `rpm -qa | grep -i java`를 입력하십시오.

   설치한 IBM Java 패키지의 목록이 다음과 같이 표시됩니다.

       ibm-java2-<arch>-jre-6.0-0.0.<arch>
       ibm-java2-<arch>-sdk-6.0-0.0.<arch>

   이 출력은 `rpm -e` 명령을 사용하여 설치 제거할 수 있는 패키지를 알려 줍니다. 예를 들면 다음과 같습니다.

       rpm -e ibm-java2-<arch>-jre-6.0-0.0.<arch>
       rpm -e ibm-java2-<arch>-sdk-6.0-0.0.<arch>

   kpackage 또는 yast2와 같은 그래픽 도구를 사용할 수도 있습니다.

2. PATH 명령문에서 SDK 및 Runtime Environment를 설치한 디렉토리를 제거하십시오.
3. (Linux IA 32비트 및 PPC32에만 해당) Java Plug-in을 설치한 경우, 웹 브라우저 디렉토리에서 Java Plug-in 파일을 제거하십시오.

### 압축된 TAR(Tape Archive) 패키지 및 Linux용 설치 제거

압축된 패키지에서 추출된 IBM SDK for Linux, v6을 제거할 단계의 목록입니다.

1. SDK 또는 Runtime Environment를 설치한 디렉토리에서 SDK 또는 Runtime Environment 파일을 제거하십시오.
2. PATH 명령문에서 SDK 또는 Runtime Environment를 설치한 디렉토리를 제거하십시오.
3. 다시 로그온하거나 업데이트된 쉘 스크립트를 실행하여 새 PATH 설정을 활성화하십시오.
4. (Linux IA 32비트 및 AMD64/EM64T에만 해당) Java Plug-in을 설치한 경우 웹 브라우저 디렉토리에서 Java Plug-in 파일을 제거하십시오.

# Java 응용프로그램 실행

Java 응용프로그램은 java 실행기 또는 JNI를 사용하여 시작할 수 있습니다. 설정은 명령행 인수, 환경 변수 및 특성 파일을 사용하여 Java 응용프로그램으로 전달됩니다.

## java 및 javaw 명령

java 및 javaw 명령의 간단한 개요입니다.

### 용도

java 및 javaw 도구는 Java Runtime Environment를 시작하고 지정한 클래스를 로드하여 Java 응용프로그램을 실행합니다.

javaw 명령은 java와 동일합니다. 단, javaw에는 연관된 콘솔 창이 없습니다. 명령 프롬프트 창을 표시하지 않으려면 javaw를 사용하십시오. javaw 실행 프로그램은 실행에 실패할 경우 오류 정보가 있는 대화 상자를 표시합니다.

### 사용법

JVM은 세 가지 위치 세트(부트스트랩 클래스 경로, 설치된 확장 및 사용자 클래스 경로)에서 초기 클래스(및 사용되는 기타 클래스)를 검색합니다. 클래스 이름 또는 JAR 파일 이름 다음에 지정한 인수가 기본 함수에 전달됩니다.

java 및 javaw 명령의 구문은 다음과 같습니다.

    java [ options ] <class> [ arguments ... ]
    java [ options ] -jar <file.jar> [ arguments ... ]
    javaw [ options ] <class> [ arguments ... ]
    javaw [ options ] -jar <file.jar> [ arguments ... ]

### 매개변수

[options]
  런타임 환경에 전달되는 명령행 옵션입니다.
<class>
  시작 클래스입니다. 클래스에는 main() 메소드가 있어야 합니다.
<file.jar>
  호출할 jar 파일의 이름. -jar 옵션과 함께만 사용됩니다. 이름 지정된 JAR 파일에는 Main-Class Manifest 헤더로 표시된 시작 클래스와 함께 응용프로그램에 대한 자원 파일 및 클래스가 있어야 합니다.
[arguments ...]
  시작 클래스의 main() 함수로 전달되는 명령행 인수입니다.

### 버전 정보 얻기

Java 설치의 IBM 빌드 및 버전 번호는 -version 옵션을 사용하여 얻을 수 있습니다. |또한 -Xjarversion 옵션을 사용하여 |클래스 경로에서 모든 jar 파일의 버전 정보를 얻을 수도 있습니다.

1. 쉘 프롬프트를 여십시오.
2. 다음 명령을 입력하십시오.

           java -version

   다음과 같은 정보가 표시됩니다.

       java version "1.6.0-internal"
       Java(TM) SE Runtime Environment (build 20070329_01)
       IBM J9 VM (build 2.4, J2RE 1.6.0 IBM J9 2.4 Linux x86-32 jvmxi3260-20070326_12091 (JIT enabled)
       J9VM - 20070326_12091_lHdSMR
       JIT  - dev_20070326_1800
       GC   - 20070319_AA)

   정확한 빌드 날짜 및 버전은 변경될 수 있습니다.

| |

클래스 경로, 부트 클래스 경로 및 확장 디렉토리에서 사용 가능한 |모든 jar 파일의 버전 정보를 나열할 수도 있습니다. 다음 명령을 |입력하십시오.

|

    java -Xjarversion

|

다음과 같은 정보가 표시됩니다.

|

    ...
    |/opt/ibm/java-i386-60/jre/lib/ext/ibmpkcs11impl.jar  VERSION: 1.0 build_20070125
    |/opt/ibm/java-i386-60/jre/lib/ext/dtfjview.jar
    |/opt/ibm/java-i386-60/jre/lib/ext/xmlencfw.jar  VERSION: 1.00, 20061011  LEVEL: -20061011
    |
    |...

|

사용 가능한 정보는 각 jar 파일에 따라 다르며, |jar 파일 Manifest의 Implementation-Version 및 |Build-Level 특성에서 가져옵니다.

### Java 옵션 및 시스템 특성 지정

명령행에서 옵션 파일 또는 환경 변수를 사용하여 Java 옵션 및 시스템 특성을 지정할 수 있습니다.

Java 옵션을 지정하는 메소드의 우선순위는 다음과 같습니다.

1. 명령행에서 옵션 또는 특성을 지정하는 방법. 예를 들면 다음과 같습니다.

       java -Dmysysprop1=tcpip -Dmysysprop2=wait -Xdisablejavadump MyJavaClass

2. 옵션이 있는 파일을 작성하고 -Xoptionsfile=<file>을 사용하여 명령행에서 지정하는 방법.
3. 옵션을 포함하는 IBM_JAVA_OPTIONS라는 환경 변수를 작성하는 방법. 예를 들면 다음과 같습니다.

       export IBM_JAVA_OPTIONS="-Dmysysprop1=tcpip -Dmysysprop2=wait -Xdisablejavadump"

명령행의 맨 오른쪽 옵션은 맨 왼쪽 옵션보다 우선순위가 높습니다. 예를 들어, 다음과 같이 지정하는 경우가 있습니다.

    java -Xint -Xjit myClass

이 경우 -Xjit 옵션이 우선순위가 높습니다.

### 표준 옵션

표준 옵션의 정의.

-agentlib:<libname>[=<options>]
  원시 에이전트 라이브러리 <libname>을 로드합니다(예: -agentlib:hprof). 자세한 정보를 보려면 명령행에 -agentlib:jdwp=help 및 -agentlib:hprof=help를 입력하십시오.
-agentpath:libname[=<options>]
  전체 경로 이름별로 원시 에이전트 라이브러리를 로드합니다.
-cp <:으로 구분되는 디렉토리 및 zip 또는 jar 파일>
  응용프로그램 클래스 및 자원의 탐색 경로를 설정합니다. -classpath 및 -cp가 사용되지 않고 CLASSPATH 환경 변수가 설정되지 않은 경우, 기본적으로 사용자 클래스 경로는 현재 디렉토리(.)입니다.
-classpath <:으로 구분되는 디렉토리 및 zip 또는 jar 파일>
  응용프로그램 클래스 및 자원의 탐색 경로를 설정합니다. -classpath 및 -cp가 사용되지 않고 CLASSPATH 환경 변수가 설정되지 않은 경우, 기본적으로 사용자 클래스 경로는 현재 디렉토리(.)입니다.
-D<property name>=<value>
  시스템 특성을 설정합니다.
-help 또는 -?
  사용법 메시지를 인쇄합니다.
-javaagent:<jarpath>[=<options>]
  Java 프로그래밍 언어 에이전트를 로드합니다. 자세한 정보는 java.lang.instrument API 문서를 참조하십시오.
-jre-restrict-search
  버전 검색에 사용자 개인용 JRE를 포함합니다.
-no-jre-restrict-search
  버전 검색에서 사용자 개인용 JRE를 제외합니다.
-showversion
  제품 버전을 인쇄하고 계속 진행합니다.
-verbose:<option>
  상세 출력을 사용합니다. 사용 가능한 옵션은 다음과 같습니다.
  class
    로드한 각 클래스의 stderr에 항목을 기록합니다.
  gc
    stderr에 상세 가비지 콜렉션 정보를 기록합니다. 출력을 제어하려면 -Xverbosegclog를 사용하십시오. 자세한 정보는 진단 안내서를 참조하십시오.
  jni
    응용프로그램 및 JVM에서 호출된 JNI 서비스를 설명하는 정보를 stderr에 기록합니다.
  sizes
    활성 메모리 사용량 설정을 설명하는 정보를 stderr에 기록합니다.
  stack
    각 스레드의 Java 및 C 스택 사용량을 설명하는 정보를 stderr에 기록합니다.
-version
  제품 버전을 인쇄합니다.
-version:<value>
  실행하려면 지정된 버전(예: 『1.5』)이 필요합니다.
-X
  비표준 옵션에 대한 도움말을 인쇄합니다.

### java 명령의 글로벌화

java 및 javaw 실행기에서는 현재 로케일의 문자 세트에 있는 모든 문자를 포함하는 인수 및 클래스 이름을 사용할 수 있습니다. 또한 Java 이스케이프 시퀀스를 사용하여 클래스 이름 및 인수에 Unicode 문자를 지정할 수 있습니다.

이 작업을 수행하려면 -Xargencoding 명령행 옵션을 사용하십시오.

-Xargencoding
  인수 인코딩을 사용합니다. Unicode 문자를 지정하려면 `\u####` 형식의 이스케이프 시퀀스를 사용하십시오. 여기서 #는 16진 숫자(0 - 9, A - F)입니다.
-Xargencoding:utf8
  UTF8 인코딩을 사용합니다.
-Xargencoding:latin
  ISO8859_1 인코딩을 사용합니다.

예를 들어, 두 대문자에 대해 Unicode 인코딩을 사용하여 HelloWorld라는 클래스를 지정하려면 다음 명령을 사용하십시오.

    java -Xargencoding '\u0048ello\u0057orld'

java 및 javaw 명령은 변환된 메시지를 제공합니다. 이러한 메시지는 Java를 실행 중인 로케일에 따라 다릅니다. java가 리턴하는 자세한 오류 설명 및 기타 디버그 정보는 영어로 되어 있습니다.

## JIT(just-in-time) 컴파일러

IBM JIT(just-in-time) 컴파일러는 Java 응용프로그램 및 애플릿이 실행될 때 자주 사용되는 바이트 코드 시퀀스의 시스템 코드를 동적으로 생성합니다. JIT v6 컴파일러는 새로운 최적화를 제공하여 JIT의 이전 버전에서 구현된 최적화를 개선하고 더 나은 하드웨어 환경을 제공합니다.

IBM SDK 및 Runtime Environment 모두에 JIT가 있으며, 사용자 응용프로그램 및 SDK 도구에서 기본적으로 사용할 수 있습니다. 일반적으로 JIT를 명시적으로 호출할 필요는 없습니다. Java 바이트 코드에서 시스템 코드로의 컴파일은 투명하게 발생합니다. JIT를 사용 불가능으로 설정하면 문제점을 찾는 데 도움이 됩니다. Java 응용프로그램 또는 애플릿을 실행할 때 문제점이 발생하는 경우 JIT를 사용 불가능으로 설정하면 문제점을 찾는 데 도움이 됩니다. JIT를 사용 불가능으로 설정하는 방법은 임시 수단일 뿐이며, JIT의 성능을 최적화해야 합니다.

JIT에 대한 자세한 정보는 진단 안내서를 참조하십시오.

### JIT 사용 안함

JIT를 사용하지 않도록 설정하는 방법에는 여러 가지가 있습니다. 두 명령행 옵션 모두 JAVA_COMPILER 환경 변수를 재지정합니다.

JIT를 사용하지 않는 것은 Java 응용프로그램을 디버그할 때 문제점을 분리하는 데 도움이 되는 임시 기능입니다.

- JAVA_COMPILER 환경 변수를 `NONE` 또는 빈 문자열로 설정한 후 java 응용프로그램을 실행하십시오. 쉘 프롬프트에서 다음을 입력하십시오.

          export JAVA_COMPILER=NONE

- JVM 명령행에서 -D 옵션을 사용하여 java.compiler 특성을 `NONE` 또는 빈 문자열로 설정하십시오. 쉘 프롬프트에서 다음을 입력하십시오.

      java -Djava.compiler=NONE <class>

- JVM 명령행에서 -Xint 옵션을 사용하십시오. 쉘 프롬프트에서 다음을 입력하십시오.

      java -Xint <class>

### JIT 사용

기본적으로 JIT는 사용 가능합니다. 여러 가지 방법으로 JIT를 명시적으로 사용할 수 있습니다. 두 명령행 옵션 모두 JAVA_COMPILER 환경 변수를 재지정합니다.

- JAVA_COMPILER 환경 변수를 `jitc`로 설정한 후 Java 응용프로그램을 실행하십시오. 쉘 프롬프트에서 다음을 입력하십시오.

      export JAVA_COMPILER=jitc

  JAVA_COMPILER 환경 변수가 빈 문자열인 경우 JIT는 그대로 사용되지 않습니다. 환경 변수를 사용하지 않으려면 쉘 프롬프트에서 다음을 입력하십시오.

      unset JAVA_COMPILER

- JVM 명령행에서 -D 옵션을 사용하여 java.compiler 특성을 `jitc`로 설정하십시오. 쉘 프롬프트에서 다음을 입력하십시오.

      java -Djava.compiler=jitc <class>

- JVM 명령행에서 -Xjit 옵션을 사용하십시오. -Xint 옵션을 동시에 지정하지 마십시오. 쉘 프롬프트에서 다음을 입력하십시오.

      java -Xjit <class>

### JIT가 사용 가능한지 여부 판별

-version 옵션을 사용하여 JIT의 상태를 판별할 수 있습니다.

-version 옵션으로 java 실행기를 실행하십시오. 쉘 프롬프트에서 다음을 입력하십시오.

        java -version

JIT가 사용되고 있지 않으면 다음이 포함된 메시지가 표시됩니다.

    (JIT disabled)

JIT가 사용되고 있으면 다음이 포함된 메시지가 표시됩니다.

    (JIT enabled)

JIT에 대한 자세한 정보는 진단 안내서를 참조하십시오.

## 가비지 콜렉션 정책 지정

가비지 콜렉터는 JVM에서 실행 중인 응용프로그램 및 Java에서 사용한 메모리를 관리합니다.

가비지 콜렉터가 저장영역에 대한 요청을 수신하는 경우, 힙에서 사용되지 않은 메모리가 "할당"이라는 프로세스에서 따로 설정됩니다. 가비지 콜렉터는 또한 메모리 영역이 더 이상 참조되지 않도록 하고 재사용을 위해 해제합니다. 이를 "콜렉션"이라고 합니다.

콜렉션 단계는 저장영역 요청에 대해 남은 공간이 없는 경우 발생하는 메모리 할당 결함 또는 명시적인 System.gc() 호출로 인해 트리거됩니다.

가비지 콜렉션은 응용프로그램의 성능에 상당한 영향을 미칠 수 있으므로 IBM 가상 시스템은 가비지 콜렉션을 수행하는 방법을 최적화하는 다양한 메소드를 제공하여 잠재적으로 응용프로그램에 대한 영향을 줄입니다.

가비지 콜렉션에 대한 자세한 정보는 진단 안내서를 참조하십시오.

### 가비지 콜렉션 옵션

-Xgcpolicy 옵션은 가비지 콜렉터의 동작을 제어합니다. 이 옵션은 응용프로그램 및 전체 시스템의 처리량과 가비지 콜렉션으로 인한 일시 정지 시간 사이의 균형을 맞춥니다.

옵션 및 해당 값의 형식은 다음과 같습니다.

-Xgcpolicy:optthruput
  (기본값 및 권장 값) 매우 많은 처리량이 응용프로그램으로 전달되지만 종종 일시정지됩니다.
-Xgcpolicy:optavgpause
  가비지 콜렉션의 일시정지 시간을 줄이고 가비지 콜렉션 일시정지 시간에 대한 힙 크기 증가의 영향을 제한합니다. 구성에 매우 큰 힙이 있는 경우에는 optavgpause를 사용하십시오.
-Xgcpolicy:gencon
  동시 및 세대별 GC를 결합하여 사용하도록 요청하여 가비지 콜렉션 일시정지 시간을 최소화합니다.
-Xgcpolicy:subpool
  (PPC 및 zSeries에만 해당) 개선된 오브젝트 할당 알고리즘을 사용하여 힙에 오브젝트를 할당할 때 성능이 향상됩니다. 이 옵션을 통해 대규모 SMP 시스템의 성능을 향상시킬 수 있습니다.

### 일시정지 시간

오브젝트를 작성하려는 응용프로그램의 시도가 힙의 사용 가능한 공간에서 즉시 충족되지 않는 경우, 가비지 콜렉터는 참조되지 않는 오브젝트(가비지)를 식별하고 삭제하여, 즉각적이며 계속적인 할당 요청을 신속하게 충족시킬 수 있는 상태로 힙을 되돌립니다.

이러한 가비지 콜렉션 주기로 인해 때때로 응용프로그램 코드의 실행에 있어서 예상치 않았던 일시정지가 발생하기도 합니다. 응용프로그램의 크기와 복잡도가 증가함에 따라 힙도 더 커지게 되므로, 이러한 가비지 콜렉션 일시정지 시간도 크기 및 중요성이 증가하는 경향이 있습니다.

가비지 콜렉션 기본값인 -Xgcpolicy:optthruput은 응용프로그램에 매우 많은 처리량을 부과하나 그로 인해 때때로 일시정지될 수 있으며 일시정지 시간은 힙의 크기와 가비지의 양에 따라 밀리 초에서 수 초까지 다양합니다.

### 일시정지 시간 단축

JVM은 동시 가비지 콜렉션과 세대별 가비지 콜렉션의 두 가지 기술을 사용하여 일시정지 시간을 단축합니다.

-Xgcpolicy:optavgpause 명령행 옵션은 동시 가비지 콜렉션 사용을 요청하여 가비지 콜렉션 일시정지 시간을 대폭 줄입니다. 동시 GC는 일부 가비지 콜렉션 활동을 정상적인 프로그램 실행과 동시에 수행하여 힙 콜렉션으로 인한 중단을 최소화함으로써 일시정지 시간을 감소시킵니다. 또한 -Xgcpolicy:optavgpause 옵션은 가비지 콜렉션 일시정지 길이에 대한 힙 크기 증가에 따른 영향을 제한합니다. -Xgcpolicy:optavgpause 옵션은 대형 힙이 사용된 구성에서 가장 유용합니다. 그러나 일시정지 시간이 감소되면 응용프로그램의 처리량도 감소할 수 있습니다.

동시 가비지 콜렉션에서는 수집할 수 없는 비교적 오래된 오브젝트를 식별하는 데 상당한 시간이 소요됩니다. 가비지 콜렉션이 재활용 가능성이 높은 오브젝트에만 집중하면 일부 응용프로그램의 일시정지 시간을 더욱 단축할 수 있습니다. 세대별 GC는 힙을 "nursery"와 "tenure" 영역의 두 "세대"로 나누어서 일시정지 시간을 단축합니다. 오브젝트는 연령에 따라 두 영역 중 하나에 속합니다. nursery 영역은 둘 중 더 작은 규모이고 최근의 오브젝트를 포함합니다. tenure는 더 크고 오래된 오브젝트를 포함합니다. 오브젝트는 처음에 nursery에 할당되며 nursery에서 오래 남아 있게 되면 tenure 영역으로 승격됩니다.

세대별 GC는 대부분 오래 지속되지 않는 오브젝트에 의존합니다. 세대별 GC는 nursery에 가장 많은 재활용 공간이 있기 때문에 이 저장영역을 반환하는 노력에 집중하여 일시정지 시간을 줄입니다. 전체 힙 수집에는 비교적 긴 일시정지 시간이 필요하므로 nursery는 수집을 더 자주 수행하며, nursery가 작으면 일시정지 시간도 그만큼 짧아집니다. 단, 세대별 GC의 경우 시간이 지날수록 많은 오브젝트가 너무 오래 지속되어 tenure가 가득 찰 수 있다는 결점이 있습니다. 이러한 경우 일시정지 시간을 최소화하려면 동시 GC 및 세대별 GC를 함께 사용하십시오. -Xgcpolicy:gencon 옵션은 동시 및 세대별 GC를 함께 사용하여 가비지 콜렉션의 일시정지 시간을 최소화합니다.

### 힙이 가득 찬 환경

Java 힙이 거의 가득 차서 재생할 수 있는 가비지가 거의 없는 경우, 새 오브젝트를 요청하면 즉시 사용할 수 있는 공간이 없으므로 빠르게 충족되지 않습니다.

힙이 용량이 거의 가득 찬 상태로 작동하는 경우, 사용되는 가비지 콜렉션 옵션에 관계 없이 응용프로그램 성능은 저하됩니다. 더 많은 힙 공간을 계속 작성해야 하는 경우 응용프로그램은 OutOfMemoryError를 수신할 수 있으며 예외가 발생하여 처리되지 않는 경우 JVM이 종료됩니다. 이 때 JVM은 진단에 사용할 Javadump 파일을 생성합니다. 이러한 조건에서는 -Xmx 옵션을 사용하여 힙 크기를 늘리거나 사용 중인 오브젝트의 수를 줄일 것을 권장합니다.

자세한 정보는 진단 안내서를 참조하십시오.

## Euro 기호 지원

IBM SDK 및 Runtime Environment는 유럽통화동맹(EMU)에 속한 국가의 기본 통화를 2002년 1월 1일부터 Euro로 설정합니다. 2008년 1월 1일부터 키프로스 및 몰타에서도 기본 통화로 Euro를 사용합니다.

기존의 국가별 통화를 사용하려면 Java 명령행에서 -Duser.variant=PREEURO을 지정하십시오.

영어(영국), 덴마크어 또는 스웨덴어 로케일을 실행 중이며 Euro를 사용하려는 경우, Java 명령행에서 -Duser.variant=EURO을 지정하십시오.

## 대체 글꼴 구성 파일

Linux 대체 글꼴 구성 파일(fontconfig.RedHat.bfc 및 fontconfig.SuSE.bfc)은 새로운 엔터프라이즈인 Linux 배포판에 적합한 글꼴 설정을 제공하기 위해 설치됩니다.

이러한 파일은 단지 편의상 제공됩니다. 해당 파일은 새 Linux 배포판이 IBM SDK and Runtime Environment for Linux, Java Technology Edition, 버전 6에 지원되는 플랫폼이라는 것을 의미하지 않습니다.

| | |

## 인도어 및 태국어 입력 메소드 사용

|
|

버전 6부터 인도어 및 태국어 메소드는 기본적으로 사용할 수 없습니다. 인도어 및 태국어 입력 메소드를 |사용하려면 해당 입력 메소드 jar 파일을 |Java 확장 경로에 |수동으로 포함시켜야 합니다.

|

버전 5.0에서 해당 입력 메소드 jar 파일은 |jre/lib/ext 디렉토리에 |있으며 JVM이 자동으로 로드했습니다. 버전 6에서 해당 입력 메소드 jar 파일은 |jre/lib/im |디렉토리에 있으며, 인도어 및 태국어 입력 메소드를 사용하려면 Java 확장 경로에 |수동으로 추가해야 합니다. 수동으로 추가하려면 다음 중 한 가지 방법을 사용하십시오.

|

|
- indicim.jar 및 thaiim.jar 파일을 |jre/lib/im 디렉토리에서 |jre/lib/ext 디렉토리로 복사하십시오.
|
- 확장 디렉토리 시스템 특성에 jre/lib/im 디렉토리를 추가하십시오. 다음 명령행 옵션을 사용하십시오. | |

      java -Djava.ext.dirs=/opt/ibm/java-i386-60/jre/lib/ext:/opt/ibm/java-i386-60/jre/lib/im <class>

|

|

SDK 또는 Runtime Environment를 |다른 디렉토리에 설치한 경우, /opt/ibm/java-i386-60/을 |SDK 또는 Runtime Environment를 설치한 디렉토리로 바꾸십시오.

# SDK를 사용하여 Java 응용프로그램 개발

SDK for Linux에는 Java 소프트웨어 개발에 필요한 다수의 도구 및 라이브러리가 포함되어 있습니다.

사용 가능한 도구에 대한 자세한 정보는 SDK 도구 및 참조 정보의 내용을 참조하십시오.

| | |

## XML 사용

|
|

IBM SDK에는 XML4J 및 |XL XP-J 구문 분석기, XL TXE-J 1.0 XSLT 컴파일러와 XSLT4J XSLT 해석기가 포함되어 있습니다. |이러한 도구를 사용하면 제공된 XML 처리 구현과는 독립적으로 XML 문서를 |구문 분석, 유효성 검증, 변환 및 직렬화할 수 있습니다.

|

|

XML 프로세서 선택에서 설명한 대로 추상 팩토리 클래스 구현을 찾으려면 |팩토리 찾기 프로그램을 사용하십시오. |팩토리 찾기 프로그램을 사용하여 Java 코드를 |변경하지 않고 다른 XML 라이브러리를 선택할 수 있습니다.

|

| |

### 사용 가능한 XML 라이브러리

|

IBM SDK for Java에는 다음 XML 라이브러리가 있습니다.

|

|
XML4J 4.5
|
  |

  XML4J는 다음 표준을 지원하는 유효성을 검증하는 구문 분석기입니다. |

  |
  |
  - XML 1.0(제4판)
  |
  - Namespaces in XML 1.0(제2판)
  |
  - XML 1.1(제2판)
  |
  - Namespaces in XML 1.1(제2판)
  |
  - W3C XML Schema 1.0(제2판)
  |
  - XInclude 1.0(제2판)
  |
  - OASIS XML Catalogs 1.0
  |
  - SAX 2.0.2
  |
  - DOM Level 3 Core, Load and Save
  |
  - DOM Level 2 Core, Events, Traversal and Range
  |
  - JAXP 1.4
  | |

  XML4J 4.5는 Apache Xerces-J 2.9.0을 기반으로 합니다. 자세한 정보는 웹 사이트 http://xerces.apache.org/xerces2-j/를 참조하십시오.

  |
|
XL XP-J 1.1
|
  |

  XL XP-J 1.1은 유효성을 검증하지 않는 고성능의 구문 분석기로서 |StAX 1.0(JSR 173), XML 1.0 및 XML 1.1 문서의 pull-parsing 및 스트림 직렬화를 위한 |양방향 API를 지원합니다. XL XP-J 1.1에서 지원하는 내용에 대한 자세한 정보는 |XL XP-J 참조 정보를 참조하십시오.

  |
|
XL TXE-J 1.0.1 베타
|
  |

  버전 5.0의 경우 IBM SDK for Java에는 XSLT4J 컴파일러 및 해석기가 포함되었습니다. |XSLT4J 해석기는 기본적으로 사용되었습니다.

  | |

  버전 6의 경우 IBM SDK for Java에는 |XL TXE-J가 포함되어 있습니다. XL TXE-J에는 XSLT4J 2.7.8 해석기 및 새 XSLT 컴파일러가 포함되어 있습니다. |새 컴파일러가 기본적으로 사용됩니다. XSLT4J 컴파일러는 더 이상 |IBM SDK |for Java에 포함되지 않습니다. |XL TXE-J 이주에 대한 정보는 XL-TXE-J로 이주를 참조하십시오.

  | |

  XL TXE-J는 다음 표준을 지원합니다. |

  |
  |
  - XSLT 1.0
  |
  - XPath 1.0
  |
  - JAXP 1.4
  |
|

|

| |

### XML 프로세서 선택

|

XML 프로세서 선택은 서비스 제공자를 사용하여 수행됩니다. 팩토리 찾기 프로그램을 사용하는 경우, |Java에서는 사용할 서비스 제공자를 다음 위치에서 찾습니다. |

|

|
1. 서비스 제공자와 동일한 이름의 시스템 특성
|
2. XMLEventFactory, XMLInputFactory |및 XMLOutputFactory의 경우: /opt/ibm/java-i386-60/jre/lib/stax.properties 파일에서 서비스 제공자의 값
|
3. 기타 팩토리의 경우: /opt/ibm/java-i386-60/jre/lib/jaxp.properties 파일에서 서비스 제공자의 값
|
4. META-INF/services/<service.provider> |파일의 내용
|
5. 기본 서비스 제공자

|

다음 서비스 제공자는 |Java에서 사용하는 XML 처리 라이브러리를 제어합니다. |

|

|
javax.xml.parsers.SAXParserFactory
|
  SAX 구문 분석기를 선택합니다. 기본적으로 XML4J 라이브러리의 org.apache.xerces.jaxp.SAXParserFactoryImpl이 사용됩니다. |
|
javax.xml.parsers.DocumentBuilderFactory
|
  문서 빌더를 선택합니다. 기본적으로 XML4J 라이브러리의 org.apache.xerces.jaxp.DocumentBuilderFactoryImpl이 사용됩니다. |
|
javax.xml.datatype.DatatypeFactory
|
  데이터 유형 팩토리를 선택합니다. 기본적으로 XML4J 라이브러리의 org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl이 |사용됩니다. |
|
javax.xml.stream.XMLEventFactory
|
  StAX 이벤트 팩토리를 선택합니다. 기본적으로 XL XP-J 라이브러리의 com.ibm.xml.xlxp.api.stax.XMLEventFactoryImpl이 |사용됩니다. |
|
javax.xml.stream.XMLInputFactory
|
  StAX 구문 분석기를 선택합니다. 기본적으로 XL XP-J 라이브러리의 com.ibm.xml.xlxp.api.stax.XMLInputFactoryImpl이 |사용됩니다. |
|
javax.xml.stream.XMLOutputFactory
|
  StAX 직렬 프로그램을 선택합니다. 기본적으로 XL XP-J 라이브러리의 com.ibm.xml.xlxp.api.stax.XMLOutputFactoryImpl이 |사용됩니다. |
|
javax.xml.transform.TransformerFactory
|
  XSLT 프로세서를 선택합니다. 가능한 값은 다음과 같습니다. | |
  |
  com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl
  |
    XL TXE-J 컴파일러를 사용합니다. 기본값입니다. |
  |
  org.apache.xalan.processor.TransformerFactoryImpl
  |
    XSLT4J 해석기를 사용합니다. |
  |
  |
|
javax.xml.validation.SchemaFactory:http://www.w3.org/2001/XMLSchema
|
  W3C XML 스키마 언어의 스키마 팩토리를 선택합니다. 기본적으로 XML4J 라이브러리의 org.apache.xerces.jaxp.validation.XMLSchemaFactory가 |사용됩니다. |
|
javax.xml.xpath.XPathFactory
|
  XPath 프로세서를 선택합니다. 기본적으로 XSLT4J 라이브러리의 org.apache.xpath.jaxp.XPathFactoryImpl이 사용됩니다. |
|

| |

### XL-TXE-J로 이주

|
|

XL TXE-J 컴파일러는 XSLT4J 해석기를 기본 |XSLT 프로세서로 대체했습니다. 새 라이브러리에 맞게 응용프로그램을 준비하려면 다음 단계를 |수행하십시오.

|

|

같은 변환을 두 번 이상 적용하려면 XL TXE-J 컴파일러가 XSLT4J 해석기보다 |빠릅니다. 각각의 개별 변환을 한번만 수행하는 경우에는 컴파일 및 최적화 오버헤드로 인해 |XL TXE-J 컴파일러가 XSLT4J 해석기보다 느립니다.

|

XSLT 프로세서로 XSLT4J 해석기를 계속 사용하려면 |javax.xml.transform.TransformerFactory 서비스 제공자를 |org.apache.xalan.processor.TransformerFactoryImpl로 설정하십시오.

|

XL-TXE-J 컴파일러로 이주하려면 다음 단계를 수행하십시오.

|

|
1. javax.xml.transform.TransformerFactory 서비스 제공자를 설정하는 경우 |com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl을 사용하십시오.
|
2. XSLT4J 컴파일러가 생성한 클래스 파일을 다시 생성하십시오. XL TXE-J는 XSLT4J 컴파일러가 생성한 클래스 파일을 실행할 수 없습니다.
|
3. 컴파일러에서 생성된 일부 메소드는 JVM 메소드 크기 한계를 초과할 수 있으며, |이 경우 컴파일러는 이러한 메소드를 더 작은 메소드로 분할을 |시도합니다. | |
   |
   - 컴파일러가 메소드를 분할한 경우 다음과 같은 경고가 수신됩니다. |『생성된 일부 기능이 JVM 메소드 크기 한계를 초과했으며 더 작은 기능으로 |자동 분할되었습니다. Process 또는 Compile 명령에 |'splitlimit' 옵션을 사용하거나 'http://www.ibm.com/xmlns/prod/xltxe-j/split-limit' 변환기 |팩토리 속성을 설정하여 매우 큰 템플리트를 더 작은 템플리트로 수동 분할하면 더 나은 성능을 얻을 수 있습니다.』 컴파일된 |클래스를 사용할 수 있으나 분할 한계를 수동으로 제어하면 더 좋은 성능을 얻을 수 있습니다.
   |
   - 컴파일러가 메소드를 분할하지 않은 경우, 다음 예외 중 하나를 |수신하게 됩니다. 『com.ibm.xtq.bcel.generic.ClassGenException: |Branch target offset too large for short』 또는 『bytecode array size > 65535 |at offset=#####』. 분할 한계를 수동으로 설정하거나 보다 낮은 분할 한계를 |사용하도록 하십시오.
   분할 한계를 설정하려면 Process 또는 Compile 명령을 사용하는 경우 |-SPLITLIMIT 옵션을 사용하고, 변환기 팩토리를 사용하는 경우 |http://www.ibm.com/xmlns/prod/xltxe-j/split-limit 변환기 팩토리 |속성을 사용하십시오. 분할 한계의 범위는 100 - 200입니다. 분할 한계를 |수동으로 설정하는 경우 최고 성능을 위해 가능한 한 최대 분할 한계를 사용하십시오.
|
4. XL TXE-J에는 XSLT4J 컴파일러보다 많은 메모리가 필요합니다. 실행 중에 메모리가 부족하거나 성능이 느려지는 경우 |-Xmx 옵션을 사용하여 힙 크기를 늘리십시오.
|
5. 새 속성 키를 사용하려면 응용프로그램을 이주하십시오. 이전 변환기 팩토리 속성 키는 사용되지 않습니다. 이전 이름은 경고와 함께 허용됩니다. | | |

   표 1. XSL4J 컴파일러에서 XL TXE-J 컴파일러로 속성 키 변경
   |XSL4J 컴파일러 속성 | | XL TXE-J 컴파일러 속성 |
   --- | ---
   |translet-name | | http://www.ibm.com/xmlns/prod/xltxe-j/translet-name |
   |destination-directory | | http://www.ibm.com/xmlns/prod/xltxe-j/destination-directory |
   |package-name | | http://www.ibm.com/xmlns/prod/xltxe-j/package-name |
   |jar-name | | http://www.ibm.com/xmlns/prod/xltxe-j/jar-name |
   |generate-translet | | http://www.ibm.com/xmlns/prod/xltxe-j/generate-translet |
   |auto-translet | | http://www.ibm.com/xmlns/prod/xltxe-j/auto-translet |
   |use-classpath | | http://www.ibm.com/xmlns/prod/xltxe-j/use-classpath |
   |debug | | http://www.ibm.com/xmlns/prod/xltxe-j/debug |
   |indent-number | | http://www.ibm.com/xmlns/prod/xltxe-j/indent-number |
   |enable-inlining | | 새 컴파일러에서 사용되지 않음 |
   |

|
6. 옵션: 성능을 최대화하려면 재사용할 수 있는 XSLT 변환을 |리컴파일하지 않는지 확인하십시오. 컴파일된 변환을 다시 사용하려면 다음 방법 중 하나를 |사용하십시오. | |
   |
   - 스타일시트가 런타임에 변경되지 않으면 빌드 프로세스 중 일부로 스타일시트를 |컴파일한 후 컴파일된 클래스를 클래스 경로에 지정하십시오. |org.apache.xalan.xsltc.Compile 명령을 사용하여 스타일시트를 컴파일한 후 |http://www.ibm.com/xmlns/prod/xltxe-j/use-classpath 변환기 팩토리 속성을 |`true`로 설정하면 클래스 경로에서 클래스를 로드할 수 있습니다.
   |
   - 다중 실행 중에 응용프로그램에서 같은 스타일시트를 사용하려는 경우 |http://www.ibm.com/xmlns/prod/xltxe-j/auto-translet 변환기 팩토리 속성을 |`true`로 설정하면 컴파일된 디스크를 재사용할 디스크에 자동으로 |저장할 수 있습니다. 컴파일러는 사용 가능한 컴파일된 스타일시트를 사용하지만 |사용할 수 없거나 날짜가 지난 경우에는 스타일시트를 컴파일합니다. 컴파일된 스타일시트를 저장하는 데 사용한 |디렉토리를 설정하려면 http://www.ibm.com/xmlns/prod/xltxe-j/destination-directory 변환기 |팩토리 속성을 사용하십시오. |기본적으로 컴파일된 스타일시트는 스타일시트와 동일한 디렉토리에 저장됩니다.
   |
   - 동일한 스타일시트를 재사용하여 실행 시간이 긴 응용프로그램인 경우에는 |변환기 팩토리를 사용하여 스타일시트를 컴파일한 후 |Templates 오브젝트를 작성하십시오. Templates 오브젝트를 |사용하면 스타일시트를 리컴파일하지 않고 Transformer 오브젝트를 작성할 수 있습니다. Transformer 오브젝트도 재사용할 수는 있으나 스레드가 안전하지 않습니다.

| |

### XML 참조 정보

|
|

XL XP-J 및 XL TXE-J XML 라이브러리는 SDK 버전 6의 새로운 기능입니다. |이 참조 정보에서는 이러한 라이브러리에서 지원되는 기능에 대해 설명합니다.

| | |

#### XL XP-J 참조 정보

|
|

XL XP-J 1.1은 StAX 1.0(JSR 173)을 지원하는 유효성을 검증하지 않는 고성능의 구문 분석기로 |XML 1.0 및 XML 1.1 문서의 풀 구문 분석과 스트리밍 직렬화를 수행할 수 있는 양방향 API입니다.

|

| |

##### 지원되는 기능

|

다음과 같은 선택적 StAX 기능은 XL XP-J에서 지원되지 않습니다. |

|

|
- XMLStreamReader 또는 XMLEventReader를 사용하는 경우 DTD 유효성 검증 기능입니다. |XL XP-J 구문 분석기는 유효성을 검증하지 않습니다.
|
- XMLStreamReader 또는 XMLEventReader를 사용하는 경우 위치 정보입니다. |위치 오브젝트에서 getCharacterOffset(), getColumnNumber() 및 |getLineNumber() 메소드를 조회하면 문서에서 구문 분석기의 현재 위치와 관계없이 -1이 리턴됩니다.

|

| |

##### XMLInputFactory 참조

|

다음 특성은 XMLInputFactory Javadoc에 설명된 대로 |javax.xml.stream.XMLInputFactory 구현에서 지원됩니다.

| |

표 2.
|특성 이름 | | 지원 |
--- | ---
|javax.xml.stream.isValidating | | 아니오. XL XP-J 스캐너는 유효성 검증을 지원하지 않습니다. |
|javax.xml.stream.isNamespaceAware | | 예(true 및 false 지원). DOMSource에서 작성된 |XMLStreamReader인 경우 |DOM 트리를 작성하는 데 사용된 메소드에 따라 이름 공간이 처리되면 |이 값이 영향을 미치지 않습니다. |
|javax.xml.stream.isCoalescing | | 예 |
|javax.xml.stream.isReplacingEntityReferences | | 예. DOMSource에서 작성된 XMLStreamReader인 경우 |DOM 트리에서 엔티티가 이미 바뀌어 있으면 이 매개변수의 설정이 영향을 미치지 않습니다. |
|javax.xml.stream.isSupportingExternalEntities | | 예 |
|javax.xml.stream.supportDTD | | 아니오. DTD는 항상 지원됩니다. 값을 false로 설정하면 영향을 미치지 않습니다. |
|javax.xml.stream.reporter | | 예 |
|javax.xml.stream.resolver | | 예 |
|

|

또한 XL XP-J는 |선택적 메소드인 createXMLStreamReader(javax.xml.transform.Source)를 지원하며 |이를 통해 DOM 및 SAX에서 StAX 리더를 작성할 수 있습니다.

|

| |

##### XMLStreamReader 참조

|

다음 특성은 XMLStreamReader Javadoc에 설명된 대로 |javax.xml.stream.XMLStreamReader 구현에서 지원됩니다.

| |

표 3.
|특성 이름 | | 지원 |
--- | ---
|javax.xml.stream.entities | | 예 |
|javax.xml.stream.notations | | 예 |
|

|

또한 XL XP-J javax.xml.stream.isInterning 특성을 지원하며 |이는 API 호출로 리턴된 XML 이름 및 이름 공간 URI가 구문 분석기에서 수행되었는지 여부를 나타내는 부울을 리턴합니다.

|

| |

##### XMLOutputFactory 참조

|

다음 특성은 XMLOutputFactory Javadoc에 설명된 대로 |javax.xml.stream.XMLOutputFactory 구현에서 지원됩니다.

| |

표 4.
|특성 이름 | | 지원 |
--- | ---
|javax.xml.stream.isRepairingNamespaces | | 예 |
|

|

| |

##### XMLStreamWriter 참조

|

다음 특성은 XMLStreamWriter Javadoc에 설명된 대로 |javax.xml.stream.XMLStreamWriter 구현에서 지원됩니다.

| |

표 5.
|특성 이름 | | 지원 |
--- | ---
|javax.xml.stream.isRepairingNamespaces | | 예 |
|

|

XMLStreamWriter 오브젝트에서 특성은 읽기 전용입니다.

| | |

#### XL TXE-J 참조 정보

|
|

XL TXE-J는 XSLT4J 2.7.8 해석기 및 |XSLT 컴파일러를 포함하는 XSLT 라이브러리입니다.

|

| |

##### 기능 비교 테이블

| |

표 6. XSLT4J 해석기, XSLT4J 컴파일러 및 XL TXE-J 컴파일러의 기능 비교.
|기능 | | XSLT4J 해석기(포함) | | XSLT4J 컴파일러(포함되지 않음) | | XL TXE-J 컴파일러(포함) |
--- | --- | --- | ---
|http://javax.xml.transform.stream.StreamSource/feature |기능 | | 예 | | 예 | | 예 |
|http://javax.xml.transform.stream.StreamResult/feature |기능 | | 예 | | 예 | | 예 |
|http://javax.xml.transform.dom.DOMSource/feature 기능 | | 예 | | 예 | | 예 |
|http://javax.xml.transform.dom.DOMResult/feature 기능 | | 예 | | 예 | | 예 |
|http://javax.xml.transform.sax.SAXSource/feature 기능 | | 예 | | 예 | | 예 |
|http://javax.xml.transform.sax.SAXResult/feature 기능 | | 예 | | 예 | | 예 |
|http://javax.xml.transform.stax.StAXSource/feature 기능 | | 예 | | 아니오 | | 예 |
|http://javax.xml.transform.stax.StAXResult/feature 기능 | | 예 | | 아니오 | | 예 |
|http://javax.xml.transform.sax.SAXTransformerFactory/feature |기능 | | 예 | | 예 | | 예 |
|http://javax.xml.transform.sax.SAXTransformerFactory/feature/xmlfilter |기능 | | 예 | | 예 | | 예 |
|http://javax.xml.XMLConstants/feature/secure-processing |기능 | | 예 | | 예 | | 예 |
|http://xml.apache.org/xalan/features/incremental 속성 | | 예 | | 아니오 | | 아니오 |
|http://xml.apache.org/xalan/features/optimize 속성 | | 예 | | 아니오 | | 아니오 |
|http://xml.apache.org/xalan/properties/source-location |속성 | | 예 | | 아니오 | | 아니오 |
|translet-name 속성 | | N/A | | 예 | | 예(새 이름으로) |
|destination-directory 속성 | | N/A | | 예 | | 예(새 이름으로) |
|package-name 속성 | | N/A | | 예 | | 예(새 이름으로) |
|jar-name 속성 | | N/A | | 예 | | 예(새 이름으로) |
|generate-translet 속성 | | N/A | | 예 | | 예(새 이름으로) |
|auto-translet 속성 | | N/A | | 예 | | 예(새 이름으로) |
|use-classpath 속성 | | N/A | | 예 | | 예(새 이름으로) |
|enable-inlining 속성 | | 아니오 | | 예 | | 아니오(TL TXE-J에서 사용되지 않음) |
|indent-number 속성 | | 아니오 | | 예 | | 예(새 이름으로) |
|debug 속성 | | 아니오 | | 예 | | 예(새 이름으로) |
|Java 확장 | | 예 | | 예(축약된 구문에만 해당, xalan:component/xalan:script |구성은 지원되지 않음) |
|JavaScript 확장 | | 예 | | 아니오 | | 아니오 |
|확장 요소 | | 예 | | 아니오 | | 아니오 |
|EXSLT 확장 기능 | | 예 | | 예(동적 제외) | | 예(동적 제외) |
|redirect 확장 | | 예 | | 예(redirect:open 및 redirect:close 제외) | | 예 |
|output 확장 | | 아니오 | | 예 | | 예 |
|nodeset 확장 | | 예 | | 예 | | 예 |
|NodeInfo 확장 기능 | | 예 | | 아니오 | | 아니오 |
|SQL library 확장 | | 예 | | 아니오 | | 아니오 |
|pipeDocument 확장 | | 예 | | 아니오 | | 아니오 |
|evaluate 확장 | | 예 | | 아니오 | | 아니오 |
|tokenize 확장 | | 예 | | 아니오 | | 아니오 |
|XML 1.1 | | 예 | | 예 | | 예 |
|

|

| |

##### 참고

|

프로세스 명령을 사용할 경우 StAX 스트림 처리를 사용하여 |변환하려면 -FLAVOR |sr2sw를 사용하고 StAX 이벤트 처리에는 -FLAVOR |er2ew를 사용하십시오.

|

새 컴파일러는 org.apache.xalan.xsltc.dom.XSLTCDTMManager 서비스 제공자를 |검색하지 않습니다. 대신 StreamSource가 사용된 경우 컴파일러는 고성능 XML 구문 분석기로 |전환합니다.

|

Inlining은 XL TXE-J에서 사용되지 않습니다. |

|

|
- Process 명령에 대한 -XN 옵션은 자동으로 무시됩니다.
|
- Compile 명령에 대한 -n 옵션은 자동으로 무시됩니다.
|
- enable-inlining 변환기 팩토리 속성은 자동으로 |무시됩니다.

|

org.apache.xalan.xsltc.trax.SmartTransformerFactoryImpl 클래스는 더 이상 지원되지 않습니다.

| |

#### Xerces 또는 Xalan의 이전 버전 사용

|
|

승인된 대체에 따라 이전 버전의 Xerces(2.0 이전) 또는 Xalan(2.3 이전)을 사용 중인 경우, |응용프로그램을 시작할 때 NullPointerException이 발생할 수 있습니다. 이 예외는 |이러한 이전 버전이 jaxp.properties 파일을 올바르게 처리하지 않아서 발생합니다.

|

|

이러한 예외를 방지하려면 다음 해결책 중 하나를 수행하십시오. | |

|

|
- 최신 JAXP(Java API |for XML Programming) 스펙을 구현하는 응용프로그램의 새 버전으로 업그레이드하십시오(웹 사이트 http://java.sun.com/xml/jaxp/index.html 참조).
|
- /opt/ibm/java-i386-60/jre/lib에서 jaxp.properties 파일을 제거하십시오.
|
- /opt/ibm/java-i386-60/jre/lib에서 jaxp.properties 파일의 항목을 주석 해제하십시오.
|
- -D 명령행 옵션을 사용하여 javax.xml.parsers.SAXParserFactory, |javax.xml.parsers.DocumentBuilderFactory 또는 |javax.xml.transform.TransformerFactory의 시스템 특성을 설정하십시오.
|
- 응용프로그램의 코드 내에서 javax.xml.parsers.SAXParserFactory, javax.xml.parsers.DocumentBuilderFactory 또는 javax.xml.transform.TransformerFactory의 시스템 등록 정보를 설정하십시오. |예를 들어, JAXP 1.4 스펙을 참조하십시오.
|
- IBM_JAVA_OPTIONS 환경 변수를 사용하여 |SAX 구문 분석기, 문서 빌더 또는 변환기 팩토리를 명시적으로 설정하십시오. 예를 들면 다음과 같습니다. | |

      export IBM_JAVA_OPTIONS=-Djavax.xml.parsers.SAXParserFactory=
      |    org.apache.xerces.jaxp.SAXParserFactoryImpl

  또는 | |

      export IBM_JAVA_OPTIONS=-Djavax.xml.parsers.DocumentBuilderFactory=
      |  org.apache.xerces.jaxp.DocumentBuilderFactoryImpl

  또는 | |

      export IBM_JAVA_OPTIONS=-Djavax.xml.transform.TransformerFactory=
      |    org.apache.xalan.processor.TransformerFactoryImpl

## Java 응용프로그램 디버깅

Java 프로그램을 디버그하려면 JDB(Java Debugger) 응용프로그램을 사용하거나 SDK for Linux가 제공하는 JPDA(Java Platform Debugger Architecture)를 사용하여 통신하는 다른 디버거를 사용할 수 있습니다.

Java를 사용하는 문제점 진단에 대한 자세한 정보는 진단 안내서에 있습니다.

### JDB(Java Debugger)

JDB(Java Debugger)는 SDK for Linux에 포함되어 있습니다. 디버거는 jdb 명령으로 호출되며, JPDA를 사용하여 JVM에 첨부됩니다.

Java 응용프로그램을 디버그하려면 다음을 수행하십시오.

1. 다음 옵션으로 JVM을 시작하십시오.

       java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=<port> <class>

   JVM이 시작되지만 Java 응용프로그램을 시작할 때까지 실행이 일시중단됩니다.
2. 별도의 세션에서 다음과 같이 디버거를 JVM에 첨부할 수 있습니다.

       jdb -attach <port>

   디버거가 JVM에 첨부되며, 이제 다양한 명령을 실행하여 Java 응용프로그램을 시험하고 제어할 수 있습니다. 예를 들어, Java 응용프로그램을 시작하려면 `run`을 입력하십시오.

JDB 옵션에 대한 자세한 정보를 보려면 다음을 입력하십시오.

    jdb -help

JDB 명령에 대한 자세한 정보를 보려면 다음을 수행하십시오.

1. `jdb`를 입력하십시오.
2. jdb 프롬프트에서 `help`를 입력하십시오.

JDB를 사용하여 원격 시스템에서 실행 중인 Java 응용프로그램을 디버그할 수도 있습니다. JPDA는 TCP/IP 소켓을 사용하여 원격 JVM에 연결합니다.

1. 다음 옵션으로 JVM을 시작하십시오.

       java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=<port> <class>

   JVM이 시작되지만 Java 응용프로그램을 시작할 때까지 실행이 일시중단됩니다.
2. 디버거를 원격 JVM에 첨부하십시오.

       jdb -attach <host>:<port>

JVMDI(Java Virtual Machine Debugging Interface)는 이 릴리스에서 지원되지 않습니다. 대신 JVMTI(Java Virtual Machine Tool Interface)가 사용됩니다.

JDB와 JPDA 및 이들의 사용법에 대한 자세한 정보는 다음 웹 사이트를 참조하십시오.

- http://java.sun.com/products/jpda/
- http://java.sun.com/javase/6/docs/technotes/guides/jpda/
- http://java.sun.com/javase/6/docs/technotes/guides/jpda/jdb.html

## 응용프로그램을 실행 중인 JVM이 32-bit인지 64-bit인지 판별

일부 Java 응용프로그램은 실행 중인 JVM이 32-bit인지 64-bit인지 판별할 수 있어야 합니다. 예를 들어, 응용프로그램에 원시 코드 라이브러리가 있으면 해당 라이브러리는 32-bit 및 64-bit 작업 모드를 모두 지원하는 플랫폼에 대해 32-bit 및 64-bit 형식으로 별도로 컴파일되어야 합니다. 이때, 32-bit 및 64-bit 코드를 혼합할수 없으므로 응용프로그램은 런타임 시 올바른 라이브러리를 로드해야 합니다.

시스템 등록 정보 com.ibm.vm.bitmode를 사용하면 응용프로그램에서 JVM이 실행 중인 모드를 판별할 수 있습니다. 응용프로그램은 다음 값을 리턴합니다.

- 32 - JVM이 32-bit 모드로 실행 중(Linux on System z에서는 31-bit 모드)
- 64 - JVM이 64-bit 모드로 실행 중

다음 호출을 사용하여 응용프로그램 내에서 com.ibm.vm.bitmode 특성을 검사할 수 있습니다.

    System.getProperty("com.ibm.vm.bitmode");

## JVM의 신호 처리 방법

JVM과 관련된 신호가 오면, 신호 핸들러가 호출됩니다. 이 신호 핸들러는 호출한 스레드가 Java인지 비Java인지 판별합니다.

Java 스레드에 대한 신호인 경우 JVM은 신호 처리를 제어할 수 있습니다. 이 신호의 응용프로그램 핸들러가 설치되어 있고 -Xnosigchain 명령행 옵션을 지정하지 않은 경우, JVM이 처리를 완료한 후 이 신호에 대한 응용프로그램 핸들러가 호출됩니다.

신호가 Java 이외의 스레드에 대한 것이며 JVM을 설치한 응용프로그램에 신호를 위한 자체 핸들러가 이미 설치되어 있는 경우에는 해당 핸들러가 신호를 제어합니다. 그렇지 않으면 JVM 또는 Java 응용프로그램에서 신호가 요청되는 경우 신호가 무시되거나 기본 조치가 수행됩니다.

예외 및 오류 신호의 경우, JVM은 다음 중 하나를 수행합니다.

- 조건을 처리하고 복구합니다.
- 제어된 시스템 종료 순서로 들어갑니다.
  1. 실패 시점의 JVM 상태를 설명하는 덤프를 생성합니다.
  2. 해당 신호에 대한 응용프로그램의 신호 핸들러를 호출합니다.
  3. 모든 응용프로그램의 설치 중단 후크를 호출합니다.
  4. 시스템 종료를 위해 필요한 정리를 수행합니다.

위의 후크를 지정하는 실행기를 작성하는 데 대한 정보는 웹 사이트 http://www.ibm.com/developerworks/java/library/i-signalhandling/을 참조하십시오. 이 항목은 Java V1.3.1용으로 작성되었으나 후속 버전에도 적용됩니다.

인터럽트 신호의 경우 JVM은 제어된 시스템 종료 순서를 수행합니다. 이 때, 다음과 같은 정상 종료로 처리됩니다.

1. 해당 신호에 대해 응용프로그램의 신호 핸들러를 호출합니다.
2. 모든 응용프로그램의 시스템 종료 후크를 실행합니다.
3. 응용프로그램 설치 종료 후크를 호출합니다.
4. 필수 JVM 정리를 수행합니다.

이 시스템 종료는 Java 메소드 `System.exit()`를 호출하여 시작되는 시스템 종료와 동일합니다.

JVM에서 사용되는 기타 신호는 내부 제어용이며 JVM을 종료시키지 않습니다. 관련된 제어 신호는 SIGQUIT 뿐이며 이는 Javadump를 생성합니다.

### JVM에서 사용되는 신호

신호의 유형은 예외, 오류, 인터럽트 및 제어입니다.

아래의 표 7에서는 JVM에서 사용되는 신호를 보여줍니다. 신호는 다음과 같이 유형 또는 용도별로 분류됩니다.

예외
  운영 체제는 심각한 조건이 발생할 때마다 적절한 예외 신호를 발생시킵니다.
오류
  JVM은 복구할 수 없는 조건을 발견하는 경우 SIGABRT를 일으킵니다.
인터럽트
  인터럽트 신호는 JVM 프로세스 외부에서 비동기적으로 일어나며 시스템 종료를 요청합니다.
제어
  제어 목적으로 JVM에서 사용되는 기타 신호입니다.

표 7. JVM에서 사용되는 신호
신호 이름 | 신호 유형 | 설명 | -Xrs에 의해 사용 불가능
--- | --- | --- | ---
SIGBUS(7) | 예외 | 잘못된 메모리 액세스(데이터 지정 오류) | 예
SIGSEGV(11) | 예외 | 잘못된 메모리 액세스(액세스할 수 없는 메모리에 쓰기) | 예
SIGILL(4) | 예외 | 잘못된 명령어(알수 없는 시스템 명령을 호출하려는 시도) | 아니오
SIGFPE(8) | 예외 | 부동 소수점 예외(0으로 나누기) | 예
SIGABRT(6) | 오류 | 비정상 종료. JVM 결함을 발견할 때마다 JVM이 이 신호를 일으킵니다. | 예
SIGINT(2) | 인터럽트 | 대화식 주의(CTRL-C). JVM이 정상 종료합니다. | 예
SIGTERM(15) | 인터럽트 | 종료 요청. JVM이 정상 종료합니다. | 예
SIGHUP(1) | 인터럽트 | 끊기. JVM이 정상 종료합니다. | 예
SIGQUIT(3) | 제어 | 단말기에 대한 종료 신호. 기본적으로 Javadump를 트리거합니다. | 예
SIGTRAP(5) | 제어 | JIT에서 사용됩니다. | 예
__SIGRTMAX - 2 | 제어 | SDK에서 사용됩니다. | 아니오
SIGCHLD(17) | 제어 | 내부 제어 목적으로 SDK에서 사용됩니다. | 아니오

JVM이 대부분의 신호를 처리하지 않도록 하려면 -Xrs(신호 사용 단축) 옵션을 사용하십시오. 자세한 정보는 Sun의 Java 응용프로그램 실행기 페이지를 참조하십시오.

JVM 스레드의 신호 1(SIGHUP), 2(SIGINT), 4(SIGILL), 7(SIGBUS), 8(SIGFPE), 11(SIGSEGV) 및 15(SIGTERM)를 사용하면 JVM이 종료됩니다. 따라서 응용프로그램 신호 핸들러에 JVM 서비스가 필요한 경우를 제외하고 이를 복구를 시도하지 말아야 합니다.

### 신호 체인 라이브러리에 원시 코드 드라이버 링크

Runtime Environment에는 신호 체인 기능이 포함되어 있습니다. 신호 체인 기능으로 JVM은 자체 신호 핸들러를 설치하는 원시 코드와 보다 효율적으로 공동 조작할 수 있습니다.

신호 체인을 사용하여 응용프로그램에서 공유 라이브러리 libjsig.so를 시스템 라이브러리 전에 링크하고 로드할 수 있습니다. libjsig.so 라이브러리는 signal(), sigset() 및 sigaction()과 같은 호출을 차단하여 해당 핸들러가 JVM의 신호 핸들러를 대체하지 않도록 합니다. 대신, 이들 호출은 새 신호 핸들러를 저장하거나 이를 JVM이 설치된 핸들러 뒤에 "체인"합니다. 따라서 나중에 이들 신호 중 하나가 발생되고 JVM을 대상으로 하지 않은 경우, 사전 설치된 핸들러가 호출됩니다.

sigaction()을 사용하는 신호 핸들러를 설치할 경우, JVM이 이 신호를 사용할 때 일부 sa_flags가 관찰되지 않습니다. 이들은 다음과 같습니다.

- SA_NOCLDSTOP - 항상 설정 해제
- SA_NOCLDWAIT - 항상 설정 해제
- SA_RESTART - 항상 설정

libjsig.so 라이브러리는 또한 JVM 신호 핸들러를 응용프로그램에서 숨깁니다. 따라서 JVM이 시작된 후에 작성된 signal(), sigset() 및 sigaction()과 같은 호출은 더 이상 JVM 신호 핸들러에 대한 참조를 리턴하지 않지만, 대신 JVM이 시작되기 전에 설치된 모든 핸들러를 리턴합니다.

libjsig.so를 사용하려면 다음과 같이 하십시오.

- libjsig.so를 JVM을 작성하거나 임베드하는 응용프로그램과 링크시키십시오.

      gcc -L$JAVA_HOME/bin -ljsig -L$JAVA_HOME/bin/j9vm -ljvm java_application.c

  또는
- LD_PRELOAD 환경 변수를 사용하십시오.

      export LD_PRELOAD=$JAVA_HOME/bin/libjsig.so; java_application (bash and ksh)

      setenv LD_PRELOAD=$JAVA_HOME/bin/libjsig.so; java_application (csh)

환경 변수 JAVA_HOME은 SDK의 위치로 설정되어야 합니다(예: /opt/ibm/java-i386-60/).

libjsig.a를 사용하려면 다음을 수행하십시오.

- libjsig.so를 JVM을 작성하거나 임베드하는 응용프로그램과 링크시키십시오.

      cc_r -q64 <other compile/link parameter> -L/opt/ibm/java-i386-60/jre/bin -ljsig
      -L/opt/ibm/java-i386-60/jre/bin/j9vm -ljvm java_application.c

  주: 컴파일러나 링커를 정상적으로 호출하는 방법인 경우 `cc_r` 대신 `xlc_r` 또는 `xlC_r`을 사용하십시오.

## JNI 응용프로그램 작성

원시 프로그램에서 JNI_CreateJavaVM() API 호출에 지정할 수 있는 올바른 JNI 버전 번호는 JNI_VERSION_1_2(0x00010002)와 JNI_VERSION_1_4(0x00010004)입니다.

제한사항: JNI(Java Native Interface) 버전 1.1은 지원되지 않습니다.

이 버전 번호는 사용할 JNI 원시 인터페이스의 레벨만 결정합니다. 작성되는 JVM의 실제 레벨은 JSE 라이브러리(v6)에 의해 지정됩니다. JNI 인터페이스 API는 JVM, 클래스 라이브러리 API 또는 JVM 작동의 기타 영역에 의해 구현되는 언어 스펙에 영향을 주지 않습니다. 자세한 정보는 웹 사이트 http://java.sun.com/javase/6/docs/technotes/guides/jni/의 내용을 참조하십시오.

응용프로그램에 두 개의 JNI 라이브러리(32비트용으로 빌드된 라이브러리와 64비트용으로 빌드된 다른 라이브러리)가 필요한 경우 com.ibm.vm.bitmode 시스템 특성을 사용하여 32 또는 64비트 JVM으로 실행 중인지 판별하고 적절한 라이브러리를 선택하십시오.

SDK를 사용하여 원시 프로그램을 컴파일하고 링크하려면 다음 명령을 사용하십시오.

    gcc -I/opt/ibm/java-i386-60/include -L/opt/ibm/java-i386-60/jre/lib/<arch>/j9vm
    -ljvm -ldl -lpthread <JNI program filename>

-ljvm

옵션은 libjvm.so가 JVM을 구현하는 공유 라이브러리가 되도록 지정합니다. -lpthread 옵션은 원시 pthread 지원을 사용 중임을 표시합니다. pthread 라이브러리와 링크하지 않으면 JNI 프로그램 실행 시 세그먼트화 결함(신호 SIGSEGV)이 발생할 수 있습니다.

## 블록된 커넥터의 스레드 레벨 복구 지원

블록된 커넥터의 스레드 레벨 복구를 지원하기 위해 네 개의 새로운 IBM 특정 SDK 클래스가 com.ibm.jvm 패키지에 추가되었습니다. 새 클래스는 core.jar에 패키지화됩니다.

이 클래스를 사용하여 네트워킹 또는 동기화 호출에서 블록된 스레드의 블록을 해제할 수 있습니다. 응용프로그램에서 이들 클래스를 사용하지 않으면 블록된 개별 스레드를 인터럽트하는 대신, 전체 프로세스를 종료해야 합니다.

클래스는 다음과 같습니다.

public interface InterruptibleContext
  isBlocked()와 unblock()의 두 메소드를 정의합니다. 다른 세 클래스는 InterruptibleContext를 구현합니다.
public class InterruptibleLockContext
  동기화 호출을 인터럽트하는 유틸리티 클래스입니다.
public class InterruptibleIOContext
  네트워크 호출을 인터럽트하는 유틸리티 클래스입니다.
public class InterruptibleThread
  인터럽트 가능한 메소드를 랩핑할 수 있도록 java.lang.Thread를 확장하는 유틸리티 클래스입니다. InterruptibleLockContext 및 InterruptibleIOContext의 동기화 또는 네트워크 조작이 스레드를 블로킹 중인지 여부에 따라 인스턴스를 사용하여 필요한 isBlocked() 및 unblock() 메소드를 수행합니다.

InterruptibleLockContext와 InterruptibleIOContext는 모두 현재 스레드를 참조하여 작동합니다. 그러므로 InterruptibleThread를 사용하지 않는 경우 이러한 새 클래스를 사용하려면 자체 클래스를 제공하여 java.lang.Thread를 확장해야 합니다.

이 클래스의 Javadoc이 SDK와 함께 docs/content/apidoc 디렉토리에 제공됩니다.

## 대형 페이지 메모리 할당 구성

대형 페이지를 지원하는 시스템의 경우 -Xlp 옵션으로 Java를 시작하여 대형 페이지 지원을 사용할 수 있습니다.

대형 페이지는 주로 메모리를 대량으로 할당하고 메모리에 자주 액세스하는 응용프로그램의 성능을 향상시키기 위해 사용합니다. 주로 TLB(Translation Lookaside Buffer)의 실패를 줄임으로써 대형 페이지의 성능을 향상시킬 수 있습니다. TLB는 더 큰 가상 메모리 범위를 맵핑하므로 이와 같이 성능이 향상됩니다.

대형 페이지 지원은 커널에서 사용 가능하며, 이를 사용하여 Java에서 대형 페이지를 사용할 수 있습니다.

대형 페이지 메모리 할당을 구성하려면 먼저, 실행 중인 커널이 대형 페이지를 지원하는지 확인하십시오. /proc/meminfo 파일에 다음 행이 있는지 확인하십시오.

    HugePages_Total:     <number of pages>
    HugePages_Free:      <number of pages>
    Hugepagesize:        <page size, in kB>

사용 가능한 페이지 수와 크기는 분배에 따라 다릅니다.

커널에서 대형 페이지 지원을 사용할 수 없는 경우, /proc/meminfo 파일에 이러한 행이 없습니다. 이 때는 대형 페이지 지원이 포함된 새 커널을 설치해야 합니다.

대형 페이지 지원을 사용할 수 있으나, 사용 가능으로 되어 있지 않은 경우에는 `HugePages_Total` 값이 0이 됩니다. 이 경우, 관리자가 대형 페이지 지원을 사용 가능하게 해야 합니다. 자세한 지시사항은 운영 체제 안내서를 확인하십시오.

JVM에서 대형 페이지를 사용하려면 사용 가능한 적절한 수의 연속된 대형 페이지가 시스템에 있어야 합니다. 사용 가능한 페이지가 충분한데도 대형 페이지를 할당할 수 없는 경우, 대형 페이지는 연속되지 않습니다. 부팅 시 대형 페이지의 수를 구성하여 연속으로 작성할 수 있습니다.

대형 페이지 할당은 JVM이 루트 액세스 권한을 가지는 경우에만 성공합니다. 대형 페이지를 사용하려면 Java를 루트로 실행하거나 Java 실행기의 SUID 비트를 설정하십시오.

## CORBA 지원

Java, Standard Edition(JSE)은 최소한 Sun의 준수 문서에서 정의된 스펙을 지원합니다. 일부 경우, IBM JSE ORB는 해당 스펙의 더 최신 버전을 지원합니다.

지원되는 최소 스펙은 Java SE 6의 CORBA 지원을 위한 공식 스펙에서 정의됩니다.

### GIOP 1.2 지원

이 SDK는 OMG 문서 formal/99-10-07에서 CORBA 2.3.1 스펙의 제13장 및 제15장에 정의된 모든 GIOP 버전을 지원합니다.

http://www.omg.org/cgi-bin/doc?formal/99-10-07

양방향 GIOP는 지원되지 않습니다.

### 휴대용 인터셉터 지원

이 SDK는 ptc/01-03-04 문서에서 OMG가 정의한 대로 휴대용 인터셉터를 지원합니다. 이 문서는 다음 웹 사이트에서 찾아볼 수 있습니다.

http://www.omg.org/cgi-bin/doc?ptc/01-03-04

휴대용 인터셉터는 ORB 서비스가 ORB의 정상적인 실행 플로우를 인터셉트하는 데 사용할 수 있는 ORB에 연결될 수 있습니다.

### 상호 운용 가능한 이름 지정 서비스 지원

이 SDK는 ptc/00-08-07 문서에서 OMG가 정의한 대로 상호 운용 가능한 이름 지정 서비스를 지원합니다. 이 문서는 다음에서 찾아볼 수 있습니다.

http://www.omg.org/cgi-bin/doc?ptc/00-08-07

ORBInitialPort 매개변수가 지정되지 않은 경우 이름 서버(tnameserv 명령)에서 사용되는 기본 포트는 900에서 2809로 변경되었습니다. 이 숫자는 CORBA 이름 지정 서비스에 대한 IANA(Internet Assigned Number Authority)에 등록된 포트 번호입니다. 이 기본값을 사용하는 프로그램의 경우 이 버전에서 작동하려면 업데이트해야 할 수도 있습니다.

임시 이름 서버에서 리턴된 초기 컨텍스트는 이제 org.omg.CosNaming.NamingContextExt입니다. 참조 범위를 org.omg.CosNaming.NamingContext 컨텍스트로 좁힌 기존 프로그램은 계속해서 작동되므로 다시 컴파일할 필요가 없습니다.

ORB는 상호 운용 가능한 이름 지정 서비스 스펙에서 정의된 -ORBInitRef 및 -ORBDefaultInitRef 매개변수를 지원하며, ORB::string_to_object 조작은 상호 운용 가능한 이름 지정 스펙에서 정의된 ObjectURL 문자열 형식(corbaloc: 및 corbaname:)을 지원합니다.

OMG는 상호 운용 가능한 이름 지정 서비스로 서비스를 등록하기 위해 ORB::register_initial_reference 메소드를 지정합니다. 그러나 이 메소드는 버전 6의 Sun Java Core API에서는 사용할 수 없습니다. 현재 버전에서 서비스를 등록해야 하는 프로그램은 IBM 내부 ORB 구현 클래스에서 이 메소드를 호출해야 합니다. 예를 들어, 『MyService』 서비스를 등록하려면 다음을 입력하십시오.

    ((com.ibm.CORBA.iiop.ORB)orb).register_initial_reference("MyService",
    serviceRef);

여기서 `orb`는 ORB.init()에서 리턴된 org.omg.CORBA.ORB의 인스턴스이며, `serviceRef`는 ORB에 연결된 CORBA 오브젝트입니다. 이 메커니즘은 임시로 사용되며, 추후 버전과 호환되지 않고 비IBM ORB에 이식할 수 없습니다.

### ORB 추적을 위한 시스템 특성

런타임 디버그 기능은 개선된 서비스 가능성을 제공합니다. 이 기능은 문제점 진단에 유용하며 IBM 서비스 담당자가 요청할 수도 있습니다.

#### 추적 특성

com.ibm.CORBA.Debug=true
  ORB 추적을 사용합니다.
com.ibm.CORBA.CommTrace=true
  추적에 GIOP 메시지를 추가합니다(송수신).
com.ibm.CORBA.Debug.Output=<file>
  추적 출력 파일을 지정합니다. 기본 형식은 orbtrc.DDMMYYYY.HHmm.SS.txt입니다.

#### ORB 추적의 예제

예를 들어, 이벤트 및 형식화된 GIOP 메시지를 추적하려면 명령행에서 다음을 입력하십시오.

     java -Dcom.ibm.CORBA.Debug=true
         -Dcom.ibm.CORBA.CommTrace=true <myapp>

#### 제한사항

시스템 성능을 저하시킬 수 있으므로 정상 운영 시에는 추적을 사용하지 마십시오. 추적을 사용하지 않도록 전환해도 FFDC(First Failure Data Capture)는 여전히 작동하므로 심각한 오류가 보고됩니다. 디버그 출력 파일이 생성되면 이를 검토하여 문제점을 확인하십시오. 예를 들어, 서버가 ORB.shutdown()을 수행하지 않고 중지되었을 수 있습니다.

추적 결과물의 내용과 포맷은 버전에 따라 다를 수 있습니다.

### ORB 조정을 위한 시스템 특성

특정 네트워크에 대해 잘 작동하도록 ORB를 조정할 수 있습니다. ORB를 조정하는 데 필요한 특성을 여기에서 설명합니다.

com.ibm.CORBA.FragmentSize=<size in bytes>
  GIOP 1.2 단편화를 제어하는 데 사용됩니다. 기본 크기는 1024바이트입니다.

  단편화를 사용하지 않으려면 단편 크기를 0바이트로 설정하십시오.

      java -Dcom.ibm.CORBA.FragmentSize=0 <myapp>

com.ibm.CORBA.RequestTimeout=<time in seconds>
  CORBA Request의 최대 대기 시간을 설정하십시오. 기본적으로 ORB는 무기한 대기합니다. 시간 종료를 너무 짧게 설정하여 불필요한 연결 종료가 발생하지 않도록 하십시오.
com.ibm.CORBA.LocateRequestTimeout=<time in seconds>
  CORBA LocateRequest의 최대 대기 시간을 설정하십시오. 기본적으로 ORB는 무기한 대기합니다.
com.ibm.CORBA.ListenerPort=<port number>
  ORB가 들어오는 요청을 읽을 포트를 설정하십시오. 이 등록 정보가 설정되면 ORB는 초기화된 후 바로 청취하기 시작합니다. 그렇지 않으면 필요한 경우에만 청취를 시작합니다.

### ORM에 대한 Java 보안 권한

Java SecurityManager로 실행하는 경우 CORBA API 클래스의 일부 메소드를 호출하면 권한을 확인하므로 SecurityException이 발생할 수 있습니다. 프로그램이 이러한 메소드를 사용하는 경우, 필요한 권한을 부여받아야 합니다.

표 8. Java SecurityManager로 실행하는 경우 영향을 받는 메소드
클래스/인터페이스 | 메소드 | 필수 권한
--- | --- | ---
org.omg.CORBA.ORB | init | java.net.SocketPermission 분석
org.omg.CORBA.ORB | connect | java.net.SocketPermission 청취
org.omg.CORBA.ORB | resolve_initial_references | java.net.SocketPermission 연결
org.omg.CORBA. portable.ObjectImpl | _is_a | java.net.SocketPermission 연결
org.omg.CORBA. portable.ObjectImpl | _non_existent | java.net.SocketPermission 연결
org.omg.CORBA. portable.ObjectImpl | OutputStream _request(String, boolean) | java.net.SocketPermission 연결
org.omg.CORBA. portable.ObjectImpl | _get_interface_def | java.net.SocketPermission 연결
org.omg.CORBA. Request | invoke | java.net.SocketPermission 연결
org.omg.CORBA. Request | send_deferred | java.net.SocketPermission 연결
org.omg.CORBA. Request | send_oneway | java.net.SocketPermission 연결
javax.rmi. PortableRemoteObject | narrow | java.net.SocketPermission 연결

### ORB 구현 클래스

ORB 구현 클래스의 목록입니다.

이 릴리스의 ORB 구현 클래스는 다음과 같습니다.

- org.omg.CORBA.ORBClass=com.ibm.CORBA.iiop.ORB
- org.omg.CORBA.ORBSingletonClass=com.ibm.rmi.corba.ORBSingleton
- javax.rmi.CORBA.UtilClass=com.ibm.CORBA.iiop.UtilDelegateImpl
- javax.rmi.CORBA.StubClass=com.ibm.rmi.javax.rmi.CORBA.StubDelegateImpl
- javax.rmi.CORBA.PortableRemoteObjectClass=com.ibm.rmi.javax.rmi.PortableRemoteObject

이것이 기본값이며, 이러한 등록 정보를 설정하거나 구현 클래스를 직접 참조하지 않는 것이 좋습니다. 이식성의 경우, 구현이 아닌 CORBA API 클래스에 대한 참조만 작성하십시오. 이 값은 추후 릴리스에서 변경될 수 있습니다.

## RMI over IIOP

Java RMI(Remote Method Invocation)는 분배된 Java 프로그래밍을 위한 단순한 매커니즘을 제공합니다. RMI-IIOP(RMI over IIOP)는 CORBA(Common Object Request Broker Architecture) 표준 IIOP 프로토콜(Internet Inter-ORB Protocol)을 사용하여 통신을 수행하도록 기본 Java RMI를 확장합니다. 이를 사용하면 Java로 구현되었는지 또는 다른 프로그래밍 언어로 구현되었는지에 관계 없이 다른 CORBA ORB(Object Request Broker)와 직접 상호작용할 수 있습니다.

다음 문서를 참조하십시오.

- RMI-IIOP Programmer's Guide는 RMI-IIOP 프로그램 작성에 대해 설명합니다.
- Java Language to IDL Mapping 문서는 RMI-IIOP의 자세한 기술 스펙입니다.

## RMI 연결 핸들러 풀 구현

기본적으로 RMI 연결 핸들러의 스레드 풀링은 사용할 수 없습니다.

TCPTransport 레벨에서 구현된 연결 풀링을 사용하려면 다음 옵션을 설정하십시오.

    -Dsun.rmi.transport.tcp.connectionPool=true

이 버전의 Runtime Environment에는 연결 풀의 스레드 수를 제한할 수 있는 설정이 없습니다.

## 향상된 BigDecimal

Java 5.0부터 Sun사가 IBM BigDecimal 클래스를 java.math.BigDecimal로 채택했습니다. com.ibm.math.BigDecimal 클래스는 IBM에서 나중에 사용할 수 있도록 예약되어 있지만 현재 사용할 수 없습니다. java.math.BigDecimal을 사용하려면 기존의 Java 코드를 이주하십시오.

새 java.math.BigDecimal은 이전의 java.math.BigDecimal 및 com.ibm.math.BigDecimal 둘 다와 동일한 메소드를 사용합니다. java.math.BigDecimal을 사용하는 기존 코드는 계속 올바르게 작동합니다. 두 클래스는 직렬화하지 않습니다.

java.math.BigDecimal 클래스를 사용하도록 기존 Java 코드를 이주하려면 .java 파일 맨 위의 import 문을 `import com.ibm.math.*;`에서 `import java.math.*;`로 변경하십시오.

# Plug-in, 애플릿 뷰어 및 Web Start

Java Plug-in은 브라우저 내에서 Java 응용프로그램을 실행하는 데 사용됩니다. appletviewer는 브라우저에서 실행되도록 설계된 응용프로그램을 테스트하는 데 사용됩니다. Java Web Start는 네트워크상의 데스크탑 Java 응용프로그램을 배치하는 데 사용되며 이러한 응용프로그램을 최신으로 유지하는 데 필요한 메커니즘을 제공합니다.

## (Linux IA 32비트 및 PPC32에만 해당) Java Plug-in 사용

Java Plug-in은 웹 브라우저 플러그인입니다. Java Plug-in을 사용하여 브라우저에서 애플릿을 실행합니다.

브라우저가 정지되지 않게 하려면 애플릿이 로드를 완료할 수 있도록 해야 합니다. 예를 들어, 애플릿이 로드하는 동안 뒤로 단추 및 앞으로 단추를 사용하면 HTML 페이지가 로드되지 않을 수 있습니다.

Java Plug-in은 http://java.sun.com/javase/6/docs/technotes/guides/plugin/developer_guide/에 있는 Sun에서 문서화되었습니다.

### 지원되는 브라우저

Java Plug-in은 SeaMonkey, Mozilla, 및 Mozilla Firefox를 지원합니다.

표 9. Linux IA32용 Java Plug-in에서 지원되는 브라우저
브라우저 | 지원되는 버전
--- | ---
Mozilla | 1.7.12, 1.8
Firefox | 1.5, 2.0

표 10. Linux PPC32용 Java Plug-in에서 지원되는 브라우저.
브라우저 | 지원되는 버전
--- | ---
Mozilla | 1.6
|SeaMonkey | |1.0.8

약간 차후 릴리스의 브라우저만 지원됩니다.

### Java Plug-in 설치 및 구성

Java Plug-in을 설치하려면 기호를 사용하여 Plug-in을 웹 브라우저의 Plug-in 디렉토리에 링크합니다.

Java Plug-in은 Mozilla의 Open JVM Integration 시작을 기반으로 하며, Firefox를 포함하여 대부분의 Mozilla 제품 및 파생 제품에서 사용됩니다.

일반적인 브라우저에 Plug-in을 설치하는 지시사항은 다음과 같습니다.

Plug-in을 복사하지 말고 기호를 사용하여 링크하면 JVM의 위치를 찾을 수 있습니다.

#### Mozilla

지원되는 Mozilla 버전은 1.4 이상입니다.

1. 루트로 로그인하십시오.
2. Mozilla 플러그인 디렉토리로 변경하십시오(일부 Linux 배포판에서는 다를 수 있음).
   - 모든 사용자가 플러그인을 사용할 수 있도록 하려면:

          cd /usr/local/mozilla/plugins/

   - 현재 사용자만 플러그인을 사용할 수 있도록 하려면:

         cd $HOME/.mozilla/plugins

3. Plug-in에 대한 기호 링크를 작성하십시오.

        ln -s /opt/ibm/java-i386-60/jre/plugin/<arch>/ns7/libjavaplugin_oji.so.

   여기서 <arch>는 시스템의 아키텍처입니다.

Java Plug-in이 사용 가능한지 확인하려면 Mozilla에서 도움말 -> 플러그인 정보를 선택하십시오.

Plug-in을 복사하지 말고 기호를 사용하여 링크하면 JVM의 위치를 찾을 수 있습니다.

제한사항: /usr/local/mozilla/plugins/에는 Java Plug-in 공유 디렉토리가 하나만 있을 수 있습니다. Mozilla는 이 디렉토리(또는 그 아래의 서브디렉토리)에 있는 모든 것을 플러그인으로 로드하려고 시도하며, 두 버전의 Java Plug-in이 로드되는 경우 결과를 예측할 수 없습니다.

#### Firefox

이 단계에서는 모든 사용자가 Java Plug-in을 사용할 수 있도록 합니다.

1. 루트로 로그인하십시오.
2. Firefox Plug-in 디렉토리로 변경하십시오(일부 Linux 배포판에서는 다를 수 있음).

       cd /usr/local/mozilla-firefox/plugins/

3. Plug-in에 대한 기호 링크를 작성하십시오.

        ln -s /opt/ibm/java-i386-60/jre/plugin/<arch>/ns7/libjavaplugin_oji.so.

   여기서 <arch>는 시스템의 아키텍처입니다.

Plug-in을 복사하지 말고 기호를 사용하여 링크하면 JVM의 위치를 찾을 수 있습니다.

### 공통 DOM(Document Object Model) 지원

특정 브라우저의 제한사항 때문에 org.w3c.dom.html 패키지의 모든 기능을 구현하지 못할 수도 있습니다.

다음 중 하나의 오류가 발생할 수 있습니다.

- 일부 기능에서는 sun.plugin.dom.exception.InvalidStateException이 발생합니다.
- 브라우저가 특정 기능을 지원하지 않는 경우 sun.plugin.dom.exception.NotSupportedException이 발생합니다.

### DBCS 매개변수 사용

Java Plug-in은 `<APPLET>`, `<OBJECT>` 및 `<EMBED>` 태그에 대해 2바이트 문자(예: 대만어 BIG-5, 한국어, 일본어를 매개변수로 지원합니다. Java Plug-in이 매개변수를 구문 분석할 수 있도록 HTML 문서에 올바른 문자 인코딩을 선택해야 합니다.

다음과 같이 `<HEAD>` 섹션에서 `<META>` 태그를 사용하여 HTML 문서에 문자 인코딩을 지정하십시오.

    <meta http-equiv="Content-Type" content="text/html; charset=big5">

이 예제에서는 중국어 BIG-5 문자 인코딩을 사용하여 HTML 파일을 구문 분석하도록 브라우저에 지시합니다.

## 애플릿에 대한 작업

애플릿 뷰어에서 APPLET 태그를 사용하여 웹 페이지(HTML 파일)에서 참조로 호출된 하나 이상의 애플릿을 실행할 수 있습니다. 애플릿 뷰어는 HTML 파일에서 APPLET 태그를 찾아 태그에 지정된 대로 별도의 창에서 애플릿을 실행합니다.

애플릿 뷰어는 애플릿을 보기 위한 것이므로 여러 HTML 태그를 포함한 전체 웹 페이지를 표시할 수는 없습니다. 애플릿 뷰어는 APPLET 태그만 구문 분석하며 웹 페이지의 기타 HTML은 분석하지 않습니다.

### 애플릿 뷰어로 애플릿 실행

애플릿 뷰어로 애플릿을 실행하려면 다음 명령을 사용하십시오.

쉘 프롬프트에서 다음을 입력하십시오.

       appletviewer <name>

여기서, <name>은 다음 중 하나입니다.

- 애플릿을 호출하는 HTML 파일의 이름
- 애플릿을 호출하는 웹 페이지의 URL

예를 들어, 애플릿을 호출하는 HTML 파일에서 애플릿 뷰어를 호출하려면 쉘 프롬프트에 다음을 입력하십시오.

      appletviewer $HOME/<filename>.html

여기서 filename은 HTML 파일의 이름입니다.

웹 페이지에서 애플릿 뷰어를 호출하려면 쉘 프롬프트에 다음을 입력하십시오.

    appletviewer http://java.sun.com/applets/NervousText/example1.html

애플릿 뷰어는 <META> 태그의 charset 옵션을 인식하지 못합니다. 애플릿 뷰어가 로드한 파일이 시스템 기본값으로 인코드되지 않은 경우 I/O 예외가 발생할 수 있습니다. 이러한 예외가 발생하지 않도록 하려면 appletviewer를 실행할 때 -encoding 옵션을 사용하십시오. 예를 들면 다음과 같습니다.

    appletviewer -encoding JISAutoDetect sample.html

### 애플릿 뷰어로 애플릿 디버깅

애플릿 뷰어의 -debug 옵션을 사용하여 애플릿을 디버그할 수 있습니다.

예를 들면 다음과 같습니다.

    cd demo/applets/TicTacToe
    ../../../bin/appletviewer -debug example1.html

애플릿 뷰어를 사용하여 애플릿을 디버그하는 방법에 대한 문서는 Sun 웹 사이트(http://java.sun.com/javase/6/docs/technotes/guides/plugin/developer_guide/debugger.html)에 있습니다.

## (Linux IA 32-bit, PPC32 및 PPC64에만 해당) Web Start 사용

Java Web Start는 Java 응용프로그램 배치에 사용됩니다.

Web Start를 사용하여 웹에서 응용프로그램을 직접 실행하고 관리할 수 있습니다. 응용프로그램은 설치 시간을 최소화하기 위해 캐시됩니다. 새 버전을 사용할 수 있는 경우 응용프로그램은 자동으로 업그레이드됩니다.

Web Start는 웹 사이트 http://java.sun.com/javase/6/docs/technotes/guides/javaws/developersguide/syntax.html#resources에 문서화된 다음과 같은 java-vm-args를 지원합니다.

- -verbose
- -version
- -showversion
- -help
- -X
- -ea
- -enableassertions
- -da
- -disableassertions
- -esa
- -enablesystemassertions
- -dsa
- -disablesystemassertions
- -Xint
- -Xnoclassgc
- -Xdebug
- -Xfuture
- -Xrs
- -Xms
- -Xmx
- -Xss

IBM Web Start는 또한 가비지 콜렉션 정책을 설정하는 -Xgcpolicy를 지원합니다.

Web Start를 지원하는 브라우저에 대한 정보는 지원되는 브라우저를 참조하십시오.

Web Start에 대한 자세한 정보는 다음을 참조하십시오.

- http://java.sun.com/products/javawebstart 및

- http://java.sun.com/javase/6/docs/technotes/guides/javaws/index.html.

응용프로그램을 배치하는 데 대한 자세한 정보는 웹 사이트

- http://java.sun.com/javase/6/docs/technotes/guides/deployment/index.html을 참조하십시오.

### Web Start 실행

Web Start는 웹 페이지 또는 명령행에서 실행할 수 있습니다. Web Start 응용프로그램은 Java 응용프로그램 캐시에 저장됩니다.

Java Web Start 버전 6은 .rpm 또는 .tgz 패키지를 사용하여 Java를 설치할 때 자동으로 설치됩니다. .tgz 패키지에서 Java를 추출하는 경우, jre/lib/javaws/updateSettings.sh 쉘 스크립트를 실행하여 시스템에서 .mailcap 및 .mime.types 파일을 업데이트하십시오.

Web Start를 호출하는 방법에는 여러 가지가 있습니다.

- 웹 페이지에서 .jnlp 파일을 참조하는 링크를 선택하십시오.
- 쉘 프롬프트에서 다음을 입력하십시오.

      javaws <URL>

  여기서 <URL>은 .jnlp 파일의 위치입니다.
- 이전에 Java Web Start를 사용하여 응용프로그램을 연 경우, Java 응용프로그램 캐시 뷰어를 사용할 수 있습니다. 쉘 프롬프트에서 다음을 입력하십시오.

      /opt/ibm/java-i386-60/jre/bin/javaws| -viewer

  모든 Java Web Start 응용프로그램은 Java 응용프로그램 캐시에 저장됩니다. 응용프로그램은 최신 버전이 캐시에 없는 경우에만 다운로드됩니다.

### (Linux IA 32-bit에만 해당) Web Start SSV(Secure Static Versioning)

SSV를 사용하여 Web Start 응용프로그램에서 실행할 특정 JVM 버전을 요청할 수 있습니다. 또한 이 기능을 사용하면 응용프로그램이 새 JVM으로 업그레이드된 시스템에서 이전의 보안 취약성을 이용하므로, 이제 기본적으로 SSV가 사용됩니다.

SSV를 사용하는 경우, 특정 JVM을 사용하도록 요청하는 서명되지 않은 Web Start 응용프로그램을 실행하기 전에 사용자에게 경고가 표시됩니다. 서명된 응용프로그램 및 JVM의 최신 버전을 요청하는 응용프로그램은 정상적으로 실행됩니다.

deployment.properties 파일에서 deployment.javaws.ssv.enabled 특성을 false로 설정하여 SSV를 사용하지 않을 수 있습니다.

## Java 응용프로그램 운송

Java 응용프로그램은 일반적으로 클래스, 자원 및 데이터 파일로 구성됩니다.

Java 응용프로그램을 운송할 때 소프트웨어 패키지는 다음 파트로 구성됩니다.

- 사용자 자신의 클래스, 자원 및 데이터 파일
- 설치 프로시저 또는 프로그램

응용프로그램을 실행하려면 사용자에게 Linux용 Runtime Environment가 필요합니다. Linux용 SDK 소프트웨어에는 Runtime Environment가 포함되어 있습니다. 그러나 사용자에게 SDK for Linux 소프트웨어가 설치되어 있다고 가정할 수 없습니다.

Linux용 SDK 소프트웨어 라이센스에 따라, 귀하는 응용프로그램과 함께 SDK의 파일을 재배포할 수 없습니다. 라이센스를 취득한 Linux용 SDK의 버전이 대상 시스템에 설치되어 있는지 확인하십시오.

# JVM 사이에 클래스 데이터 공유

클래스 데이터를 공유하면 복수의 JVM이 메모리에서 단일 공간을 공유할 수 있습니다.

JVM(Java Virtual Machine)을 사용하여 디스크의 메모리 맵핑된 캐시 파일에 클래스 데이터를 저장하여 JVM 사이에서 이 데이터를 공유할 수 있습니다. 둘 이상의 JVM이 캐시를 공유하는 경우, 데이터를 공유하면 전체 가상 메모리 소비가 줄어듭니다. 또한 데이터를 공유하면 캐시를 작성한 후 JVM의 시작 시간도 단축됩니다. 공유 클래스 캐시는 활성 JVM에 종속되지 않으며 공유 클래스 캐시가 손상될 때까지 지속됩니다.

공유 캐시에는 다음이 포함될 수 있습니다.

- 부트스트랩 클래스
- 응용프로그램 클래스
- 클래스를 설명하는 메타데이터
- |AOT(Ahead-of-time) 컴파일된 코드

## 클래스 데이터 공유 개요

클래스 데이터 공유는 메모리 풋프린트를 줄이고 JVM 시작 시간을 향상시키는 명백한 메소드를 제공합니다. |Java 6은 |캐시 관리, 분리 및 성능에서 새로운 기능 및 향상된 기능을 제공합니다.

### 클래스 데이터 공유 사용

JVM을 시작할 때 -Xshareclasses 옵션을 사용하여 클래스 데이터 공유를 사용하십시오. JVM은 기존 캐시에 연결하거나, 기존 캐시가 존재하지 않는 경우 새 캐시를 작성합니다.

JVM이 로드한 모든 부트스트랩과 응용프로그램 클래스가 기본적으로 공유됩니다. 사용자 정의 클래스 로더는 응용프로그램 클래스 로더를 확장하는 경우 자동으로 클래스를 공유합니다. 그렇지 않으면 JVM과 함께 제공되는 Java Helper API를 사용하여 캐시에 액세스해야 합니다. (클래스를 공유하기 위한 사용자 정의 클래스 로더 채택 참조).

|JVM은 후속 JVM 시작 시간을 향상시키는 데 필요한 특정 메소드의 경우 캐시에 |AOT(ahead-of-time) 컴파일 코드를 저장할 수도 있습니다. AOT 컴파일 코드는 JVM 사이에서 실제로 공유되지 않으나 |JVM 시작 시 컴파일 시간을 줄이기 위해 캐시에 넣어집니다. 캐시에 저장된 AOT 코드의 양은 |스스로 판별됩니다. 캐시에 저장된 메소드를 제어할 수 있으나 |AOT 코드에 사용된 캐시 공간 크기에 상한 및 하한을 설정하거나 AOT 캐싱을 완전히 사용하지 않도록 |선택할 수 있습니다. 자세한 정보는 클래스 데이터 공유 사용 및 구성을 참조하십시오.

### 캐시 액세스

|JVM은 |읽기 쓰기 또는 읽기 전용 액세스로 캐시에 액세스할 수 있습니다. 읽기 쓰기 액세스 권한이 있는 캐시에 연결된 모든 JVM은 캐시를 업데이트할 수 있습니다. 다른 JVM이 캐시에 기록하고 있는 중라도 임의의 수의 JVM을 캐시에서 동시에 읽을 수 있습니다.

런타임 바이트 코드 수정이 사용되고 있는지 확인해야 합니다. 자세한 정보는 런타임 바이트 코드 수정을 참조하십시오.

### 캐시의 동적 업데이트

공유 클래스 캐시는 JVM의 수명보다 오래 지속되므로 캐시는 파일 시스템의 클래스 또는 JAR의 모든 수정사항을 반영하여 동적으로 업데이트됩니다. 동적 업데이트으로 인해 캐시는 캐시를 사용하는 응용프로그램에 대해 투명해질 수 있습니다.

### 캐시 보안

공유 클래스 캐시에 대한 액세스는 운영 체제 권한 및 Java 보안 권한에 따라 제한됩니다. 공유 클래스 캐시는 groupAccess 명령행 하위 옵션이 사용되지 않는 한 사용자 액세스로 작성됩니다. 클래스 데이터를 공유하도록 등록된 클래스 로더만 공유 클래스 캐시를 업데이트할 수 있습니다.

|캐시 메모리는 메모리 페이지 보호를 사용하여 |우발적 또는 고의적 손상에 대해 보호됩니다. 그러나 JVM이 이 메모리에 기록할 페이지를 보호하지 않으므로 |손상에 대한 절대적인 보증은 아닙니다. 캐시를 수정할 수 없도록 하는 유일한 방법은 |읽기 전용으로 여는 것입니다.

Java SecurityManager가 설치된 경우 기본 부트스트랩, 응용프로그램 및 확장 클래스 로더를 제외한 클래스 로더는 java.policy 파일에 SharedClassPermission 행을 추가하여 클래스를 공유할 권한을 부여해야 합니다. (SharedClassPermission 사용 참조). RuntimePermission 『createClassLoader』는 새 클래스 로더 작성을 제한하므로 캐시에 대한 액세스도 제한합니다.

### 캐시 수명

시스템에는 여러 개의 캐시가 존재할 수 있으며 -Xshareclasses 명령의 하위 옵션 이름별로 지정됩니다. JVM은 동시에 둘 이상의 캐시에 연결할 수 없습니다.

-Xscmx<n><size>를 사용하여 시작 시 기본 캐시 크기를 대체할 수 있으며, 이 크기는 캐시 지속 시간 동안 고정됩니다. 캐시는 -Xshareclasses 명령의 하위 옵션을 사용하여 명시적으로 파기하거나 캐시 파일을 수동으로 삭제할 때까지 존재합니다.

### 캐시 유틸리티

모든 캐시 유틸리티는 -Xshareclasses 명령의 하위 옵션입니다. 사용 가능한 하위 옵션 목록을 보려면 클래스 데이터 공유 사용 및 구성을 참조하거나 -Xshareclasses:help를 사용하십시오.

## 클래스 데이터 공유 사용 및 구성

클래스 데이터 공유 및 캐시 관리 유틸리티는 java 실행기에 대한 명령행 옵션을 사용하여 제어됩니다.

<size> 매개변수를 사용하는 옵션의 경우, 숫자에 "k" 또는 "K"를 접미부로 사용하여 KB를 표시하거나, "m" 또는 "M"를 사용하여 MB를 표시하거나, "g" 또는 "G"를 사용하여 GB를 표시합니다.

-Xscmaxaot<size>
  캐시에서 AOT 데이터용으로 사용할 수 있는 최대 바이트 수를 설정합니다. 비AOT 데이터에 대해 특정 양의 캐시 공간이 사용되도록 하려면 이 옵션을 사용하십시오. 기본적으로 AOT 데이터의 최대 한계는 캐시의 여유 공간 양입니다. 이 옵션의 값은 -Xscminaot의 값보다 작지 않고 -Xscmx의 값보다 크지 않아야 합니다.
-Xscminaot<size>
  캐시에서 AOT 데이터용으로 예약할 최소 바이트 수를 설정합니다. AOT 데이터가 캐시에 대해 작성되더라도 캐시가 가득 차거나 -Xscmaxaot 한계에 도달할 때까지 기본적으로 AOT 데이터용으로는 공간이 예약되지 않습니다. 이 옵션의 값은 -Xscmx 또는 -Xscmaxaot의 값을 초과하지 않아야 합니다. AOT 데이터는 캐시된 클래스에 대해서만 작성될 수 있으므로 -Xscminaot의 값은 항상 전체 캐시 크기보다 작아야 합니다. -Xscminaot 값이 -Xscmx 값과 동일한 경우, AOT 데이터는 캐시의 클래스와 연관되어야 하므로 클래스 데이터 또는 AOT 데이터가 저장되지 않습니다.
-Xscmx<size>
  캐시 크기를 지정합니다. 이 옵션은 캐시가 작성되는 중이고 동일한 이름의 캐시가 없는 경우에만 적용됩니다. 기본 캐시 크기는 플랫폼에 따라 다릅니다. 명령행 인수로 -verbose:sizes를 추가하여 사용 중인 크기 값을 찾을 수 있습니다. 최소 캐시 크기는 4KB입니다. 최대 캐시 크기도 플랫폼에 따라 다릅니다. (캐시 크기 한계 참조).
-Xshareclasses:<suboption>[,<suboption>...]
  클래스 데이터 공유를 사용합니다. 여러 하위 옵션을 선택할 수 있으며 일부는 캐시 유틸리티입니다. 캐시 유틸리티는 VM을 시작하지 않고 지정된 캐시에 대해 필요한 작업을 수행합니다. 여러 하위 옵션을 쉼표로 분리하여 결합할 수 있으나, 캐시 유틸리티는 상호 배타적입니다. 캐시 유틸리티를 사용하는 경우 『JVM(Java Virtual Machine)을 작성할 수 없습니다.』라는 메시지가 예상됩니다. 캐시 유틸리티는 가상 시스템을 작성하지 않습니다.

  일부 캐시 유틸리티는 이전 Java 버전의 캐시 또는 비트 너비가 다른 JVM에서 작성한 캐시에 대해 작업할 수 있습니다. 이러한 캐시는 『호환 불가능』 캐시로 언급됩니다.

  -Xshareclasses 옵션과 함께 다음 하위 옵션을 사용할 수 있습니다.

  help
    모든 명령행 하위 옵션을 나열합니다.
  name=<name>
    제공된 이름으로 캐시에 연결합니다. 캐시가 없으면 캐시를 작성합니다. 또한 캐시 유틸리티(예: destroy)에 사용될 캐시를 표시하는 데에도 사용됩니다. 현재 사용 가능한 이름 지정된 캐시를 표시하려면 listAllCaches 유틸리티를 사용하십시오. 이름을 지정하지 않으면 기본 이름 『sharedcc_%u』가 사용됩니다. 캐시 이름에서 %u에는 현재 사용자 이름이 삽입됩니다. 캐시 이름에 %g를 지정하여 현재 그룹 이름을 삽입할 수 있습니다.
  |cacheDir=<directory>
    |캐시 데이터를 읽거나 기록한 디렉토리를 설정합니다. 기본적으로 <directory>는 /tmp/javasharedresources입니다. |사용자는 <directory> 내에 충분한 권한을 가지고 있어야만 합니다. 기본적으로 JVM은 지정된 디렉토리에 직접 지속적 캐시 파일을 기록합니다. 지속적 캐시 파일은 파일 시스템에서 안전하게 이동하고 삭제할 수 있습니다. 비지속적 |캐시는 공유 메모리에 저장되며 메모리 위치를 설명하는 |제어 파일을 포함하고 있습니다. 제어 파일은 |지정된 cacheDir의 javasharedresources 서브디렉토리에 저장됩니다. |이 디렉토리의 제어 파일은 수동으로 이동 또는 삭제해서는 안됩니다. listAllCaches 유틸리티, |destroyAll 유틸리티 및 expire 하위 옵션은 |제공된 cacheDir 범위 내에서만 작동합니다.
  |readonly
    |읽기 전용 권한이 있는 기존 캐시를 엽니다. JVM은 이 하위 옵션을 사용하여 새 캐시를 |작성하지 않습니다. 읽기 전용 캐시를 열면 JVM에서 캐시를 업데이트할 수 |없습니다. 또한, JVM이 쓰기 액세스 권한 없이 다른 사용자 또는 그룹에서 |작성한 캐시에 연결할 수도 있습니다. 기본적으로 이 하위 옵션은 |지정되어 있지 않습니다.
  |nonpersistent
    |비지속적 캐시를 사용합니다. 기본적으로 JVM은 운영 체제 재시작 이후 |지속되는 디스크에 캐시 파일을 작성합니다. nonpersistent 하위 옵션을 사용하면 운영 체제 종료 시 유실된 공유 메모리의 캐시가 작성됩니다. 비지속적 및 |지속적 캐시의 이름은 동일할 수 있으며 nonpersistent 하위 옵션은 |비지속적 캐시에서 유틸리티(예: destroy)를 실행할 때 항상 사용해야 |합니다. 기본적으로 이 하위 옵션은 지정되어 있지 않습니다.
  groupAccess
    캐시에 대한 그룹 액세스를 허용하도록 운영 체제 권한을 새 캐시에 설정합니다. 기본값은 사용자 액세스 전용입니다.
  verbose
    공유 클래스 캐시의 전체 상태와 더 자세한 오류 메시지를 제공하는 상제 출력을 사용합니다.
  |verboseAOT
    |컴파일된 AOD 코드를 찾는 중이거나 캐시에 저장 중인 경우 상세 출력을 사용합니다. AOT 코드는 발견적으로 |생성됩니다. 소규모 응용프로그램에서는 생성된 AOT 코드를 전혀 볼 수 없을 수도 있습니다. |noaot 하위 옵션을 사용하여 AOT 캐싱을 사용할 수 없습니다.
  verboseIO
    저장되고 발견되는 클래스에 대한 정보를 나열하면서 캐시 I/O 활동에 대한 자세한 출력을 제공합니다. 각 Classloader에는 고유한 ID(부트스트랩 로더는 항상 0)가 부여되며 출력은 작업 시 Classloader 계층 구조를 표시합니다. 여기서, Classloader가 스스로 클래스를 로드하려면 먼저 해당 클래스를 상위에 요청해야 합니다. 요청이 실패하는 경우는 흔한 일이며 Classloader 계층 구조에서 정상적으로 예상되는 작동입니다.
  verboseHelper
    Java Helper API에 대해 상세 출력을 사용합니다. 이 출력은 ClassLoader에서 Helper API가 사용되는 방식을 보여줍니다.
  silent
    오류 메시지를 포함하여 모든 공유 클래스 메시지를 표시하지 않습니다.
  nonfatal
    클래스 데이터 공유가 실패하는 경우에도 JVM을 시작할 수 있습니다. 클래스 데이터 공유에 실패하는 경우 정상적인 동작은 시작을 거부하는 것입니다. nonfatal이 선택되고 공유 클래스 캐시가 초기화에 실패하는 경우 JVM은 읽기 전용 모드로 캐시에 연결을 시도합니다. 이 시도가 실패하는 경우 JVM은 클래스 데이터 공유를 사용하지 않고 시작됩니다.
  none
    명령행 끝에 추가하여 클래스 데이터 공유를 사용하지 않게 할 수 있습니다. 이 하위 옵션은 명령행에서 이전에 발견된 클래스 공유 인수를 대체합니다.
  modified=<modified context>
    JVMTI 에이전트가 설치되어 런타임에 바이트 코드를 수정할 수 있는 경우에 사용됩니다. 이 하위 옵션을 지정하지 않고 바이트 코드 수정 에이전트가 설치되어 있는 경우, 클래스는 일시적인 성능 손실과 함께 안전하게 공유됩니다. <modified context>는 사용자가 선택한 설명자입니다(예: 『myModification1』). 이 옵션은 캐시를 분할하므로 컨텍스트 myModification1을 사용하는 JVM만이 동일한 클래스를 공유할 수 있습니다. 예를 들어, 수정 컨텍스트로 HelloWorld를 실행한 후 다른 수정 컨텍스트로 다시 실행하면 모든 클래스가 캐시에 두 번 저장됩니다. 자세한 정보는 런타임 바이트 코드 수정을 참조하십시오.
  |reset
    |캐시가 파기된 후 JVM 시작 시 다시 작성됩니다. -Xshareclasses:reset으로 명령행 끝에 추가할 수 있습니다.
  destroy(유틸리티 옵션)
    name, cacheDir 및 nonpersistent 하위 옵션으로 지정된 캐시를 파기합니다. 캐시를 사용하는 모든 JVM이 종료되고 사용자에게 충분한 권한이 있는 경우에만 캐시를 파기할 수 있습니다.
  destroyAll(유틸리티 옵션)
    지정된 cacheDir 및 nonpersistent 하위 옵션을 사용하여 사용 가능한 모든 캐시를 파기하려고 합니다. 캐시를 사용하는 모든 JVM이 종료되고 사용자에게 충분한 권한이 있는 경우에만 캐시를 파기할 수 있습니다.
  expire=<time in minutes>
    공유 클래스를 로드하기 전에 지정된 시간 동안 사용되지 않은 모든 캐시를 파기합니다. 이 옵션으로 JVM이 종료되지 않으므로 유틸리티 옵션이 아닙니다.
  listAllCaches(유틸리티 옵션)
    지정된 캐시 디렉토리에 있는 모든 호환 가능 및 호환 불가능 캐시를 나열합니다. cacheDir가 지정되어 있지 않으면 기본 디렉토리가 사용됩니다. 캐시마다 요약 정보(예: Java 버전 및 현재 사용법)가 표시됩니다.
  printStats(유틸리티 옵션)
    name, cacheDir 및 nonpersistent 하위 옵션으로 지정된 캐시에 대한 요약 정보를 표시합니다. 가장 유용한 정보는 캐시가 채워진 정도와 포함된 클래스 수에 대한 것입니다. Stale 클래스는 파일 시스템에서 업데이트된 클래스이므로 캐시가 "stale"로 표시합니다. Stale 클래스는 캐시에서 제거되지 않으므로 재사용할 수 있습니다. 자세한 정보는 진단 안내서를 참조하십시오.
  printAllStats(유틸리티 옵션)

    name, cacheDir 및 nonpersistent 하위 옵션으로 지정된 캐시에 대한 자세한 정보를 표시합니다. 각 클래스는 로드된 위치에 대한 참조와 함께 연대순으로 나열됩니다. 클래스 메소드에 대한 AOT 코드도 나열됩니다.

    자세한 정보는

    자세한 정보는 진단 안내서를 참조하십시오.

  |mprotect=[ all || default | none ]
    |기본적으로 캐시를 포함하는 메모리 페이지는 지정된 페이지가 업데이트되고 있지 않는 경우 |항상 보호됩니다. 우발적 또는 고의적 손상으로부터 |캐시를 보호하는 데 도움이 됩니다. 약간의 성능 손실이 있으므로 기본적으로 |캐시 헤더는 보호되지 않습니다. 『all』을 지정하면 |헤더를 포함한 모든 캐시 페이지가 보호됩니다. 『none』을 지정하면 |페이지 보호를 사용할 수 없습니다.
  |noBootclasspath
    |공유 클래스 캐시의 부트스트랩 클래스 로더가 로드한 클래스의 |저장영역을 보호합니다. SharedClassURLFilter API에서 |캐시할 클래스를 정확하게 제어하는 데 사용할 수 있습니다. 공유 클래스 필터링에 대한 자세한 정보는 |진단 안내서를 참조하십시오.
  |cacheRetransformed
    |JVMTI RetransformClasses 기능을 사용하여 변환한 클래스의 캐싱을 사용합니다.
  |noaot
    |AOT 코드의 캐싱 및 로딩을 사용할 수 없습니다.

## 캐시 작성, 채우기, 모니터링 및 삭제

캐시 관리 유틸리티의 예제를 포함하는 공유 클래스 데이터 캐시의 라이프사이클 개요입니다.

클래스 데이터 공유를 사용하려면 응용프로그램 명령행에 -Xshareclasses[:name=<name>]을 추가하십시오.

JVM은 주어진 이름의 기존 캐시에 연결하거나 이 이름의 새 캐시를 작성합니다. 새 캐시가 작성된 경우 해당 캐시가 모두 채워질 때까지 로드 중인 모든 부트스트랩 및 응용프로그램으로 채워집니다. 둘 이상의 JVM이 동시에 시작된 경우 캐시를 동시에 모두 채웁니다.

캐시가 작성되었는지 확인하려면 `java -Xshareclasses:listAllCaches`를 실행하십시오. 공유 중인 클래스의 수 및 클래스 데이터의 양을 확인하려면 `java -Xshareclasses:[name=<name>],printStats`를 실행하십시오. (이러한 유틸리티는 응용프로그램 JVM을 종료한 후 또는 다른 명령 창에서 실행할 수 있습니다.)

JVM을 실행 중인 경우 캐시 사용량에 대한 자세한 피드백을 보려면 verbose 하위 옵션을 사용하십시오(예: `java -Xshareclasses:[name=<name>],verbose`).

캐시에서 로드되거나 캐시에 저장된 클래스를 보려면 응용프로그램 명령행에 `-Xshareclasses:[name=<name>],verboseIO`를 추가하십시오.

작성한 캐시를 삭제하려면 `java -Xshareclasses:[name=<name>],destroy`를 실행하십시오. 캐시에 stale 클래스가 많거나 캐시가 가득 차서 더 큰 캐시를 작성하려는 경우에만 캐시를 삭제해야 합니다.

기본값이 최적의 크기가 아니므로 특정 응용프로그램에 대한 캐시 크기를 조정하는 것이 좋습니다. 최적의 캐시 크기를 판별하는 최선의 방법은 대규모 캐시를 지정(-Xscmx 사용)하고 응용프로그램을 실행한 후 printStats를 사용하여 저장된 클래스의 양을 판별하는 것입니다. 만일의 경우에 대비하여 printStats에 표시된 값에 소량씩 추가하십시오. 클래스는 수명 주기 동안 언제든지 로드될 수 있으므로 응용프로그램이 종료된 후 이러한 분석을 수행하는 것이 가장 좋습니다. 그러나 가득 찬 캐시에 연결된 JVM의 성능 또는 기능에 부정적인 영향은 없으므로, 캐시 크기를 필요한 양보다 적게 결정하는 것도 좋습니다.

캐시가 가득 차면, 상세 하위 옵션을 사용하는 JVM의 명령행에 메시지가 출력됩니다. 그러면 가득 찬 캐시를 공유하는 모든 JVM은 자신의 프로세스 메모리로 더 많은 클래스를 로드합니다. 가득 찬 캐시의 클래스는 계속 공유되지만, 가득 찬 캐시는 읽기 전용이므로 새 클래스로 업데이트할 수 없습니다.

## 성능 및 메모리 이용

클래스 데이터 공유는 비슷한 코드를 실행하는 둘 이상의 JVM을 사용하는 시스템에서 특히 유용합니다. 시스템에서 가상 메모리 이용이 줄어드는 이점이 있습니다. 또한 JVM을 자주 시작하고 종료하는 시스템에서도 유용하며, 시작 시간이 개선되는 이점이 있습니다.

새 캐시를 작성하고 채우는 오버헤드는 소량입니다. JVM 시작의 시간 비용은 클래스 데이터 공유를 사용하지 않는 시스템과 비교할 때 보통 0% - 5% 정도 느려지며, 로드된 클래스의 수에 따라 달라집니다. 클래스 데이터 공유를 사용하지 않는 시스템과 비교할 때 JVM 시작 시간은 캐시가 채워짐에 따라 일반적으로 10% - 40% 정도 빨라지며, 운영 체제 및 로드된 클래스의 수에 따라 달라집니다. 동시에 실행 중인 다중 JVM을 보면 전체적으로 시작 시간이 훨씬 빨라짐을 알 수 있습니다.

중복 클래스는 공유 클래스 캐시 내에서 결합됩니다. 예를 들어, myClasses.jar에서 로드한 클래스 A와 myOtherClasses.jar에서 로드한 클래스 A(동일한 내용)는 캐시에 한 번만 저장됩니다. printAllStats 유틸리티는 중복된 클래스의 다중 항목을 동일한 클래스를 가리키는 각 항목으로 표시합니다.

클래스 데이터 공유로 응용프로그램을 실행하는 경우, 운영 체제 도구를 사용하여 가상 메모리 이용의 감소량을 알 수 있습니다.

## 클래스 데이터 공유 사용에 대한 고려사항 및 제한사항

제품에서 클래스 데이터 공유를 배치하고 개발 환경에서 클래스 데이터 공유를 사용할 때 고려할 요소입니다.

### 캐시 크기 한계

이론적으로 최대 캐시 크기는 2GB입니다. 지정할 수 있는 캐시 크기는 시스템에서 사용 가능한 실제 메모리 및 페이징 공간의 크기에 따라 제한됩니다.

공유 클래스의 캐시는 System V IPC 공유 메모리 메커니즘을 사용하여 할당됩니다.

프로세스의 가상 주소 공간을 공유 클래스 캐시와 Java 힙이 공유하므로, Java 힙의 최대 크기를 늘리면 사용자가 작성할 수 있는 공유 클래스 캐시 크기가 줄어들 수 있습니다.

캐시 크기는 SHMMAX 설정에 의해 제한되며, 이는 할당 가능한 공유 메모리 용량을 제한합니다. 이러한 설정은 /proc/sys/kernel/shmmax 파일에 있습니다. SHMMAX는 일반적으로 30MB로 설정됩니다.

### 런타임 바이트 코드 수정

바이트 코드 데이터를 수정할 수 있는 JVMTI(JVM Tool Interface) 에이전트를 사용하는 모든 JVM은 수정한 클래스를 다른 JVM과 공유하려는 경우 modified=<modified_context> 하위 옵션을 사용해야 합니다.

수정된 컨텍스트는 수행할 수정 유형을 설명하는, 사용자가 지정된 설명자입니다. 수정된 컨텍스트는 동일한 컨텍스트에서 실행 중인 모든 JVM이 하나의 파티션을 공유하도록 캐시를 파티션으로 분할합니다.

이 파티셔닝을 사용하면 수정된 바이트 코드를 사용하지 않는 JVM이 수정된 바이트 코드를 사용하는 캐시를 안전하게 공유할 수 있습니다. 주어진 수정된 컨텍스트를 사용하는 모든 JVM은 클래스마다 예측 가능하고 반복 가능한 방식으로 바이트 코드를 수정해야만 다른 JVM에서 캐시에 저장된 수정된 클래스를 로드할 때 이 클래스에 예상한 수정사항이 포함됩니다. 공유 클래스 캐시에서 로드한 클래스는 에이전트가 다시 수정할 수 없으므로 수정을 예측할 수 있습니다.

JVMTI 에이전트가 수정 컨텍스트 없이 사용되는 경우, 클래스는 JVM에서 안전하게 공유되지만 성능에는 약간의 영향이 있습니다. JVMTI 에이전트에 대해 수정 컨텍스트를 사용하면 여분의 확인 작업을 할 필요가 없으므로 성능에 영향을 미치지 않습니다. JVMTI를 자동으로 사용하지 않고 로드할 때 java.net.URLClassLoader를 확장하고 바이트 코드를 수정하는 사용자 정의 ClassLoader는 수정된 바이트 코드를 캐시에 저장하지만 캐시는 바이트 코드를 수정된 것으로 처리하지 않습니다. 해당 캐시를 공유하는 다른 VM은 수정된 클래스를 로드합니다. modified=<modification_context> 하위 옵션은 JVMTI 에이전트가 캐시에서 수정된 바이트 코드를 파티셔닝하는 것과 동일한 방법으로 사용할 수 있습니다. 사용자 정의 ClassLoader가 클래스에 대해 예상할 수 없는 로드 시간 수정을 해야 하는 경우, ClassLoader는 클래스 데이터 공유를 사용해서는 안됩니다.

이 주제에 대한 자세한 내용은 진단 안내서를 참조하십시오.

### 운영 체제 제한사항

32 및 64비트 JVM에서 클래스를 공유할 수 없습니다. 캐시 정보를 보유할 수 있는 임시 디스크 공간이 있어야 합니다. 캐시 권한은 운영 체제에서 수행합니다.

32-bit 및 64-bit 응용프로그램을 둘 다 실행할 수 있는 운영 체제에서도 32-bit와 64-bit JVM 사이의 클래스 데이터 공유는 허용되지 않습니다. listAllCaches 하위 옵션은 사용 중인 JVM의 주소 모드에 따라 32-bit 또는 64-bit 캐시를 나열합니다.

공유 클래스 캐시에는 시스템에 있는 캐시의 ID 정보를 저장할 디스크 공간이 필요합니다. 이 정보는 /tmp/javasharedresources에 저장됩니다. ID 정보 디렉토리가 삭제되는 경우 JVM은 시스템에서 공유 클래스를 식별할 수 없으므로 캐시를 다시 작성해야 합니다. JVM 또는 응용프로그램에서 사용되는 메모리 세그먼트를 보려면 `ipcs` 명령을 사용하십시오.

JVM을 실행하는 사용자는 공유 클래스 캐시를 사용하기 위해 동일한 그룹에 있어야 합니다. 공유 클래스 캐시에 액세스하는 데 필요한 권한은 운영 체제에서 수행합니다. 캐시 이름이 지정되지 않으면 기본적으로 동일한 시스템에 있는 여러 사용자가 각자의 캐시를 작성할 수 있도록 사용자 이름이 기본 이름에 첨부됩니다.

### SharedClassPermission 사용

클래스 데이터 공유에 대해 SecurityManager가 사용되고 실행 중인 응용프로그램이 자체 클래스 로더를 사용하는 경우, 이러한 클래스 로더는 공유 클래스 권한이 부여되어야 클래스를 공유할 수 있습니다.

ClassLoader 클래스 이름(와일드 카드 허용)과 부여할 액세스 권한을 판별하기 위한 『read』, 『write』 또는 『read,write』 중 하나를 사용하여 java.policy 파일에 공유 클래스 권한을 추가하십시오. 예를 들면 다음과 같습니다.

    permission com.ibm.oti.shared.SharedClassPermission "com.abc.customclassloaders.*", "read,write";

ClassLoader

에 올바른 권한이 없는 경우 클래스를 공유할 수 없습니다. 기본 부트스트랩, 응용프로그램 또는 확장 클래스 로더의 권한은 변경할 수 없습니다.

## 클래스를 공유하기 위한 사용자 정의 클래스 로더 채택

java.net.URLClassLoader를 확장하는 클래스 로더는 수정하지 않고 클래스를 공유할 수 있습니다. java.net.URLClassLoader를 확장하지 않는 클래스 로더는 클래스 데이터를 공유하도록 채택되어야 합니다.

SecurityManager를 사용 중인 경우 모든 사용자 정의 클래스 로더에는 공유 클래스 권한이 부여되어야 합니다. SharedClassPermission 사용을 참조하십시오. IBM은 다양한 유형의 사용자 정의 클래스 로더에 대한 여러 Java 인터페이스를 제공하며, 이 인터페이스를 통해 클래스 로더는 공유 클래스 캐시에서 클래스를 찾고 저장할 수 있습니다. 이 클래스는 com.ibm.oti.shared 패키지에 있습니다.

이 패키지의 Javadoc은 SDK와 함께 docs/content/apidoc 디렉토리에 제공됩니다.

이 인터페이스를 사용하는 방법에 대한 자세한 정보는 진단 안내서를 참조하십시오.

# Java Communications API(JavaComm) 사용

Java Communications API 패키지(JavaComm)는 IA32, PPC32/PPC64 및 AMD64/EM64T 플랫폼에서 Runtime Environment for Linux에 사용하도록 제공된 선택적 패키지입니다. JavaComm은 SDK 또는 Runtime Environment와 독립적으로 설치합니다.

JavaComm API는 음성 메일, 팩스 및 스마트 카드 등의 기술에 대해 독립적 플랫폼으로 직렬 및 병렬 포트 통신을 수행하는 방법을 Java 응용프로그램에 제공합니다.

Java Communications API는 EIA(Electronic Industries Association)-232(RS232) 직렬 포트 및 IEEE(Institute of Electrical and Electronics Engineers) 1284 병렬 포트를 지원하며, IBM 버전 6 Runtime Environment가 설치된 시스템에서 지원됩니다.

Java Communications API를 사용하여 다음을 수행할 수 있습니다.

- 시스템에 포트 나열
- 포트 소유권 개방 및 청구
- Java Communications API를 사용하는 응용프로그램들 간의 포트 소유권 경합 해결
- 이벤트 알림을 사용하여 비동기 및 동기 I/O 포트 모니터링 수행
- 포트 상태 변경을 설명하는 Bean 스타일 이벤트 수신

## 압축 파일에서 Java Communications API 설치

Java Communications API를 설치하기 전에 SDK 또는 Runtime Environment가 설치되어 있는지 확인하십시오.

원래 RPM 패키지를 사용하여 Java를 설치한 경우, RPM 파일에서 Java Communications API를 설치하십시오. RPM 패키지에서 Java Communications API를 설치하려면 RPM 파일에서 Java Communications API 설치를 참조하십시오.

압축 파일에서 Java Communications API를 설치하려면 다음을 수행하십시오.

1. SDK 또는 Runtime Environment가 설치된 디렉토리에 Java Communications API 압축 파일, ibm-java-javacomm-3.0-0.0-<plat>-<arch>.tar.gz를 지정하십시오. 기본 디렉토리에 설치한 경우, 이 디렉토리는 /opt/ibm/java-i386-60/입니다.
2. 쉘 프롬프트에서, 압축 파일이 들어 있는 디렉토리에서 컨텐츠를 추출하십시오.

       tar -xvzf ibm-java-javacomm-3.0-0.0-<plat>-<arch>.tar.gz

   여기서 `<arch>`는 아키텍처( i386, x86_64, ppc, 또는 ppc64)를 나타냅니다.

3. |SDK의 적절한 디렉토리에 javacomm 파일을 |복사하십시오. | |
   |
   1. lib/libLinuxSerialParallel.so를 |jre/bin/ 디렉토리로 복사하십시오.
   |
   2. jar/comm.jar을 |jre/lib/ext/ 디렉토리로 복사하십시오.
   |
   3. lib/javax.comm.properties를 |jre/lib/ 디렉토리로 복사하십시오.
   기본적으로 SDK는 /opt/ibm/java-i386-60/ 디렉토리에 설치되어 있습니다.

## RPM 파일에서 Java Communications API 설치

Java Communications API를 설치하기 전에 SDK 또는 Runtime Environment의 사본이 설치되어 있는지 확인하십시오.

원래 RPM 패키지를 사용하여 Java를 설치한 경우, RTM 파일에서 Java Communications API를 설치하십시오.

1. 쉘 프롬프트를 열고 루트인지 확인하십시오.
2. `rpm -ivh` 명령을 사용하여 Java Communications API RPM 파일을 설치하십시오. 예를 들면 다음과 같습니다.

       rpm -ivh ibm-javacomm-3.0-0.0.<arch>.rpm

   Java Communications API가 /opt/ibm/java-i386-60/ 디렉토리 구조에 설치됩니다.
3. |javacomm 파일을 SDK의 적절한 디렉토리로 복사하십시오. | |
   |
   1. lib/libLinuxSerialParallel.so를 jre/bin/ 디렉토리로 복사하십시오.
   |
   2. jar/comm.jar을 |jre/lib/ext/ 디렉토리로 복사하십시오.
   |
   3. lib/javax.comm.properties를 |jre/lib/ 디렉토리로 복사하십시오.
   기본적으로 SDK는 /opt/ibm/java-i386-60/ 디렉토리에 설치되어 있습니다.

## Java Communications API 파일의 위치

기본적으로 Java Communications API 파일은 /opt/ibm/java-i386-60/ 디렉토리에 설치됩니다. 파일 및 구조:

- jar/comm.jar
- jar/commtest.jar
- jar/tools/BlackBox.jar
- jar/tools/ParallelBlackBox.jar
- lib/javax.comm.properties
- lib/libLinuxSerialParallel.so

## 직렬 및 병렬 포트의 액세스 모드 변경

Java Communications API를 설치한 후, 직렬 및 병렬 포트의 액세스 모드를 변경해야 사용자가 이러한 디바이스에 액세스할 수 있습니다.

사용자에게 필수 디바이스에 대한 읽기 및 쓰기 액세스 권한을 부여해야 합니다. 루트로 로그온하고 해당하는 경우에 따라 다음 명령을 사용하십시오.

        chmod 660/dev/ttyS0(직렬 포트 COM1이라고도 함)
        chmod 660/dev/lp0(병렬 포트 LPT1이라고도 함)
        chmod 660/dev/ttyS1(직렬 포트 COM2라고도 함)
        chmod 660/dev/ttyS2(직렬 포트 COM3라고도 함)
        chmod 660/dev/ttyS3(직렬 포트 COM4라고도 함)

특정 사용자를 디바이스가 상주하는 그룹에 추가합니다. 예를 들어, SUSE 시스템에서 해당 디바이스는 `uucp` 그룹에 있습니다. 그러므로 사용자를 `uucp` 그룹에 추가하여 디바이스에 대한 액세스 권한을 부여할 수 있습니다.

필요에 따라 기타 모든 포트의 액세스 모드를 변경하십시오.

## javax.comm.properties 파일에 디바이스 지정

javax.comm.properties 파일을 사용하여 Java Communications API에서 사용 가능한 디바이스의 접두부와 병렬 또는 직렬 여부를 지정할 수 있습니다. 모든 디바이스에 포트 번호가 순서대로 할당됩니다.

예를 들어, `/dev/ttyS=PORT_SERIAL`을 지정하고 `/dev/ttyS0` 및 `/dev/ttyS1` 디바이스가 있는 경우, 이들은 COM1 및 COM2에 할당됩니다.

USB 직렬 커넥터를 사용하려면 javax.comm.properties 파일의 `/dev/ttyUSB=PORT_SERIAL` 행에서 주석 표시를 제거하십시오. `/dev/ttyUSB0` 및 `/dev/ttyUSB1` 디바이스가 존재하고 COM1 및 COM2가 이미 정의된 경우, USB 직렬 디바이스는 그 다음 순서의 포트, COM3 및 COM4에 할당됩니다.

## IBM ThinkPad에서 직렬 포트 사용

대부분의 ThinkPad는 BIOS 기본값으로 직렬 포트가 사용 불가능으로 설정되어 있습니다. 현재 Linux에서 해당 포트를 사용할 방법이 없습니다. (BIOS에서 tpctl 패키지를 사용할 수 없는 경우 tpctl 패키지는 포트를 사용할 수 없습니다.)

BIOS에서 포트를 사용하려면 IBM ThinkPad 다운로드 사이트에서 사용 가능한 ThinkPad Configuration Utility의 DOS 버전을 사용해야 합니다. ThinkPad Configuration Utility를 사용하려면 부트 가능한 DOS 디스켓이 필요합니다. ThinkPad Configuration Utility는 설치 옵션에 따라 Windows(R)에서 ThinkPad Utilities의 일부로 설치되었을 수 있으며, Windows의 명령 프롬프트에서 실행할 수 있습니다.

Windows와 함께 제공된 ThinkPad Configuration에는 직렬 및 병렬 포트를 사용 가능 또는 사용 불가능으로 설정할 수 있는 옵션이 있으나 BIOS의 설정까지 변경하지는 않습니다. 그러므로 Windows에서 이 응용프로그램을 사용하는 경우 포트를 사용할 수 있습니다. 그러나 Linux로 시스템을 다시 시동하면 포트를 사용할 수 없게 됩니다.

## Java Communications API의 제한사항 인쇄

Java Communications API로 인쇄하는 경우, 프린터에서 『용지 넘김』, 『계속』 또는 이와 유사한 옵션을 선택해야 할 수 있습니다.

## Java Communications API 설치 제거

Java Communications API를 설치 제거하는 프로세스는 설치 가능한 RPM(Red Hat Package Manager) 패키지 또는 압축된 TAR(Tape Archive) 패키지의 설치 여부에 따라 달라집니다.

### Red Hat Package Manager(RPM) 패키지 설치 제거

RPM 패키지를 사용하여 Java Communications API를 설치 제거합니다.

1. rpm 도구를 사용하여 패키지를 설치하십시오. 쉘 프롬프트에 다음 명령을 입력하십시오.

       rpm -e ibm-javacomm-3.0-0.0

   kpackage 또는 yast2와 같은 그래픽 도구를 사용할 수도 있습니다.
2. Java Communications API를 설치한 디렉토리에 필요한 다른 도구가 없는 경우, PATH 명령문으로 해당 디렉토리를 제거하십시오.
3. |javacomm 라이브러리를 |SDK 디렉토리로 복사한 후 다음 파일을 SDK 디렉토리에서 삭제하십시오. | |
   |
   - jre/bin/libLinuxSerialParallel.so
   |
   - jre/lib/ext/comm.jar
   |
   - jre/lib/javax.comm.properties
   기본적으로 SDK는 /opt/ibm/java-i386-60/ 디렉토리에 설치되어 있습니다.

### 압축된 TAR(Tape Archive) 패키지 설치 제거

압축된 TAR 패키지를 설치한 경우 Java Communications API 설치 제거

설치한 디렉토리에서 다음 파일을 제거하십시오.

| |
- jre/bin/libLinuxSerialParallel.so
|
- jre/lib/ext/comm.jar
|
- jre/lib/javax.comm.properties

## Java Communications API 문서

Sun 웹 사이트에서 Java Communications API에 대한 API 문서 및 샘플을 찾을 수 있습니다.

http://java.sun.com/products/javacomm/

# ISV(독립 소프트웨어 벤더)에 대한 서비스 및 지원

서비스의 연결 지점:

귀하가 IBM Solutions Developer Program에 의거하여 프로그램 코드에 대한 서비스를 제공받을 수 있는 권한이 있는 경우에는 일반 문의 방법이나 웹 사이트(http://www.ibm.com/partnerworld/)를 통해 IBM Solutions Developer Program에 접속하십시오.

귀하가 서비스 계약(즉, IBM의 개인 시스템 지원 라인 또는 그와 동등한 수준의 국가별 서비스)을 취득한 경우에는 해당 서비스 계약의 조건에 준하여 프로그램에 대한 서비스를 제공받을 수 있습니다.

# 내게 필요한 옵션

이 SDK 및 Runtime Environment와 함께 제공되는 사용자 안내서는 화면 판독기를 사용하여 테스트되었습니다.

사용자 안내서의 글꼴 크기를 변경하려면 일반적으로 브라우저의 보기 메뉴 옵션 아래에 있는 기능을 사용하십시오.

키보드 탐색이 필요한 사용자를 위해 웹 사이트 http://www.ibm.com/developerworks/java/jdk/additional/의 Swing 키 바인딩에서 Swing 응용프로그램의 유용한 키스트로크에 대한 설명을 포함하고 있습니다.

## Swing에서 JComboBox 구성요소의 키보드 종단

커서 키로 JComboBox 구성요소의 드롭 다운 목록을 순회하는 경우, JComboBox의 단추 또는 편집 가능 필드는 항목을 선택할 때까지 값이 변경되지 않습니다. 이것은 이번 릴리스에서 올바른 작동이며, 키보드 종단 작동을 마우스 종단 작동과 일치시켜 내게 필요한 옵션 및 사용성을 높입니다.

## Web Start 내게 필요한 옵션(Linux IA 32-bit, PPC32 및 PPC64에만 해당)

Java Web Start의 버전 5.0부터는 화면 판독기에 대한 개선된 지원 및 향상된 키보드 탐색 등 몇 가지 내게 필요한 옵션 및 사용성 개선사항이 있습니다.

명령행은 Web Start에서 사용되는 Java 응용프로그램을 실행하기 위해서만 사용할 수 있습니다. 환경 설정 옵션을 변경하려면, 사용자의 홈 디렉토리에서 구성 파일인, .java/.deployment/.deployment.properties를 편집해야 합니다. 이 파일을 편집하기 전에 백업을 수행하십시오. Java 응용프로그램 캐시 뷰어에서 설정할 수 있는 모든 환경 설정을 구성 파일에서 사용할 수 있는 것은 아닙니다.

# 이 책에 대한 고객 의견

사용자 안내서에 대한 귀하의 의견을 아래와 같은 방법으로 보내주십시오. 이는 기술적 질문에 대한 답변을 드리기 위한 것은 아니며 문서에 대한 귀하의 의견을 듣기 위한 것입니다.

IBM 한글 지원에 관한 설문

IBM 한글 지원에 관한 설문

FAX: (02) 3787-0123

보내 주시는 의견은 더 나은 고객 지원 체제를 위한 귀중한 자료가 됩니다. 독자 여러분의 좋은 의견을 기다립니다.

성명 |  | 직위/담당 업무 |
회사명 |  | 부서명 |
주소 |
전화번호 |  | 팩스번호 |
전자우편 주소 |
사용 중인 시스템 |

1. IBM 에서 제공하는 한글 책자와 영문 책자 중 어느 것을 더 좋아하십니까? 그 이유는 무엇입니까?

□ 한글 책자 □ 영문 책자

(이유: )

2. 본 책자와 해당 소프트웨어에서 사용된 한글 용어에 대한 귀하의 평가 점수는?

□ 수 □ 우 □ 미 □ 양 □ 가

3. 본 책자와 해당 소프트웨어에서 번역 품질에 대한 귀하의 평가 점수는?

□ 수 □ 우 □ 미 □ 양 □ 가

4. 본 책자의 인쇄 상태에 대한 귀하의 평가 점수는?

□ 수 □ 우 □ 미 □ 양 □ 가

5. 한글 소프트웨어 및 책자가 지원되는 분야에 대해 귀하는 어떻게 생각하십니까?

□ 한글 책자를 늘려야 함 □ 현재 수준으로 만족

□ 그다지 필요성을 느끼지 않음

6. IBM 은 인쇄물 형식(hardcopy)과 화면 형식(softcopy)의 두 종류로 책자를 제공합니다. 어느 형식을 더 좋아하십니까?

□ 인쇄물 형식(hardcopy) □ 화면 형식(softcopy) □ 둘 다

IBM 한글 지원 서비스에 대해 기타 제안사항이 있으시면 적어주십시오.

설문에 답해주셔서 감사합니다.

귀하의 의견은 저희에게 매우 소중한 것이며, 고객 여러분들께 보다 좋은 제품을 제공해 드리기 위해 최선을 다하겠습니다.

IBM®에 의견을 보내는 경우, IBM은 질문, 의견, 제안 등과 같은 귀하의 의견에 포함된 모든 정보를 기밀이 아닌 것으로 간주하여 이러한 정보와 관련하여서는 아무 책임을 지지 않으며 이 정보를 제한 없이 복제, 사용, 발표 및 타인에게 배포할 수 있습니다. 나아가 IBM은 본 정보와 연관된 제품의 개발, 제조, 마케팅을 포함하여(단, 이에 한하지 않음) 어떠한 목적으로도 본 정보에 포함된 아이디어, 개념, 노하우 또는 기술을 제한없이 사용할 수 있습니다.

# 부록A. 비표준 옵션

아래의 -X 옵션은 비표준 옵션이며 별도의 통지없이 변경될 수 있습니다.

<size> 매개변수를 사용하는 옵션의 경우, 숫자에 "k" 또는 "K"를 접미부로 사용하여 KB를 표시하거나, "m" 또는 "M"를 사용하여 MB를 표시하거나, "g" 또는 "G"를 사용하여 GB를 표시합니다.

<percentage> 매개변수를 사용하는 옵션의 경우, 0 -1 범위의 숫자를 사용하십시오. (예: 50%는 0.5입니다.)

-Xargencoding
  Unicode 이스케이프 문자열을 인수 목록에 둘 수 있습니다. 이 옵션은 기본적으로 off로 설정됩니다.
-Xbootclasspath:<:으로 구분되는 디렉토리 및 zip 또는 jar 파일>
  부트스트랩 클래스 및 자원의 탐색 경로를 설정합니다. 기본값은 내부 VM 디렉토리 및 .jar 파일에서 부트스트랩 클래스 및 자원을 검색하는 것입니다.
-Xbootclasspath/a:<:으로 구분되는 디렉토리 및 zip 또는 jar 파일>
  지정한 디렉토리, zip 또는 jar 파일을 부트스트랩 클래스 경로 끝에 추가합니다. 기본값은 내부 VM 디렉토리 및 .jar 파일에서 부트스트랩 클래스 및 자원을 검색하는 것입니다.
-Xbootclasspath/p:<:으로 구분되는 디렉토리 및 zip 또는 jar 파일>
  지정한 디렉토리, zip 또는 jar 파일을 부트스트랩 클래스 경로 앞에 추가합니다. -Xbootclasspath: 또는 -Xbootclasspath/p: 옵션을 사용하여 표준 API의 클래스를 대체하는 응용프로그램은 배치하지 마십시오. 이러한 배치는 Java Runtime Environment 2진 코드 라이센스를 위반합니다. 기본값은 내부 VM 디렉토리 및 .jar 파일에서 부트스트랩 클래스 및 자원을 검색하는 것입니다.
|-Xcheck:classpath
  |클래스 경로에서 감지된 오류가 경고 메시지인지 표시합니다(예: 디렉토리 또는 JAR 파일 누락).
-Xcheck:gc[:<scan options>][:<verify options>][:<misc options>]
  가비지 콜렉션을 추가로 확인합니다. 기본값은 확인하지 않는 것입니다. 자세한 정보는 -Xcheck:gc:help의 출력을 확인하십시오.
-Xcheck:jni
  JNI 기능의 추가 점검을 수행합니다. 기본값은 점검을 수행하지 않는 것입니다.
|-Xcheck:memory[:<option>]
  엄격하게 확인하여 JVM 내에서 장애 시 JVM 종료의 원인이 되는 메모리 누수를 식별합니다. 옵션을 지정하지 않으면 기본적으로 all이 사용됩니다. 자세한 정보는 -Xcheck:memory:help의 출력 또는 진단 안내서를 확인하십시오.
-Xcheck:nabounds
  JNI 기능의 추가 점검을 수행합니다. 기본값은 점검을 수행하지 않는 것입니다.
-Xclassgc
  모든 가비지 콜렉션에서 클래스 오브젝트의 콜렉션을 사용합니다. -Xnoclassgc도 참조하십시오. 이 옵션은 기본적으로 사용됩니다.
-Xcodecache<size>
  컴파일된 Java 메소드의 원시 코드를 저장하기 위해 할당할 메모리 블록의 단위 크기를 설정합니다. 적절한 크기는 실행 중인 응용프로그램에 대해 선택할 수 있습니다. 기본적으로 이 옵션은 CPU 아키텍처 및 시스템 성능에 따라 내부적으로 선택됩니다.
-Xcompactexplicitgc
  `System.gc()`에 대한 모든 호출을 압축합니다. -Xnocompactexplicitgc도 참조하십시오. 기본적으로 내부로 트리거된 경우에만 압축이 발생합니다.
-Xcompactgc
  모든 가비지 콜렉션을 압축합니다. -Xnocompactgc도 참조하십시오. 기본적으로 내부로 트리거된 경우에만 압축이 수행됩니다.
-Xconcurrentbackground<number>
  동시 표시로 뮤테이터 스레드를 지원하기 위해 첨부된 낮은 우선순위 배경 스레드의 수를 지정합니다. 기본값은 1입니다.
-Xconcurrentlevel<number>
  할당 "부담" 비율을 지정합니다. 할당된 힙 용량과 표시된 힙 용량 간의 비율을 표시합니다. 기본값은 8입니다.
-Xconmeter:<soa|loa|dynamic>
  LOA(Large Object Area) 또는 SOA(Small Object Area) 중 어느 영역 사용법이 사용되었는지 판별하여 이에 따라 동시 표시 중 할당이 부담됩니다. 선택된 영역에 할당 부담이 적용됩니다. -Xconmeter:dynamic이 지정된 경우, 콜렉터는 어느 영역이 먼저 소모되었는지에 따라 측정할 영역을 동적으로 판별합니다. 기본적으로 이 옵션은 -Xconmeter:soa로 설정되어 있습니다.
-Xdbg:<options>
  응용프로그램의 원격 디버깅을 지원하기 위해 디버깅 라이브러리를 로드합니다. 자세한 정보는 Java 응용프로그램 디버깅을 참조하십시오. -Xrunjdwp를 지정하면 동일한 지원이 제공됩니다.
-Xdebug
  디버거를 사용 가능하게 하여 JVM을 시작합니다. 기본적으로 디버거는 사용할 수 없습니다.
-Xdisableexcessivegc
  GC에 과도한 시간이 소비되는 경우 OutOfMemoryError가 발생하지 않도록 합니다. 이 옵션의 기본값은 off입니다.
-Xdisableexplicitgc
  System.gc()에 대한 호출이 작동되지 않음을 VM에 신호합니다. 기본적으로 System.gc()에 대한 호출은 가비지 콜렉션을 트리거합니다.
-Xdisablestringconstantgc
  문자열 인턴 테이블의 문자열이 수집되지 않도록 합니다. 이 옵션은 기본적으로 사용되지 않습니다.
-Xdisablejavadump
  오류 및 신호에 대한 Javadump 생성을 끕니다. 기본적으로 Javadump 생성이 사용됩니다.
-Xenableexcessivegc
  GC에 과도한 시간이 소비되는 경우 이 옵션은 할당 요청에 대해 NULL을 리턴하여 OutOfMemoryError가 발생하도록 합니다. 이 조치는 힙이 완전히 확장되고 GC가 사용 가능한 시간의 95%를 소비했을 때만 발생합니다. 기본값은 이 조치를 수행하는 것입니다.
-Xenableexplicitgc
  VM에 System.gc()에 대한 호출이 가비지 콜렉션을 트리거해야 한다는 신호를 보냅니다. 기본값입니다.
-Xenablestringconstantgc
  문자열 인턴 테이블의 문자열이 수집되도록 합니다. 이 옵션은 기본적으로 사용됩니다.
-Xfuture
  엄격한 클래스 파일 포맷 점검을 사용합니다. 후속 릴리스에서는 더 엄격한 점검이 기본값이 되므로 새 코드를 개발 중인 경우 이 플래그를 사용하십시오. 기본적으로 엄격한 포맷 점검은 사용 불가능합니다.
-Xgcpolicy:<optthruput|optavgpause|gencon|subpool>(PPC 및 zSeries의 하위 풀)
  가비지 콜렉터의 작동을 제어합니다. 자세한 정보는 가비지 콜렉션 옵션을 참조하십시오.
-Xgcthreads<number of threads>
  가비지 콜렉션 중의 병렬 조작에 사용되는 헬퍼 스레드의 수를 설정합니다. 기본적으로 스레드 수는 현재의 실제 CPU 수에서 1을 뺀 수로 설정합니다(최소값은 1).
-Xgcworkpackets<number>
  글로벌 콜렉터에서 사용 가능한 총 작업 패킷 수를 지정합니다. 이 옵션을 지정하지 않으면 콜렉터는 최대 힙 크기에 따라 패킷 수를 할당합니다.
-Xint
  JVM에서 해석기만 사용하고 JIT(just-in-time) 컴파일러는 사용하지 않도록 합니다. 기본적으로 JIT 컴파일러는 사용 가능합니다.
-Xiss<size>
  초기 Java 스레드 스택 크기를 설정합니다. 기본값은 2KB입니다. VM이 사용 중인 값을 출력하려면 -verbose:sizes 옵션을 사용하십시오.
|-Xjarversion
  |버전 정보 얻기를 참조하십시오.
-Xjit[:<suboption>,<suboption>...]
  JIT를 사용 가능하게 합니다. 하위 옵션에 대한 자세한 내용은 진단 안내서를 참조하십시오. -Xnojit도 참조하십시오. 기본적으로 JIT는 사용 가능합니다.
-Xlinenumbers
  디버깅을 위해 스택 추적에 행 번호를 표시합니다. -Xnolinenumbers도 참조하십시오. 기본적으로 행 번호를 표시합니다.
-Xloa
  LOA(Large Object Area)를 할당합니다. 오브젝트는 SOA가 아닌 이 LOA에서 할당됩니다. 기본적으로 LOA는 LOA를 사용할 수 없는 하위 풀을 제외한 모든 GC 정책에 사용할 수 있습니다. -Xnoloa도 참조하십시오.
-Xloainitial<percentage>
  <percentage>의 범위는 0 - 0.95이며, LOA(Large Object Area)에 할당된 현재 보유 공간의 초기 백분율을 지정합니다. 기본값은 0.05 또는 5%입니다.
-Xloamaximum<percentage>
  <percentage>의 범위는 0 - 0.95이며, LOA(Large Object Area)에 할당된 현재 보유 공간의 최대 백분율을 지정합니다. 기본값은 0.5 또는 50%입니다.
-Xlp
  대형 페이지로 Java 힙을 할당하도록 JVM에 요청합니다. 대형 페이지를 사용할 수 없는 경우 JVM이 시작되지 않으며, 오류 페이지 `GC: system configuration does not support option --> '-Xlp'`가 표시됩니다. JVM은 shmget()을 사용하여 힙을 대형 페이지로 할당합니다. 대형 페이지는 Linux 커널 v2.6 이상 또는 분배에 의해 대형 페이지 지원이 백포트된 이전 커널을 실행하는 시스템에서 지원됩니다. 기본적으로 대형 페이지를 사용하지 않습니다. 대형 페이지 메모리 할당 구성을 참조하십시오.
-Xmaxe<size>
  가비지 콜렉터가 힙을 확장하는 최대 용량을 설정합니다. 일반적으로 가비지 콜렉터는 여유 공간의 용량이 30%(또는 -Xminf를 사용하여 지정한 용량) 아래로 떨어졌을 때, 여유 공간을 30%로 복원하는 데 필요한 용량만큼 힙을 확장합니다. -Xmaxe 옵션은 지정된 값의 확장을 제한합니다. 예를 들어, `-Xmaxe10M`은 확장을 10MB로 제한합니다. 기본적으로 최대 확장 크기는 없습니다.
-Xmaxf<percentage>
  가비지 콜렉션 후에 여유 공간으로 남아야 하는 힙의 최대 백분율을 지정합니다. 여유 공간이 이 용량을 초과하면 JVM은 힙을 줄입니다. 기본값은 0.6(60%)입니다.
-Xmca<size>
  로드된 클래스의 RAM 부분을 저장하는 데 할당된 메모리의 확장 단계를 설정합니다. RAM에 있는 클래스를 저장하는 데 더 많은 메모리가 필요할 때마다, 할당된 메모리는 이 용량까지 늘어납니다. 기본적으로 확장 단계는 32KB입니다. VM이 사용 중인 값을 출력하려면 -verbose:sizes 옵션을 사용하십시오.
-Xmco<size>
  로드된 클래스의 ROM 부분을 저장하는 데 할당된 메모리의 확장 단계를 설정합니다. ROM에 있는 클래스를 저장하는 데 더 많은 메모리가 필요할 때마다, 할당된 메모리는 이 용량까지 늘어납니다. 기본적으로 확장 단계는 128KB입니다. VM이 사용 중인 값을 출력하려면 -verbose:sizes 옵션을 사용하십시오.
-Xmine<size>
  가비지 콜렉터가 힙을 확장하는 최소 용량을 설정합니다. 일반적으로 가비지 콜렉터는 여유 공간을 30%(또는 -Xminf를 사용하여 지정한 용량)로 복원하는 데 필요한 용량만큼 힙을 확장합니다. -Xmine 옵션은 확장을 지정된 값 이상으로 설정합니다. 예를 들어, `-Xmine50M`는 확장 크기를 최소 50MB로 설정합니다. 기본적으로 최소 확장 크기는 1MB입니다.
-Xminf<percentage>
  가비지 콜렉션 후에 여유 공간으로 남아야 하는 힙의 최소 백분율을 지정합니다. 여유 공간이 이 용량 미만으로 떨어지면 JVM은 힙을 늘립니다. 기본적으로 최소값은 0.3(30%)입니다.
-Xmn<size>
  -Xgcpolicy:gencon을 사용할 때 새(nursery) 힙의 초기 크기 및 최대 크기를 지정한 값으로 설정합니다. -Xmn 설정은 -Xmns 및 -Xmnx 설정과 동일합니다. -Xmns 또는 -Xmnx를 설정한 경우에는 -Xmn을 설정할 수 없습니다. -Xmns 또는 -Xmnx와 함께 -Xmn를 설정하면 VM이 시작되지 않으며 오류를 리턴합니다. 기본적으로 시스템 성능에 따라 -Xmn이 내부적으로 선택됩니다. VM이 사용 중인 값을 출력하려면 -verbose:sizes 옵션을 사용하십시오.
-Xmns<size>
  -Xgcpolicy:gencon을 사용할 때 새(nursery) 힙의 초기 크기를 지정한 값으로 설정합니다. 기본적으로 이 옵션은 시스템 성능에 따라 내부적으로 선택됩니다. -Xmn과 함께 사용하면 이 옵션은 오류를 리턴합니다. VM이 사용 중인 값을 출력하려면 -verbose:sizes 옵션을 사용하십시오.
-Xmnx<size>
  -Xgcpolicy:gencon을 사용할 때 새(nursery) 힙의 최대 크기를 지정한 값으로 설정합니다. 기본적으로 이 옵션은 시스템 성능에 따라 내부적으로 선택됩니다. -Xmn과 함께 사용하면 이 옵션은 오류를 리턴합니다. VM이 사용 중인 값을 출력하려면 -verbose:sizes 옵션을 사용하십시오.
-Xmo<size>
  -Xgcpolicy:gencon을 사용할 때 이전(tenure) 힙의 초기 크기 및 최대 크기를 지정한 값으로 설정합니다. -Xmos 및 -Xmox 설정과 동일합니다. -Xmos 또는 -Xmox를 설정한 경우에는 -Xmo를 설정할 수 없습니다. -Xmos 또는 -Xmox와 함께 -Xmo를 설정하면 VM이 시작되지 않으며 오류를 리턴합니다. 기본적으로 -Xmo는 시스템 성능에 따라 내부적으로 선택됩니다. VM이 사용 중인 값을 출력하려면 -verbose:sizes 옵션을 사용하십시오.
-Xmoi<size>
  -Xgcpolicy:gencon을 사용하는 경우 Java 힙의 증분량을 설정합니다. 0으로 설정하면 확장이 허용되지 않습니다. 기본적으로 증분 크기는 확장 크기, -Xmine 및 -Xminf에 따라 계산됩니다.
-Xmos<size>
  -Xgcpolicy:gencon을 사용할 때 이전(tenure) 힙의 초기 크기를 지정한 값으로 설정합니다. 기본적으로 이 옵션은 시스템 성능에 따라 내부적으로 선택됩니다. -Xmo와 함께 사용하면 이 옵션은 오류를 리턴합니다. VM이 사용 중인 값을 출력하려면 -verbose:sizes 옵션을 사용하십시오.
-Xmox<size>
  -Xgcpolicy:gencon을 사용할 때 이전(tenure) 힙의 최대 크기를 지정한 값으로 설정합니다. 기본적으로 이 옵션은 시스템 성능에 따라 내부적으로 선택됩니다. -Xmo와 함께 사용하면 이 옵션은 오류를 리턴합니다. VM이 사용 중인 값을 출력하려면 -verbose:sizes 옵션을 사용하십시오.
-Xmr<size>
  -Xgcpolicy:gencon을 사용하여 가비지 콜렉션 "기억된 세트"의 크기를 설정합니다. 이것은 새(nursery) 힙에 있는 오브젝트에 대한 참조를 갖는 이전(tenure) 힙의 오브젝트 목록입니다. 기본값은 16KB입니다. VM이 사용 중인 값을 출력하려면 -verbose:sizes 옵션을 사용하십시오.
-Xmrx<size>
  기억되는 최대 크기를 설정합니다.
-Xms<size>
  초기 Java 힙 크기를 설정합니다. -Xmo를 사용할 수도 있습니다. 기본값은 시스템 성능에 따라 내부적으로 설정됩니다. VM이 사용 중인 값을 출력하려면 -verbose:sizes 옵션을 사용하십시오.
-Xmso<size>
  포크된 Java 스레드의 C 스택 크기를 설정합니다. 기본적으로 이 옵션은 32-bit 플랫폼에서는 32KB, 64-bit 플랫폼에서는 256KB로 설정됩니다. VM이 사용 중인 값을 출력하려면 -verbose:sizes 옵션을 사용하십시오.
-Xmx<size>
  Java 힙의 최대 크기를 설정합니다. 기본적으로 이 옵션은 시스템 성능에 따라 내부적으로 설정됩니다. VM이 사용 중인 값을 출력하려면 -verbose:sizes 옵션을 사용하십시오.
-Xnoclassgc
  클래스 가비지 콜렉션을 사용 불가능하게 합니다. 이 옵션은 JVM에서 더 이상 사용되지 않는 Java 클래스와 연관된 저장영역의 가비지 콜렉션이 사용되지 않도록 합니다. -Xclassgc도 참조하십시오. 기본적으로 클래스 가비지 콜렉션이 수행됩니다.
-Xnocompactexplicitgc
  `System.gc()`에 대한 호출의 압축을 사용 불가능하게 합니다. -Xcompactexplicitgc도 참조하십시오. 기본적으로 `System.gc()`에 대한 압축은 사용 가능합니다.
-Xnocompactgc
  가비지 콜렉션 압축을 사용 불가능하게 합니다. -Xcompactgc도 참조하십시오. 기본적으로 압축은 사용 가능합니다.
-Xnojit
  JIT 컴파일러를 사용 불가능하게 합니다. -Xjit도 참조하십시오. 기본적으로 JIT 컴파일러는 사용 가능합니다.
-Xnolinenumbers
  디버깅을 위한 행 번호를 사용 불가능하게 합니다. -Xlinenumbers도 참조하십시오. 기본적으로 행 번호를 표시합니다.
-Xnoloa
  LOA(Large Object Area)가 할당되지 않도록 합니다. 모든 오브젝트는 SOA에 할당됩니다. 기본적으로 LOA는 LOA를 사용할 수 없는 하위 풀을 제외한 모든 GC 정책에 사용할 수 있습니다. -Xloa도 참조하십시오.
-Xnopartialcompactgc
  증분 압축을 사용 불가능하게 합니다. -Xpartialcompactgc도 참조하십시오.
-Xnosigcatch
  JVM 신호 처리 코드를 사용 불가능하게 합니다. -Xsigcatch도 참조하십시오. 기본적으로 신호 처리는 사용 가능합니다.
-Xnosigchain
  신호 핸들러 체인을 사용 불가능하게 합니다. -Xsigchain도 참조하십시오. 기본적으로 신호 핸들러 체인은 사용 가능합니다.
-Xoptionsfile=<file>
  JVM 옵션이 포함된 파일을 지정하고 정의합니다. 기본적으로 옵션 파일을 사용하지 않습니다.
-Xoss<size>
  임의의 스레드에 대한 Java 스택 크기와 C 스택 크기를 설정합니다. 이 옵션을 호환성을 위해 제공되며 -Xss 및 -Xmso를 모두 지정된 값으로 설정하는 것과 동일합니다.
-Xpartialcompactgc
  부분 압축을 사용 가능하게 합니다. 기본적으로 이 옵션이 설정되지 않으므로 모든 압축은 전체 압축입니다. -Xnopartialcompactgc도 참조하십시오.
-Xquickstart
  JIT 컴파일 및 최적화를 지연하여 시작 시간을 개선합니다. 기본적으로 빠른 시작은 사용 불가능하며 JIT 컴파일은 지연되지 않습니다.
-Xrdbginfo:<host>:<port>
  옵션을 원격 디버그 정보 서버로 로드하고 전달합니다. 기본적으로 원격 디버그 정보 서버는 사용 불가능합니다.
-Xrs
  운영 체제 신호의 사용을 줄입니다. 기본적으로 VM은 운영 체제 신호를 전부 사용합니다. JVM에서 사용되는 신호의 내용을 참조하십시오.
-Xrun<library name>[:<options>]
  도움말 라이브러리를 로드합니다. 여러 개의 라이브러리를 로드하려면 명령행에서 두 번 이상 지정하십시오. 이러한 라이브러리의 예로 다음이 있습니다.
  -Xrunhprof[:help] | [:<option>=<value>, ...]
    힙, CPU 또는 모니터 프로파일을 수행합니다. 자세한 정보는 진단 안내서를 참조하십시오.
  -Xrunjdwp[:help] | [:<option>=< value>, ...]
    응용프로그램의 원격 디버깅을 지원하기 위해 디버깅 라이브러리를 로드합니다. 자세한 정보는 -Xdbg를 참조하십시오.
  -Xrunjnichk[:help] | [:<option>=<value>, ...]
    이제 사용되지 않습니다. -Xcheck:jni를 사용하십시오.
-Xscmx<size>
  -Xscmx에 대한 자세한 정보는 클래스 데이터 공유 사용 및 구성의 내용을 참조하십시오.
-Xshareclasses:<options>
  -Xshareclasses 옵션에 대한 세부사항은 클래스 데이터 공유 사용 및 구성을 참조하십시오.
-Xsigcatch
  VM 신호 처리 코드를 사용 가능하게 합니다. -Xnosigcatch도 참조하십시오. 기본적으로 신호 처리는 사용 가능합니다.
-Xsigchain
  신호 핸들러 체인을 사용 가능하게 합니다. -Xnosigchain도 참조하십시오. 기본적으로 신호 핸들러 체인이 사용됩니다.
-Xsoftrefthreshold<number>
  참조가 표시되지 않은 경우 지정된 수 다음의 소프트 참조가 지워지는 GC 수를 설정합니다. 기본값은 3입니다. 이는 참조가 표시되지 않은 세 번째 GC부터 소프트 참조가 지워진다는 것을 의미입니다.
-Xss<size>
  임의의 스레드에 대한 Java 스택의 최대 크기를 설정합니다. 기본적으로 이 옵션은 256KB로 설정됩니다. VM이 사용 중인 값을 출력하려면 -verbose:sizes 옵션을 사용하십시오.
-Xthr:<options>
  스레딩 옵션을 설정합니다.
-Xverbosegclog:<path to file>[X,Y]

  상세 가비지 콜렉션(GC) 결과물이 지정된 파일에 작성됩니다. 이미 파일이 있는 경우 해당 파일에 겹쳐씁니다. 기존 파일을 열 수 없거나 새 파일을 작성할 수 없는 경우, 결과물을 stderr로 방향 재지정합니다. 인수 X 및 Y(모두 정수)를 지정하는 경우 상세 GC 결과물은 파일의 X 수로 방향이 재지정되며, 각각에는 상세 GC 결과물의 GC 사이클 만큼의 Y 수가 들어 있습니다. 이들 파일은 filename1, filename2 등의 형식이 있습니다. 기본적으로 상세 GC 로깅은 발생하지 않습니다.

  상세 GC 결과물에 대한 자세한 정보는 진단 안내서를 참조하십시오.

-Xverify
  로드된 모든 클래스에 대해 엄격한 점검을 수행하도록 합니다. 기본적으로 엄격한 클래스 점검을 수행하지 않습니다.
-Xverify:none
  엄격한 클래스 점검을 사용 불가능하게 합니다. 기본적으로 엄격한 클래스 점검을 수행하지 않습니다.

# 부록B. 알려진 제한사항

SDK 및 Runtime Environment for Linux에 대해 알려진 제한사항입니다.

http://www.ibm.com/developerworks/java/jdk/diagnosis/60.html의 진단 안내서에서는 문제점 진단에 대한 추가 도움말을 찾을 수 있습니다.

## AMD64 SMP 시스템에 대한 BIOS 설정

노드 메모리 상호 배치 BIOS 설정은 `사용 불가능`으로 설정해야 합니다. 그렇지 않으면 Java 충돌 및 정지 등 예상하지 못한 결과가 발생할 수 있습니다. 이 지시사항은 AMD의 권장사항을 준수합니다.

## JConsole 모니터링 도구 로컬 탭

IBM의 JConsole 도구에서, 동일한 시스템의 다른 가상 시스템에 연결할 수 있는 로컬 탭을 사용할 수 없습니다. 또한 해당 명령행 pid 옵션이 지원되지 않습니다. 대신 JConsole의 Remote 탭을 사용하면 모니터링하려는 가상 시스템에 연결할 수 있습니다. 대신 connection 명령행 옵션을 사용하여 `localhost`의 호스트 및 포트 번호를 지정하십시오. 모니터링할 응용프로그램을 실행할 때 다음 명령행 옵션을 설정하십시오.

-Dcom.sun.management.jmxremote.port=<value>
  관리 에이전트가 청취해야 하는 포트를 지정합니다.
-Dcom.sun.management.jmxremote.authenticate=false
  사용자 이름 파일을 작성하지 않은 경우 인증을 사용하지 않습니다.
-Dcom.sun.management.jmxremote.ssl=false
  SSL 암호화를 사용하지 않습니다.

## Rhino Javascript 엔진을 사용할 수 없음

Mozilla Rhino Javascript 엔진은 라이센스 부여 문제로 인해 IBM SDK for Java에 포함되지 않습니다. IBM SDK for Java에서 Rhino Javascript 엔진을 사용하려면 https://scripting.dev.java.net/에서 jsr223 스크립팅 엔진을, Mozilla 웹 사이트(http://www.mozilla.org/rhino/)에서 Rhino Javascript 엔진을 다운로드하십시오.

## 느린 DSA 키 쌍 생성

보통이 아닌 길이의 DSA 키 쌍을 작성하면 느린 시스템에서 상당한 시간이 걸릴 수 있습니다. 충분한 시간이 있으면 프로세스가 완료되므로 이러한 지연을 정지로 해석하지 마십시오. DSA 키 생성 알고리즘은 다른 알고리즘보다 빠른 표준 키 길이(예: 512, 1024)를 생성하도록 최적화되었습니다.

## JNI를 사용하여 JVM 작성

원시 프로그램은 JNI_VERSION_1_1(0x00010001) 인터페이스로 VM을 작성할 수 없습니다. JNI_CreateJavaVM()을 호출하여 JNI_VERSION_1_1(0x00010001)의 버전을 전달할 수 없습니다. 전달할 수 있는 버전은 다음과 같습니다.

- JNI_VERSION_1_2(0x00010002)
- JNI_VERSION_1_4(0x00010004)

작성한 VM은 전달된 JNI 인터페이스 버전이 의미하는 라이브러리가 아니라 존재하는 Java 라이브러리(즉 1.2.2, 1.3.x, 1.4.x, 5.x, 6.x)로 판별합니다.

인터페이스 버전은 원시 코드에 사용 가능한 기능을 제외한 기타 VM 작동 영역에는 영향을 주지 않습니다.

## 창 관리자 및 키보드 바로 가기

창 관리자는 일부 Java 키보드 바로 가기를 대체할 수 있습니다. 대체된 Java 키보드 바로 가기를 사용해야 하는 경우, 운영 체제 매뉴얼을 참조하여 창 관리자 키보드 바로 가기를 변경하십시오.

## X 윈도우 시스템 파일 설명자

X 윈도우 시스템에서는 255개를 초과하는 파일 설명자를 사용할 수 없습니다. 이는 JVM에서 열린 jar 파일의 파일 설명자 보유로 인해 X Windows 시스템에서 파일 설명자를 모두 사용하기 때문입니다. 이에 대한 해결 방법으로, JVM에서 jar 파일에서 더 많은 파일 설명자를 사용하도록 JAVA_HIGH_ZIPFDS 환경 변수를 설정할 수 있습니다.

JAVA_HIGH_ZIPFDS 환경 변수를 사용하려면 값을 0에서 512 사이로 설정하십시오. JVM은 파일 설명자를 최대 1024개까지 사용하여 첫번째 jar 파일을 열게 됩니다. 예를 들어 사용자의 프로그램이 jar 파일을 300개 로드하려는 경우에는 다음을 입력하십시오.

`export JAVA_HIGH_ZIPFDS=300`

첫 번째 300 jar 파일은 724개에서 1023개 사이의 파일 설명자를 사용하여 로드됩니다. 이후에 열린 jar 파일은 모두 정상 범위에서 열립니다.

## DBCS 및 KDE 클립보드

KDE(K Desktop Environment)를 실행 중인 경우, 2바이트 문자 세트(DBCS)의 시스템 클립보드를 사용하여 Linux 응용프로그램과 Java 응용프로그램 사이에 정보를 복사할 수 없을 수도 있습니다.

## LinuxThreads 라이브러리를 사용하는 경우 스레드 한계

SLES9 및 최신 분배에서 기본 스레딩 라이브러리는 Java 스레드를 원시 스레드로 구현하는 NPTL입니다. 이전 배포판에서는 기본 스레딩 라이브러리가 LinuxThreads이며 새로운 프로세스로 스레드를 구현합니다. Java 스레드의 수가 허용되는 최대 프로세스 수를 초과하는 경우 프로그램이 정지할 수 있습니다.

사용 가능한 스레드의 최대 수는 다음의 최소값에 의해 결정됩니다.

- /etc/security/limits.conf에서 사용자 프로세스 설정(ulimit -u)
- /proc/sys/kernel/threads_max에 정의된 한계
- libpthreads.so에 정의된 한계 PTHREAD_THREADS_MAX(이 값이 변경되는 경우 glibc를 다시 컴파일해야 함)

그러나 최대 스레드 수에 도달하기 전에 가상 저장영역을 모두 사용할 수 있습니다.

## ThreadMXBean 스레드 사용자 CPU 시간 제한사항

이 플랫폼에서는 사용자 모드 CPU 시간과 시스템 모드 CPU 시간을 구분할 방법이 없습니다. ThreadMXBean.getThreadUserTime(), ThreadMXBean.getThreadCpuTime(), ThreadMXBean.getCurrentThreadUserTime() 및 ThreadMXBean.getCurrentThreadCpuTime()은 모두 필수 스레드의 총 CPU 시간을 리턴합니다.

## KeyEvent 및 창 관리자

Alt 키를 포함하는 KeyEvent 결과는 Linux에서 사용하는 창 관리자에 따라 다를 수 있습니다. 또한 운영 체제에 따라 결과도 다르게 됩니다. 기본 설정을 사용하는 경우, KWin 창 관리자에서 Ctrl+Alt+A를 누르면 KeyEvent가 생성되지만 Metacity 창 관리자에서 Ctrl+Alt+A를 누르면 키 이벤트가 생성되지 않습니다.

## X 윈도우 시스템 및 메타 키

Linux X 윈도우 시스템에서 키맵은 64 0xffe9(Alt_L) 0xffe7(Meta_L) 및 113 0xffea(Alt_R) 0xffe8(Meta_R)로 설정됩니다. 쉘 프롬프트에서 다음을 입력하여 이를 점검할 수 있습니다.

    xmodmap -pk

따라서 SDK는 Meta와 Alt를 함께 누르는 것으로 간주합니다. 이에 대한 해결책으로 쉘 프롬프트에서 다음을 입력하여 Meta_x 맵핑을 제거할 수 있습니다.

    xmodmap -e "keysym Alt_L = Alt_L" -e "keysym Alt_R = Alt_R"

이 해결책은 제거된 Meta 키를 사용할 경우 같은 표시장치에서 실행되는 다른 X-Windows 응용프로그램에 영향을 줄 수 있습니다.

## JNI를 사용하여 JVM을 작성하는 경우 SIGSEGV

JNI 응용프로그램에서 JNI_CreateJavaVM()을 호출하면 세그먼테이션 결함(신호 SIGSEGV)이 발생할 수 있습니다. 이를 방지하려면 -lpthread 옵션을 지정하여 JNI 프로그램을 다시 빌드하십시오.

## 고도로 스레드된 응용프로그램에서 자원 부족

많은 스레드를 동시에 실행하는 경우, 경고 메시지가 표시될 수 있습니다.

    java.lang.OutOfMemoryError

이는 사용자 시스템의 시스템 자원이 부족하다는 표시이며, 메시지의 원인은 다음과 같은 이유 때문일 수 있습니다.

- 작성된 프로세스 수가 사용자 한계를 초과합니다(Linux 설치에서 NPTL이 아니라 LinuxThreads를 사용하는 경우).
- 새 스레드를 작성하는 데 충분한 시스템 자원이 사용 가능하지 않습니다. 이 경우, 실행 중인 응용프로그램에 따라 다른 Java 예외가 발생할 수도 있습니다.
- 커널 메모리가 부족하거나 단편화되었습니다. 종료된 프로세스 ID의 /var/log/messages에서 해당 메모리 부족 커널 메시지가 표시될 수 있습니다.

해당 시스템 자원을 늘리려면 시스템을 조정하십시오.

## X 서버 및 클라이언트 글꼴 문제점

Linux 시스템에서 Java AWT 또는 Swing 응용프로그램을 실행하여 디스플레이를 2차 시스템으로 내보내는 경우, X 클라이언트 시스템에 로드된 글꼴 세트가 X 서버 시스템에 로드된 세트와 다르면 일부 대화 상자를 표시하는 데 문제점이 있을 수 있습니다. 이 문제점을 방지하려면 두 시스템에 동일한 글꼴을 설치하십시오.

## UTF-8 인코딩 및 MalformedInputExceptions

시스템 로케일에서 UTF-8 인코딩을 사용하는 경우 일부 SDK 도구에서 sun.io.MalformedInputException이 발생할 수 있습니다. 시스템이 UTF-8 인코딩을 사용하는지 여부를 알려면 로케일 특정 환경 변수(예: LANG 또는 LC_ALL)가 접미부 『.UTF-8』로 끝나는지 조사하십시오. sun.io.MalformedInputException이 발생하는 경우 7-bit ASCII 범위(0x00 - 0x7f) 내에 없으면서 Java Unicode 문자 리터럴로 표시되지 않는 문자를 Java Unicode 문자 리터럴(예: '\u0080')로 변경하십시오. 또한 로케일 특정 환경 변수에서 『.UTF-8』 접미부를 제거하여 이 문제점을 회피할 수도 있습니다. 예를 들어, 시스템의 기본 로케일이 『en_US.UTF-8』인 경우 LANG을 『en_US』로 설정하십시오.

## 디스플레이를 내보낼 때 AMI 및 xcin 문제점

AMI 및 xcin을 교차 플랫폼 환경에서 사용하는 경우(예를 들어, 32-bit 시스템과 64-bit 시스템 간이나 빅 엔디안 시스템과 리틀 엔디안 시스템 간에 디스플레이를 내보내려는 경우), 문제점이 발생할 수 있습니다. 이러한 유형의 문제점이 발생하는 경우에는 AMI 및 xcin의 최신 버전으로 업그레이드하십시오.

## RHEL4 및 XIM

RHEL4의 중국어, 한국어 및 일본어 사용자에게만 해당합니다.

XIM 서버는 기본적으로 설치되지 않습니다. Java 응용프로그램에 DBCS 문자를 입력하려면 XIM 서버 패키지(예: iiimf-x 또는 kinput2)를 입력하십시오.

## RHEL4 및 IIIMF

RHEL4의 중국어, 한국어 및 일본어 사용자에게만 해당합니다.

IIIMF(Internet/Intranet Input Method Framework)를 사용 중인 경우 Red Hat Enterprise Linux 4 업데이트 2 이상에 포함된 IIIMF 패키지를 사용하십시오. Red Hat(http://www.redhat.com)을 참조하십시오.

(zSeries 64비트에만 해당) IIIMF 실패 또는 시작 실패가 발생할 수 있습니다. 문제점을 해결하려면 최신 IIIMF 패키지로 업그레이드하십시오.

(PPC, s390 또는 s390x의 중국어에만 해당) IIIMF가 작동하지 않을 수 있습니다. 문제점을 해결하려면 iiimf-le-xcin-0.1.7-13.EL4 이상을 사용하십시오.

(PPC, s390 또는 s390x의 중국어에만 해당) IIIMF가 올바로 작동하지 않을 수 있습니다. 문제점을 해결하려면 RHEL4 업데이트 5 이상에 포함된 IIMF 패키지를 사용하십시오.

## RHEL4 및 zh_CN.GB18030 로케일

RHEL4의 중국어 사용자에게만 해당합니다.

zh_CN.GB18030 로케일은 RHEL4의 xlib에서 지원되지 않습니다. xterm은 메소드 서버를 활성화할 수 없으므로 GB18030 문자를 입력할 수 없습니다. 대신 zh_CN.UTF8 로케일을 사용하십시오. GB2312, GBK 또는 GB18030으로 인코드한 데이터 또는 레거시 프로그램이 있고 이를 RHEL4로 이주하려는 경우, iconv로 사전 처리하여 UTF-8 인코딩으로 변환해야 프로그램을 실행할 수 있고 데이터를 zh_CN.UTF8 로케일로 RHEL4에 적절하게 표시할 수 있습니다.

이 제한사항은 RHEL4 U3에서 해결되었습니다.

## RHEL4 및 xcin

RHEL4의 xcin에서 정지될 수 있습니다. 문제점을 해결하려면 /etc/chinese/xcin/xcinrc 파일에서 ICCHECK_DISABLE을 YES로 설정하십시오.

64-bit 환경에만 해당

xcin(대만어 XIM 서버)를 사용하는 RHEL4의 경우, 64-bit 환경(예: AMD64 또는 zSeries 64-bit 플랫폼)의 Java에서 세그먼테이션 결함 등 예상하지 못한 동작이 발생할 수 있습니다. 문제점을 해결하려면 최신 xcin 패키지로 업그레이드하십시오.

## RHEL4 및 IIIMF 초점 변경 문제점

RHEL4에만 해당합니다.

IIIMF(Internet Intranet Input Method Framework)를 사용하여 DBCS 문자를 입력할 때 초점 변경 문제점이 발생할 수 있습니다. 이 문제점은 활성 입력 구성요소를 최소화할 때 발생합니다. 구성요소를 복원한 후 입력 메소드는 다시 SBCS로 전환됩니다. 그런 다음 수동으로 DBCS를 다시 활성화해야 합니다.

이러한 초점 변경 문제점이 있는 구성요소는 다음과 같습니다.

- java.awt.Canvas
- java.awt.Button
- javax.swing.JButton
- javax.swing.JSplitPane
- javax.swing.JComboBox
- javax.swing.JList

## XIM 및 Java Plug-in

RHEL4 및 SLES9에만 해당

일본어, 중국어 및 한국어 사용자의 경우, XIM을 사용하여 웹 브라우저에서 Java 애플릿의 텍스트 구성요소에 자국어 문자를 입력할 수 없습니다. XEmbed에 X11 라이브러리 파일의 수정사항이 필요하므로 이 제한사항이 발생합니다. 이러한 상황을 피하려면 XEmbed를 사용하지 않도록 -Dsun.awt.noxembed=true 시스템 매개변수를 지정하십시오. 다음과 같이 제어판을 사용하여 이 옵션을 설정할 수 있습니다.

1. Java Plug-in 제어판을 열고 Java 탭으로 이동하십시오.
2. Java 애플릿 런타임 설정에서 보기 단추를 클릭하십시오.
3. Java 런타임 매개변수에 -Dsun.awt.noxembed=true를 입력하고 확인을 클릭하십시오.
4. 적용을 클릭하십시오.
5. 브라우저를 시작하십시오.

이 제한사항은 RHEL4 U3 및 SLES9 SP3에서 해결되었습니다.

## 아랍어 문자 및 Matrox 비디오 카드

Intel 32-bit 플랫폼에만 해당

아랍어 사용자는 Matrox 비디오 카드로 Linux를 사용 중이고 가속이 사용되는 경우, drawString을 사용하여 큰 글꼴을 표시할 때 문자가 왜곡되어 나타날 수 있습니다. 이는 해당 카드의 드라이버로 인해 발생합니다. 해당 문제점을 해결하려면 디바이스에서 acceleration을 사용 불가능하게 하십시오.

## SLES9 NPTL 및 병렬 포트 드라이버

Intel 32-bit 플랫폼에만 해당

SLES 9 NPTL에서 병렬 포트 드라이버 때문에 커널 크래시가 발생하고 Java 스레드가 중단될 수 있습니다. JVM은 가비지 콜렉션의 스레드를 일시중단하려할 때 이 크래시를 발견하며, 크래시는 코어 파일과 『JVMLH030: 모든 스레드를 일시중단하는 중 스레드가 사라집니다.』라는 메시지를 생성합니다.

SUSE Bugzilla 보고서 47947에 이 문제점에 대해 보고되어 있습니다. 이 버그는 SLES 9 Service Pack 1에서 수정되었습니다.

## PPC 플랫폼에서 9개 이상의 매개변수가 있는 JNI 호출

PPC 플랫폼에만 해당

Java 코드에서 JNI 호출을 사용하며 특정 호출에 9개 이상의 float 또는 double 매개변수가 있는 경우, C 코드는 GCC(GNU C Complier)의 gcc-2.95.3 FSF(Free Software Foundation) 레벨로 컴파일해야 합니다.

## SP2 전의 SLES9에서 병렬 포트 조작

PPC 플랫폼에만 해당

JavaComm 패키지는 SLES 9 GA 및 SP1 커널에서 병렬 포트 조작을 지원하지 않습니다. 이 제한사항은 SP2 커널에서 해소되었습니다. SUSE Bugzilla 번호는 50028입니다.

## PPC 64-bit 플랫폼에서 libFileStat.so 컴파일

PPC 64-bit 플랫폼에만 해당

기본 gcc 교차 컴파일러(버전 3.2-49)로 인해 몇 가지 오류가 발생합니다. 공유 라이브러리 libFileStat.so를 생성하려면 다음을 실행하십시오.

    /opt/cross/bin/powerpc64-linux-gcc -shared -o libFileStat.so -I<SDK_PATH>/include FileStat.c

여기서 <SDK_PATH>는 설치된 SDK 디렉토리의 경로입니다.

## zSeries 플랫폼에서 IPv6

zSeries 플랫폼에만 해당

현재 분배에서 Linux 커널이 IPv6(Internet Protocol 버전 6)을 지원하더라도 사용하는 데 문제점이 있을 수 있습니다. Java에서 IPv6에 대한 지원은 이 릴리스에 포함되지만, java 명령에 -Djava.net.preferIPv4Stack=true 옵션을 지정하여 이 지원을 해제하는 것이 좋습니다. IPv6을 완전히 지원하는 커널을 설치하는 경우에는 이 옵션이 필요하지 않습니다.

## 64-bit zSeries 플랫폼에서 xcin

zSeries 64-bit 플랫폼에만 해당

중국어 및 대만어 입력 메소드 서버(xcin)는 테스트하지 않았습니다.

## Java 데스크탑 API

Java 데스크탑 API는 하나 이상의 GNOME 라이브러리를 사용할 수 없으므로 작동하지 않을 수도 있습니다.

## GTK 룩앤필의 NullPointerException

DBCS 환경에만 해당

GTK 룩앤필을 사용하는 응용프로그램이 NullPointerException로 실패하면, GNOME_DESKTOP_SESSION_ID 환경 변수 설정을 해제하십시오.

## Unicode Shift_JIS 코드 페이지 별명

일본어 사용자에만 해당

Shift_JIS의 Unicode 코드 페이지 별명 『\u30b7\u30d5\u30c8\u7b26\u53f7\u5316\u8868\u73fe』가 제거되었습니다. 응용프로그램에서 이 코드 페이지를 사용하려면 Shift_JIS로 바꾸십시오.

# 주의사항

이 정보는 미국에서 제공되는 제품 및 서비스용으로 작성된 것입니다. IBM은 다른 국가에서 이 책에 기술된 제품, 서비스 또는 기능을 제공하지 않을 수도 있습니다. 현재 사용할 수 있는 제품 및 서비스에 대한 정보는 한국 IBM 담당자에게 문의하십시오.

이 책에서 IBM 제품, 프로그램 또는 서비스를 언급했다고 해서 해당 IBM 제품, 프로그램 또는 서비스만을 사용할 수 있다는 것을 의미하지는 않습니다. IBM의 지적 재산권을 침해하지 않는 한, 기능상으로 동등한 제품, 프로그램 또는 서비스를 대신 사용할 수도 있습니다. 그러나 비IBM 제품, 프로그램 또는 서비스의 운용에 대한 평가 및 검증은 사용자의 책임입니다.

IBM은 이 책에서 다루고 있는 특정 내용에 대해 특허를 보유하고 있거나 현재 특허 출원 중일 수 있습니다. 이 책을 제공한다고 해서 특허에 대한 라이센스까지 부여하는 것은 아닙니다. 라이센스에 대한 의문사항은 다음으로 문의하십시오.

- 135-270
- 서울특별시 강남구 도곡동 467-12 군인공제회관빌딩
- 한국 아이.비.엠 주식회사 고객만족센터
- 전화번호: 080-023-8080

2바이트(DBCS) 정보에 관한 라이센스 문의는 한국 IBM 고객만족센터에 문의하거나 다음 주소로 서면 문의하시기 바랍니다.

- IBM World Trade Asia Corporation Licensing
- 2-31 Roppongi 3-chome, Minato-ku
- Tokyo 106-0032, Japan

다음 단락은 현지법과 상충하는 영국이나 기타 국가에서는 적용되지 않습니다.

IBM은 타인의 권리 비침해, 상품성 및 특정 목적에의 적합성에 대한 묵시적 보증을 포함하여(단, 이에 한하지 않음) 묵시적이든 명시적이든 어떠한 종류의 보증없이 이 책을 "현상태대로" 제공합니다. 일부 국가에서는 특정 거래에서 명시적 또는 묵시적 보증의 면책사항을 허용하지 않으므로, 이 사항이 적용되지 않을 수도 있습니다.

이 정보에는 기술적으로 부정확한 내용이나 인쇄상의 오류가 있을 수 있습니다. 이 정보는 주기적으로 변경되며, 변경사항은 최신판에 통합됩니다. IBM은 이 책에서 설명한 제품 및/또는 프로그램을 사전 통지 없이 언제든지 개선 및/또는 변경할 수 있습니다.

이 정보에서 언급되는 비IBM의 웹 사이트는 단지 편의상 제공된 것으로, 어떤 방식으로든 이들 웹 사이트를 옹호하고자 하는 것은 아닙니다. 해당 웹 사이트의 자료는 본 IBM 제품 자료의 일부가 아니므로 해당 웹 사이트 사용으로 인한 위험은 사용자 본인이 감수해야 합니다.

IBM은 귀하의 권리를 침해하지 않는 범위 내에서 적절하다고 생각하는 방식으로 귀하가 제공한 정보를 사용하거나 배포할 수 있습니다.

(i) 독립적으로 작성된 프로그램과 기타 프로그램(본 프로그램 포함)간의 정보 교환 및 (ii) 교환된 정보의 상호 이용을 목적으로 정보를 원하는 프로그램 라이센스 사용자는 다음 주소로 문의하십시오.

- 135-270 서울특별시 강남구 도곡동 467-12 군인공제회관빌딩
- 한국 아이.비.엠 주식회사 고객만족센터

이러한 정보는 해당 조건(예를 들어, 사용료 지불 등)에 따라 사용할 수 있습니다.

이 정보에 기술된 라이센스가 있는 프로그램 및 이 프로그램에 대해 사용 가능한 모든 라이센스가 있는 자료는 IBM이 IBM 기본 계약, IBM 프로그램 라이센스 계약(IPLA) 또는 이와 동등한 계약에 따라 제공한 것입니다.

본 문서에 포함된 모든 성능 데이터는 제한된 환경에서 산출된 것입니다. 따라서 다른 운영 환경에서 얻어진 결과는 상당히 다를 수 있습니다. 일부 성능은 개발 레벨 상태의 시스템에서 측정되었을 수 있으므로 이러한 측정치가 일반적으로 사용되고 있는 시스템에서도 동일하게 나타날 것이라고는 보증할 수 없습니다. 또한, 일부 성능은 추정을 통해 추측되었을 수도 있으므로 실제 결과는 다를 수 있습니다. 이 책의 사용자는 해당 데이터를 사용자의 특정 환경에서 검증해야 합니다.

비IBM 제품에 관한 정보는 해당 제품의 공급업체, 공개 자료 또는 다른 기타 범용 소스로부터 얻은 것입니다. IBM에서는 이러한 제품들을 테스트하지 않았으므로, 비IBM 제품과 관련된 성능의 정확성, 호환성 또는 기타 청구에 대해서는 확신할 수 없습니다. 비IBM 제품의 성능에 대한 의문사항은 해당 제품의 공급업체에 문의하십시오.

## 상표

IBM, iSeries, pSeries 및 zSeries는 미국 또는 기타 국가에서 사용되는 International Business Machines Corporation의 상표 또는 등록상표입니다.

Intel은 미국 또는 기타 국가에서 사용되는 International Business Machines Corporation의 상표입니다.

Java 및 모든 Java 기반 상표와 로고는 미국 또는 기타 국가에서 Sun Microsystems, Inc.의 상표 또는 등록상표입니다.

Linux는 미국 또는 기타 국가에서 사용되는 Linus Torvalds의 상표입니다.

기타 회사, 제품 및 서비스 이름은 타사의 상표 또는 서비스표입니다.