레이블이 JAVA인 게시물을 표시합니다. 모든 게시물 표시
레이블이 JAVA인 게시물을 표시합니다. 모든 게시물 표시

2010년 12월 13일 월요일

정규식 java

아래는 정규 표현식 일부를 발췌한 내용입니다.(Java API 참조)

 

더 궁금하신것이 있으면 쪽지 부탁합니다.

 

즐퍼~~~

 

 

정규 표현 구문의 요약

구문 매치 대상
 
캐릭터
x 캐릭터 x
\\ backslash 캐릭터
\0n 8 진치 0n 를 가지는 캐릭터 (0 <= n <= 7)
\0nn 8 진치 0nn 를 가지는 캐릭터 (0 <= n <= 7)
\0mnn 8 진치 0mnn 를 가지는 캐릭터 (0 <= m <= 3, 0 <= n <= 7)
\xhh 16 진치 0xhh 를 가지는 캐릭터
\uhhhh 16 진치 0xhhhh 를 가지는 캐릭터
\t 탭 캐릭터 ('\u0009')
\n 개행 캐릭터 ('\u000A')
\r 왕복대 리턴 캐릭터 ('\u000D')
\f 용지 보내 캐릭터 ('\u000C')
\a 경고 (벨) 캐릭터 ('\u0007')
\e 이스케이프 캐릭터 ('\u001B')
\cx x 에 대응하는 제어 캐릭터
 
캐릭터 클래스
[abc] a,b, 또는 c (단순 클래스)
[^abc] a,b,c 이외의 캐릭터 (부정)
[a-zA-Z] a ~ z 또는 A ~ Z (범위)
[a-d[m-p]] a ~ d, 또는 m ~ p: [a-dm-p] (결합)
[a-z&&[def]] d,e,f (교차)
[a-z&&[^bc]] bc 를 제외하는 a ~ z: [ad-z] (감산)
[a-z&&[^m-p]] m ~ p 를 제외하는 a ~ z: [a-lq-z] (감산)
 
정의 끝난 캐릭터 클래스
. 임의의 캐릭터 (줄 끝 기호와 성냥 하는 경우도 있다)
\d 숫자: [0-9]
\D 숫자 이외: [^0-9]
\s 공백 캐릭터: [ \t\n\x0B\f\r]
\S 비공백 캐릭터: [^\s]
\w 단어 구성 캐릭터: [a-zA-Z_0-9]
\W 비단어 캐릭터: [^\w]
 
POSIX 캐릭터 클래스 (US-ASCII 마셔)
\p{Lower} 소문자의 영문자: [a-z]
\p{Upper} 대문자의 영문자: [A-Z]
\p{ASCII} 모든 ASCII 캐릭터: [\x00-\x7F]
\p{Alpha} 영문자: [\p{Lower}\p{Upper}]
\p{Digit} 10 진수자: [0-9]
\p{Alnum} 영숫자: [\p{Alpha}\p{Digit}]
\p{Punct} 구두점 캐릭터: ! "#$%&'()*+,-. /:;<=>? @[\]^_`{|}~ 의 언젠가
\p{Graph} 표시할 수 있는 캐릭터: [\p{Alnum}\p{Punct}]
\p{Print} 프린트 가능 캐릭터: [\p{Graph}]
\p{Blank} 공백 또는 탭: [ \t]
\p{Cntrl} 제어 캐릭터: [\x00-\x1F\x7F]
\p{XDigit} 16 진수자: [0-9a-fA-F]
\p{Space} 공백 캐릭터: [ \t\n\x0B\f\r]
 
Unicode 블록과 카테고리의 클래스
\p{InGreek} 희랍어 블록의 캐릭터 (단순블록)
\p{Lu} 대문자 (단순카테고리)
\p{Sc} 통화 기호
\P{InGreek} 희랍어 블록 이외의 캐릭터 (부정)
[\p{L}&&[^\p{Lu}]] 대문자 이외의 캐릭터 (감산)
 
경계 정규 표현 엔진
^ 행의 선두
$ 행의 말미
\b 단어 경계
\B 비단어 경계
\A 입력의 선두
\G 전회의 성냥의 말미
\Z 마지막줄 끝 기호가 있는 경우는 그것을 제외한 입력의 말미
\z 입력의 말미
 
최장 일치 수량자
X? X, 1 회 또는 0 회
X* X, 0 회 이상
X+ X, 1 회 이상
X{n} X,n
X(n,} X,n 회이상
X{n,m} X,n 회이상,m 회이하
 
최단 일치 수량자
X?? X, 1 회 또는 0 회
X*? X, 0 회 이상
X+? X, 1 회 이상
X{n}? X,n
X(n,}? X,n 회이상
X{n,m}? X,n 회이상,m 회이하
 
탐욕인 수량자
X? + X, 1 또는 0 회
X*+ X, 0 회 이상
X++ X, 1 회 이상
X{n}+ X,n
X(n,}+ X,n 회이상
X{n,m}+ X,n 회이상,m 회이하
 
논리 연산자
XY X 의 직후에 Y
X|Y X 또는 Y
(X) X,전방 참조를 실시하는 정규 표현 그룹
 
전방 참조
\n 성냥 한 n 번째의전방 참조를 실시하는 정규 표현 그룹
 
인용
\ 정규 표현은 아니지만, 다음의 캐릭터를 이스케이프 한다
\Q 정규 표현은 아니지만,\E 까지의 모든 캐릭터를 이스케이프 한다
\E 정규 표현은 아니지만,\Q 로 개시된 인용을 이스케이프 한다
 
특수한 구문 (전방 참조를 실시하지 않는다)
(? :X) X,전방 참조를 실시하지 않는 정규 표현 그룹
(? idmsux-idmsux)   정규 표현은 아니지만, 매치 플래그의 온/오프를 바꾼다
(? idmsux-idmsux:X)  X, 지정된 플래그를 온/오프로 한전방 참조를 실시하지 않는 정규 표현 그룹
(? =X) X, 폭제로의 긍정 예측
(?!X) X, 폭제로의 부정 예측
(? <=X) X, 폭제로의 긍정 후 읽기
(? <! X) X, 폭제로의 부정 후 읽기
(? >X) X, 독립한전방 참조를 실시하지 않는 정규 표현 그룹

 

 

 

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040201&docId=72627095&qb=7KCV6rec7IudIOqzteuwsSDqsJztlok=&enc=utf8&section=kin&rank=5&search_sort=0&spq=0&pid=gdTbsloi5Usssszujyosss--124835&sid=TQVkdiBUBU0AABc1EO4

2010년 9월 27일 월요일

Java, Too many open files

Java, Too many open files 프로그래밍-자바

2008/01/16 19:50

복사 http://blog.naver.com/hypermin/70026489770

첨부파일 (1)


Too many open files

출처: http://kr.bea.com/support/customer_support/SupportPattern/08_15_Too_Many_Open_Files_Pattern.html


문제 설명
다음의 두 스택 트레이스 사항은 동일한 문제를 나타내며 Too many open files라는 동일한 메시지를 표시합니다.

예외 1

java.net.SocketException: Too many open files

at java.net.PlainSocketImpl.accept(Compiled Code)
at java.net.ServerSocket.implAccept(Compiled Code)
at java.net.ServerSocket.accept(Compiled Code)
at weblogic.t3.srvr.ListenThread.run(Compiled Code)

예외 2

java.io.IOException: Too many open files

at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.(UNIXProcess.java:54)
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.(UNIXProcess.java:54)
at java.lang.Runtime.execInternal(Native Method)
at java.lang.Runtime.exec(Runtime.java:551)
at java.lang.Runtime.exec(Runtime.java:477)
at java.lang.Runtime.exec(Runtime.java:443)
...

첫 번째 예외는 오류가 TCP 프로토콜에 영향을 주는 경우에 발생하며 두 번째 예외는 오류가 I/O 동작

에 영향을 주는 경우 발생합니다.
두 경우 모두 서버 차단(blocking) 문제를 유발합니다.

아래에서 설명하는 방법으로 문제를 파악하여 해결할 수 있습니다.


문제 해결
다음 항목을 모두 수행해야 하는 것은 아닙니다. 어떤 경우에는 다음 중 일부만 수행하여도 해결할 수

있습니다.

항목 바로가기:

문제 발생 원인

이러한 예외가 발생한 것은 운영 체제(OS)에 리소스 문제가 발생했고 OS 및 JVM 프로세스의 스템이

파일 디스크립터가 부족한 상황에서 실행되고 있음을 의미합니다(파일 디스크립터란? 참조).

이 문제는 서버에 연결하는 동시 접속자가 많은 경우에 주로 발생합니다. Java는 사용자의 응용 프로그램

을 실행하는 데 필요한 클래스를 읽기 위해 많은 파일을 엽니다. 매우 큰 응용 프로그램은 많은 파일

디스크립터를 사용할 수 있습니다. 이로 인해 새 파일 디스크립터가 부족해질 수 있습니다.

또한 새로운 각 소켓에도 디스크립터가 필요합니다. 클라이언트와 서버는 TCP 소켓을 통해 통신합니다.

브라우저의 http 요청으로 서버에 연결될 때 TCP 소켓을 사용합니다.

우선 파일 디스크립터를 모니터링하고 이러한 진단을 통해 열려 있는 파일의 상태 및 기타 발생 가능한

문제를 파악하는 것이 중요합니다.  이 문제 해결 섹션에서 각 운영 체제별 문제 해결 방법을 적용하려면

파일 디스크립터의 개수를 늘려야 할 수도 있습니다(파일 디스크립터 및 설정 참조).

페이지 맨 위

파일 디스크립터 모니터링

해결 가이드

다음은 일반적인 가이드 및 고려 사항입니다.

  • 파일 디스크립터의 총 개수가 너무 적거나 또는 일부 파일 디스크립터가 잘못 해제되고 있는지
  • 확인합니다.
서로 다른 기간에 파일 디스크립터의 총 개수를 확인하여 파일 디스크립터 개수의 증감 여부를
파악할 수 있습니다.

이와 함께 연결이 닫히기 전 TIME_WAIT 상태 커넥션의 유지 시간을 줄일 수 있습니다

(파일 디스크립터 해제 및 시기). 사용량이 많은 서버에서 디폴트 값인 240을 사용하면 커넥션 시

도가 지연될 수 있으며, 이로 인해 커넥션의 최대 개수가 제한됩니다.

  • 이 개수가 계속 증가하는 경우 일부 디스크립터의 처리 시간이 너무 긴지
  • (예: 파일이 제대로 닫히지 않는 경우 - 파일 디스크립터 해제 및 시기)
  • 또는 너무 많은 파일을 만들고 있는지(예: 드라이버 라이브러리에서 새로운 각 JDBC 연결에
  • 대해 파일을 계속 로드하는 경우) 확인합니다.
  • jar 파일을 이용하면 사용하는 파일 디스크립터의 개수가 줄어듭니다.
  • 클래스가 개별적으로 로드된 경우 각각 하나의 디스크립터가 사용되는데 반해 jar는 하나의
  • 디스크립터만 사용됩니다.

OS에 따라 다음 가이드를 통해 한 프로세스에서 모든 디스크립터를 어떻게 사용하고 있는지 모니터

링하고 진단할 수 있습니다.

페이지 맨 위

열린 파일 확인

Unix 플랫폼

Solaris, Tru64, HP-UX, Linux 및 AIX에서 제공되는 lsof (LiSt Open Files) Unix 관리 도구로 형식,

크기, i-node 등과 같은 열린 파일 및 네트워크 파일 디스크립터에 대한 정보를 표시할 수 있습니다.

특정 프로세스의 경우 구문은 다음과 같습니다.

lsof -p <pid of process>

예제 1

다음 명령은 Solaris 2.7에서 WLS 8.1SP1을 시작한 직후 실행되었습니다.  서버에서 실행 중인 Java

프로세스(pid 390)에 의해 84개의 파일 디스크립터가 할당되었음을 보여줍니다.  이 숫자는 파일

디스크립터의 디폴트 hard limit보다 훨씬 작습니다.

$ lsof -p 390 | wc -l
84


예외 발생 후 이 명령을 실행하면 이 java 프로세스에 의해 열린 파일의 최대 개수에 도달했음을

확인할 수 있습니다.  즉, 프로세스에서 파일 디스크립터가 부족합니다.

그런 다음 $ lsof -p <pid>를 실행하고 출력 방향을 파일로 지정하면 열린 각 파일을 확인할

수 있습니다.  닫혀있어야 할 파일이 목록에 표시되는 경우 해당 파일이 예상대로 닫히지 않은 이유를

조사할 수 있습니다.

lsof 출력 부분:


COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 29733 usera cwd VDIR 176,22 4096 4300274 /home/usera/810/user_projects/mydomain
java 29733 usera txt VREG 176,22 36396 6642305 /home/usera/810/jdk141_02/bin/java
java 29733 usera txt VREG 176,22 1251192 10818087 /home/usera/810/user_projects/mydomain/myserver/.wlnotdelete/extract

/myserver_uddi_uddi/jarfiles/_wl_cls_gen.jar
java 29733 usera txt VREG 176,22 511935 10074851 /home/usera/810/user_projects/mydomain/myserver/.wlnotdelete/extract

/myserver_uddi_uddi/jarfiles/WEB-INF/lib/jsse39153.jar
java 29733 usera txt VREG 176,22 2305960 6000676 /home/usera/810/user_projects/mydomain/myserver/.internal/uddi.war
java 29733 usera txt VREG 176,22 1227013 1385413 /home/usera/810/weblogic81/common/eval/pointbase/lib/pbserver44.jar
java 29733 usera txt VREG 176,22 653661 69379 /home/usera/810/weblogic81/server/lib/ant/optional.jar


lsof .h는 가능한 모든 구문 및 옵션을 표시합니다. 이 프로그램의 최신 버전은 http://ftp.cerias.purdue.edu/pub/tools/unix/sysutils/lsof/에서 구할 수 있습니다.

파일 디스크립터는 각 소켓 연결에도 사용되며 lsof 는 소켓(TCP 또는 UDP)의 유형 및 주소와 포트를

표시할 수 있습니다.

예제 2


COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
in.telnet 29705 root 2u inet 0x30002808fd8 0t76 TCP aaaaabbbb:telnet->abcdef.bea.com:3886
(ESTABLISHED)

HP에서 WebLogic Server를 실행할 때에는 성능 모니터링 도구인 glance를 사용하여 열린 파일의 총

개수를 파악할 수도 있습니다. (이 도구는 http://www.hp.com/에서 구할 수 있습니다.)

lsof를 사용할 수 없는 경우 /proc/<pid>/fd의 프로세스에 대해 모든 파일 디스크립터를 표시할

수도 있습니다.  각 파일 디스크립터는 이 디렉토리에 있습니다.

Windows 플랫폼

핸들
WinNT 또는 Windows 2000에서 명령줄 도구 handle을 사용하여 다음 예와 같이 열린 파일에 대한

핸들 정보를 표시할 수 있습니다.  특정 프로세스에 대해 사용할 수도 있습니다.
이 유틸리티는 http://www.sysinternals.com/ntw2k/freeware/handle.shtml에서 구할 수 있습니다.


C:\tmp>ps -ef | grep java
usera 1656 1428 0 10:11:41 CONIN$ 0:46 c:\Releases\WLS8.2\JDK141~1\bin\java -client -Xms32m -Xmx200m -XX:MaxPermSize=128m -Xverify:none -Dweblogic.Name=myserver -Dweblogic.ProductionModeEnabled= -Djava.security.policy="c:\Releases\WLS8.2\WEBLOG~1\server\lib\weblogic.policy" weblogic.Server

C:\tmp>handle -p java

Handle v2.10
Copyright (C) 1997-2003 Mark Russinovich
Sysinternals - www.sysinternals.com

------------------------------------------------------------------------------
java.exe pid: 1656 ABCDEF\usera
18: File C:\Releases\WLS8.2\user_projects\domains\mydomain
170: File C:\Releases\WLS8.2\jdk141_05\jre\lib\rt.jar
178: File C:\Releases\WLS8.2\jdk141_05\jre\lib\sunrsasign.jar
180: File C:\Releases\WLS8.2\jdk141_05\jre\lib\jsse.jar
188: File C:\Releases\WLS8.2\jdk141_05\jre\lib\jce.jar
190: File C:\Releases\WLS8.2\jdk141_05\jre\lib\charsets.jar
328: File C:\Releases\WLS8.2\jdk141_05\jre\lib\ext\dnsns.jar
330: File C:\Releases\WLS8.2\jdk141_05\jre\lib\ext\ldapsec.jar
338: File C:\Releases\WLS8.2\jdk141_05\jre\lib\ext\localedata.jar
340: File C:\Releases\WLS8.2\jdk141_05\jre\lib\ext\sunjce_provider.jar
348: File C:\Releases\WLS8.2\jdk141_05\lib\tools.jar
350: File C:\Releases\WLS8.2\weblogic81\server\lib\weblogic.jar
358: File C:\Releases\WLS8.2\weblogic81\server\lib\jconn2.jar
360: File C:\Releases\WLS8.2\weblogic81\server\lib\ojdbc14.jar
368: File C:\Releases\WLS8.2\weblogic81\server\lib\xmlx.jar
370: File C:\Releases\WLS8.2\weblogic81\server\lib\webservices.jar
378: File C:\Releases\WLS8.2\weblogic81\server\lib\wlcipher.jar
3e0: File C:\Releases\WLS8.2\weblogic81\server\lib\ant\ant.jar
3e8: File C:\Releases\WLS8.2\weblogic81\server\lib\EccpressoJcae.jar
3f0: File C:\Releases\WLS8.2\weblogic81\server\lib\EccpressoCore.jar
3f8: File C:\Releases\WLS8.2\weblogic81\server\lib\EccpressoAsn1.jar
400: File C:\Releases\WLS8.2\weblogic81\server\lib\jConnect.jar
408: File C:\Releases\WLS8.2\weblogic81\server\lib\ant\optional.jar
410: File C:\Releases\WLS8.2\weblogic81\server\lib\ant\jakarta-oro-2.0.7.jar
갋.
C:\tmp>handle -p java | wc -l
65

WLS 8.1SP2 실행 시 Windows에서 65개의 파일 핸들을 사용했음을 알 수 있습니다.

Process Explorer
Windows에서 사용할 수 있는 또 다른 도구인 Process Explorer는 파일 핸들을 모니터할 수 있는

고급 유틸리티입니다.  이 도구는 GUI 인터페이스로 구성되어 있으며 실행 중인 각 프로세스에 대해

자세한 정보를 표시합니다.  이 프로그램을 사용하여 특정 핸들을 검색할 수 있습니다.  이 도구는 http://www.sysinternals.com/ntw2k/freeware/procexp.shtml에서 구할 수 있습니다.  다음은 예제 출력 화면입니다.



WLS 실행 시 java 프로세스에서 884개의 핸들을 사용했고 이 중 일부(65개) 핸들만 열린 파일을 참조하고 있음을 알 수 있습니다.

이러한 도구를 사용하면 닫혀야 할 파일이 계속 열려 있는지 여부를 파악할 수 있습니다.  이제 아래에서 파일을 닫는 방법과 그것의 파일 디스크립터를 해제하는 방법을 확인해야 합니다.

페이지 맨 위

파일 디스크립터 해제 및 시기
파일 디스크립터는 파일을 닫거나 프로세스가 종료되면 해제됩니다.  close() 시스템 호출이 오류 코드를 반환하지 않으면 파일 디스크립터를 할당하는 이후의 open() 호출에서 연관된 파일 디스크립터를 사용할 수 있습니다.  열린 파일 디스크립터과 연관된 모든 파일 디스크립터를 닫으면 열린 파일 디스크립터가 해제됩니다.

파일 디스크립터와 같은 비 Java 리소스를 해제하기 위해 가비지 컬렉션과 개체 finalization에 의존해서는 안됩니다.  따라서 close() 를 사용해야 하며 오류 발생 시 적절하게 핸들링 해야 합니다.

모든 데이터 전송을 완료하기 위해 소켓을 닫더라도 TIME_WAIT으로 변환되었다가 최종 승인(ACK)에 의해 데이터 전송이 종료됩니다. 이 경우 파일 디스크립터의 해제를 지연시킵니다. 이 TIME_WAIT 시간은 Unix 시스템에서 tcp_time_wait _interval이라는 커널 매개변수로 정의됩니다. Windows NT, Windows 2000 및 Windows XP의 경우 이 시간은 레지스트리의 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters라는 시스템 키의 TcpTimedWaitDelay 로 정의됩니다.

Unix 커널 매개변수에 대한 자세한 설명을 보려면 다음 페이지를 참조하십시오.  http://www.unixadm.net/networking/tune.html

페이지 맨 위

알려진 WebLogic Server 문제
이러한 파일 디스크립터 부족 문제는 대개 개수를 늘리면 해결이 되지만, WebLogic 서버도 스스로 너무 많은 파일을 사용하지 않고 열린 파일을 정상적으로 닫아야 합니다.

BEA 고객 지원부로 보고된 모든 문제는 파일 디스크립터의 부족이나 디스크립터 테이블의 오버플로와 관련이 있습니다.  이 문제는 OS에서 java 프로세스에 새 파일 디스크립터를 할당할 수 없음을 통보할 때 항상 발생합니다.  이런 경우 fd의 개수를 늘려야 합니다.

페이지 맨 위

파일 디스크립터 및 설정

파일 디스크립터란?

파일 디스크립터는 프로세스가 열린 파일을 식별하기 위해 사용하는 부호 없는 정수(unsigned integer)로 표시된 핸들입니다.  파일 디스크립터는 파일이 열렸을 때의 모드, 위치 유형, 초기 유형 등과 같은 정보가 포함된 파일 개체와 연관됩니다.  이 정보를 파일의 컨텍스트라고 합니다.

파일 디스크립터 생성 방법
프로세스에서 파일 디스크립터를 획득하는 가장 일반적인 방법은 시스템 API인 open 또는 create 를 사용하거나 부모 프로세스에서 상속 받는 것입니다.  상속 방법을 사용하면 자식 프로세스가 부모 프로세스에서 사용하는 파일에 동일하게 액세스할 수 있습니다.  파일 디스크립터는 대개 각 프로세스마다 고유합니다.  fork 함수로 자식 프로세스를 생성하면 해당 자식 프로세스는 fork 시에 열린 모든 부모 프로세스의 파일 디스크립터 사본을 갖게 됩니다.  fcntl, dup dup2 함수를 이용하여 프로세스를 복제할 때와 동일한 복사 과정을 수행할 수 있습니다.

두 번째 예외는 JVM 프로세스에서 forkAndExec() 함수를 실행하는 동안 부모 프로세스의 파일 디스크립터를 복제하기 위해 새 파일 디스크립터가 필요한데 JVM 프로세스에서 파일 디스크립터가 부족한 경우를 나타냅니다.  OS 커널은 각 프로세스별로 모든 파일 디스크립터가 인덱싱된 파일 디스크립터 테이블을 u_block 구조로 관리합니다.

각 플랫폼에서 파일 디스크립터의 개수 정의 방법
프로세스에 할당할 수 있는 최대 크기 및 파일 디스크립터의 제한은 리소스 제한에 의해 정의됩니다.  이 값은 WebLogic Server 설명서에 제시된 OS 특정 파일 디스크립터 값에 따라 설정되어야 합니다.

WLS 8.1: 하드웨어, 운영 체제 및 네트워크 성능 조정
WLS 7.0: 하드웨어, 운영 체제 및 네트워크 성능 조정
WLS 6.1: 하드웨어, 운영 체제 및 네트워크 성능 조정

Unix 및 Linux에 모두 파일 디스크립터가 있습니다.  주요한 차이점은 hard limit의 설정, 디폴트값 및 파일 디스크립터의 구성 절차에 있습니다.

Solaris
/usr/bin/ulimit유틸리티를 사용하여 단일 프로세스에 할당하는 파일 디스크립터의 개수를 정의합니다.  최대값은 rlim_fd_max로 정의되며 기본적으로 65,536으로 설정됩니다.  루트 사용자만이 이 커널 값을 수정할 수 있습니다.

Linux

관리자는 다음 예와 같이 etc/security/limits.conf 구성 파일에 파일 디스크립터 제한을 설정할 수 있습니다.

soft nofile 1024
hard nofile 4096

다음 세 행을 /etc/rc.d/rc.local 시작 스크립트에 추가하여 시스템 전체의 파일 디스크립터 제한을 설정할 수도 있습니다.

# Increase system-wide file descriptor limit.
echo 4096 > /proc/sys/fs/file-max
echo 16384 > /proc/sys/fs/inode-max

Windows
파일 디스크립터는 Windows OS에서는 파일 핸들이라고 합니다.  Windows 2000 서버의 경우 열린 파일 핸들 제한은 16,384로 설정되어 있습니다.  이 값은 작업 관리자 성능 요약에서 확인할 수 있습니다.

HP-UX
nfile 을 사용하여 열린 파일의 최대 개수를 정의할 수 있습니다.  이 값은 대개 다음 공식으로 결정됩니다. ((NPROC*2)+1000) 여기서 NPROC는 대개 ((MAXUSERS*5)+64)입니다.  MAXUSERS가 400인 경우 계산 결과는 5128입니다.  대개 이 값을 더 높게 설정합니다.  maxfiles는 프로세스별 소프트 파일 제한이고 maxfiles_lim은 프로세스별 하드 파일 제한입니다.

AIX
파일 디스크립터 제한은 /etc/security/limits파일에 설정되어 있으며 기본값은 2000입니다.  이 제한은 ulimit명령 또는 setrlimit 함수로 변경할 수 있습니다.  최대 크기는 OPEN_MAX 상수로 정의합니다.

페이지 맨 위

추가 도움말이 필요하십니까?

패턴대로 작업했지만 추가 도움말이 필요한 경우 다음과 같이 할 수 있습니다.

  1. http://support.bea.com의 AskBEA에서 "too many open files"로 문제를 조회하여 게시된 다른 해결 방법을 찾아봅니다.
  2. http://newsgroups.bea.com 사이트에서 BEA 뉴스그룹에 대한 보다 자세한 내용을 질문합니다.

이렇게 해도 문제를 해결할 수 없는 경우 유효한 유지보수 계약이 되어 있다면 http://support.bea.com/에 로그인하여 Support Case를 신청할 수 있습니다.


고객 의견

이 지원 진단 패턴 "Too many open files"이 도움이 되셨습니까? 여러분에게 꼭 필요한 정보나 지원 진단 패턴에 새로 추가하길 바라는 항목이 있으면 저희에게 알려주시기 바랍니다.


책임의 한계에 대한 고지:

BEA Systems, Inc.는 사용자와 BEA 간의 유지 보수 및 지원 계약 내용에 따라 이 웹 사이트에 기술 팁과 패치를 제공합니다. BEA에서 허가한 소프트웨어와 함께 이 정보 및 코드를 사용할 수 있지만 BEA는 기술 팁 및 패치와 관련하여 어떠한 명시적이거나 암시적인 보증도 하지 않습니다.

이 문서에 참조된 상표는 해당 소유자의 자산입니다. 자세한 상표 정보를 보려면 제품 설명서를 참조하십시오.

페이지 맨 위 

[출처] Java, Too many open files|작성자 형기

2010년 1월 4일 월요일

java.lang.NumberFormatException.forInputString

java.lang.NumberFormatException.forInputString 오류

 

문제가 되었던 내용

펼쳐두기..


 

 

아래는 검색..

 

java.lang.NumberFormatException: For input string: ""
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)

== 이것은 자바런타임 에러로써 문법상의 에러는 없다

즉, 자바 컴파일러가 오브젝트 코드를 변환시에는 에러가 없다는 뜻

문법상 에러는 없다.

에러코드를 보면 NumberFormatException이 발생하는데, Integer.parseInt()메소드 호출시

매개변수가 숫자로 변환할 수 없는 형태의 값으로 전달되기 때문이다.

따라서 컴파일시에는 이값이 어떤게 들어갈지 모르므로 에러가 나지 않지만 실행시에 그값이

처리할 수 없는 값으로 전달되기에 에러가 발생한다.

에러의 처음라인을 보면 그매개변수가 "" 빈문자열로 들어가고 있는데 이것은 "0"과 다르다.

즉 공백문자가 들어가고 있기 때문에 숫자로 변환할  수 없는 것이다.

 

만약

String str = "";

int i = Integer.parseInt(str);

이렇게 하였다면

 

String str = ""; ----> String str="1";

이런식으로 숫자에 대응하는 문자열로 넣으면 된다.

 

 

 

 

2009년 12월 28일 월요일

SpringSource Tool Suite Download

STS Downloads

Description Link Size Hash
Eclipse 3.5.1
Windows springsource-tool-suite-2.3.0.RELEASE-e3.5.1-win32-installer.exe 209MB sha1 - md5
Windows springsource-tool-suite-2.3.0.RELEASE-e3.5.1-win32.zip 349MB sha1 - md5
Windows (64bit) springsource-tool-suite-2.3.0.RELEASE-e3.5.1-win32-x86_64-installer.exe 209MB sha1 - md5
Windows (64bit) springsource-tool-suite-2.3.0.RELEASE-e3.5.1-win32-x86_64.zip 349MB sha1 - md5
Mac OS X (Carbon) springsource-tool-suite-2.3.0.RELEASE-e3.5.1-macosx-carbon-installer.dmg 210MB sha1 - md5
Mac OS X (Carbon) springsource-tool-suite-2.3.0.RELEASE-e3.5.1-macosx-carbon.tar.gz 344MB sha1 - md5
Mac OS X (Cocoa)* springsource-tool-suite-2.3.0.RELEASE-e3.5.1-macosx-cocoa-installer.dmg 210MB sha1 - md5
Mac OS X (Cocoa)* springsource-tool-suite-2.3.0.RELEASE-e3.5.1-macosx-cocoa.tar.gz 344MB sha1 - md5
Mac OS X (Cocoa, 64bit)* springsource-tool-suite-2.3.0.RELEASE-e3.5.1-macosx-cocoa-x86_64-installer.dmg 209MB sha1 - md5
Mac OS X (Cocoa, 64bit)* springsource-tool-suite-2.3.0.RELEASE-e3.5.1-macosx-cocoa-x86_64.tar.gz 344MB sha1 - md5
Linux (GTK) springsource-tool-suite-2.3.0.RELEASE-e3.5.1-linux-gtk-installer.sh 209MB sha1 - md5
Linux (GTK) springsource-tool-suite-2.3.0.RELEASE-e3.5.1-linux-gtk.tar.gz 345MB sha1 - md5
Linux (GTK, 64bit) springsource-tool-suite-2.3.0.RELEASE-e3.5.1-linux-gtk-x86_64-installer.sh 209MB sha1 - md5
Linux (GTK, 64bit) springsource-tool-suite-2.3.0.RELEASE-e3.5.1-linux-gtk-x86_64.tar.gz 345MB sha1 - md5

Update Site Installation

STS can also be installed from the following update sites:
  • Releases: http://www.springsource.com/update/e3.5
  • Milestone releases: http://www.springsource.com/milestone/e3.5
  • Nightly snapshots: http://www.springsource.com/snapshot/e3.5

Requirements

The following pre-requisites must be fulfilled in order to install STS:

  • Operating System: Microsoft Windows XP or Vista, Apple Mac OS X, Linux
  • Java Runtime: latest version of JDK 5 or 6 (a JRE will not be enough to use all STS features)
  • Hardware: 500MB free disk space, 2GB memory

Installation Instructions

Please follow this installation instructions with great care.

Windows

Download the STS executable installer (*.exe) from the list above. Once downloaded, please double-click the installer to launch the installation process. Follow the on-screen instructions to finish the installation.

If you are downloading the ZIP archive please do not use the extraction utility that comes with Windows as it has been reported that this is causing problems during extraction. Instead please use the free 7-Zip utility.

Mac OS X

Download the STS Mac OS disk image (*.dmg) from the list above. Once downloaded, please mount the disk image by double-clicking the downloaded dmg file. Open the volume named 'SpringSource' and double-click on the installer to launch the installation. Follow the on-screen instructions to finish the installation.

At this time we do not recommend to use any of the Cocoa builds for Mac OS. There a numerous open performance related problems with the Cocoa port reported at Eclipse.org.

 

Linux

Download the STS self-extracting shell script (*.sh) that matches your OS and machine architecture. Once downloaded, launch the installation by running the following command in a terminal session:

$ sh springsource-tool-suite-2.3.0.RELEASE-e3.5.1-linux-gtk-installer.sh 

*******************************************************************************
*                   SpringSource Tool Suite 2.3.0.RELEASE                     *
*                                 Installer                                   *
*******************************************************************************
preparing the installer...
... done
starting UI installer. please follow instructions on screen...

2009년 12월 7일 월요일

인코딩 euc-kr, ksc5601, iso-8859-1, 8859_1, ascii, UTF-8

http://bins4088.textcube.com/7/trackback/

================================================================================
String charset[] = {"euc-kr", "ksc5601", "iso-8859-1", "8859_1", "ascii", "UTF-8"};
String name = "한글";
for(int i=0; i<charset.length ; i++){
for(int j=0 ; j<charset.length ; j++){
if(i==j) continue;
System.out.println(charset[i]+" : "+charset[j]+" :"+new String(name.getBytes(charset[i]),charset[j]));
}
}
================================================================================

 

펼쳐두기..


2009년 12월 2일 수요일

UTF-8 관련 개발 [인코딩]

OKJSP( http://www.okjsp.pe.kr/seq/72792 )

1. 모든 문서는 UTF-8 인코딩으로 저장되어야 합니다.

에디트 플러스의 경우 도구 -> 기본설정 -> 파일 부분에서 새 파일 형식을

UTF-8 로 해놓음으로써 새파일 작성시 UTF-8을 기본으로 작성할수 있고,

이미 다른 인코딩 타입에서 작성된 문서인 경우 내용을 모조리 Ctrl+C로 복사후

문서 -> 인코딩 변경 로드에서 UTF-8로 변경후 다시 붙여넣기 하면 됩니다.

 

이클립스의 경우 Package Explorer 에서 프로젝트에서 우측 버튼을 누른 후

Properties->Info->Text file encoding->Other 을 UTF-8 로 잡아주면 됩니다.

( 기존 다른 인코딩 타입에서 작성된 문서 내부 한글은 모조리 깨지게 됨 )

 

2. jsp 파일 상단에는 다음과 같은 방식으로 UTF-8 설정합니다.

<%@ page contentType = "text/html;charset=utf-8" %>

 

3. 서블릿은 다음과 같은 방식으로 UTF-8을 설정합니다.

request.setCharacterEncoding("utf-8")

 

4. 자바스크립트에서 encodeURIComponent 처리 및 톰캣 server.xml 의 설정 변경

위 1,2,3번의 방식으로 하면 post 방식의 데이터는 잘 받지만

get 방식의 데이터는 한글이 깨집니다.

이와 같은 경우 자바스크립트의 encodeURIComponent 함수와

server.xml 을 이용하여 처리하면 됩니다.

 

4.1 server.xml

톰캣 폴더의 conf 폴더에는 server.xml 파일이 존재합니다.

에디터로 열어보면

 

예)

    <Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" />

 

값이 약간 틀릴수 있지만 초기 셋팅 값이 보통 저러하고,

Connector 은 초기에 2개가 있는데 8080 포트 부분을 수정하면 됩니다.

수정하는 방법은

URIEncoding="UTF-8" 을 추가하면 됩니다.

 

예)

    <Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="utf-8" />

 

위와 같이 했다고 해결되는 것은 아닙니다. get 방식으로 데이터를 전송하면

자바 파일에서 확인 했을 경우 물음표 값만 넘어옵니다.

 

get 방식으로 보낼 경우 자바스크립트로 변환을 해줍니다.

예를 들어 "한글"을 자바스크립트에서

<SCRIPT>alert( encodeURIComponent("한글") )</SCRIPT>

처럼 encodeURIComponent 함수로 변환하게 되면 %ED%95%9C%EA%B8%80 으로

변환됩니다. 이 값을 주소에 "한글" 대신에 넣게 되면 자바에서 알아서 잘~ 받습니다 ^^

 

 

 

 

utf-8 인코딩을 이용한 한글 url 처리
[ 조회수: 393 ]
 

개요

  • utf-8 은 유니코드를 위한 가변길이 문자 인코딩 방식중 하나로 켄 톰프슨과 롭 파이크가 만들었다.
  • 유니코드 한문자를 표시하기 위해 1byte~4byte 까지 가변적으로 표현한다.
  • U+0000부터 U+007F 범위에 있는 아스키 문자들은 UTF-8에서 1바이트만으로 표시된다. 4바이트로 표현되는 문자는 모두 기본 다중언어 평면(BMP) 바깥의 유니코드 문자이며, 거의 사용되지 않는다.

구조

  • U+007F(0~127) 까지의 문자는 7비트 아스키 문자와 동일하게 표시된다.
  • U+007F 이후의 문자는 4byte 까지의 비트 패턴으로 표시되며 7비트 아스키 문자와 혼동되지 않게 하기 위해 모든 바이트의 최상위 비트는 1 이다.
코드 범위 UTF-16BE 표현 UTF-8 표현 설명
000000 ~00007F 00000000 0xxxxxxx 0xxxxxxx 아스키와 동일한 범위
000080 ~0007FF 00000xxx xxxxxxxx 110xxxxx 10xxxxxx 첫바이트는 110 으로 시작하고, 나머지 바이트는 10으로 시작함
000800 ~00FFFF xxxxxxxx xxxxxxxx 1110xxxx 10xxxxxx 10xxxxxx 첫바이트는 1110으로 시작하고 , 나머지는 10으로 시작함
010000 ~10FFFF 110110yy yyxxxxxx 110111xx xxxxxxxx 11110zzz 10zzxxxx 10xxxxxx 10xxxxxx UTF-16 "surrogate pair" 영역(yyyy=zzzzz -1)

clear=all>

utf-8 인코딩 예제

'위'(한글) --> U+C7404(유니코드)
U+0800부터 U+FFFF 사이의 영역에 있으므로, 표에 따라 1110xxxx 10xxxxxx 10xxxxxx 형식으로 인코딩
C704(16진수) --> 1100-0111-0000-0100(2진수) --> 11101100 10011100 10000100(utf-8 인코딩)
결과적으로 이 문자는 3바이트로 인코딩 되면 16진수로 표기하면 EC 9C 84가 된다.

(첫 128 문자는 1바이트로 표시되고, 그 다음 1920 문자 (판독 기호가 붙은 라틴 문자, 그리스 문자, 키릴 문자, 콥트 문자, 아르메니아 문자,
히브리 문자, 아랍 문자)는 2바이트로 표시되며, 나머지 문자들 중 BMP 안에 들어 있는 것은 3바이트, 아닌 것은 4바이트로 표시된다.)

관련자료

utf-8 체크

    1. 입력된 문자열이 utf-8로 인코딩 되었는지 하기 위해서는 utf-8 의 인코딩 패턴을 조사한다. 즉 바이트 배열의 패턴이 utf-8 인코딩 패턴(1110xxxx 10xxxxxx 10xxxxxx)과 맞는지를 비교한다.
    2. 000080 ~0007FF 범위의 110xxxxx 10xxxxxx 패턴 일 경우엔 중복되는 코드값으로 인해 utf-8 인코딩인지 아닌지 체크하는것은 사실상 불가능하다.
      110xxxxx 10xxxxxx 패턴의 utf-8 판독

      110xxxxx 10xxxxxx 패턴의 코드일 경우 utf-8로 인코딩 되었는지 아닌지를 확인하는것은 사실상 불가능하다.
      하지만 utf-8로 인코딩 되면 아스키 영역은 1byte 한글은 3byte 내지는 4byte를 사용하므로 단순하게 생각하여 2 바이트 110xxxxx 10xxxxxx 패턴의 경우는 utf-8 인코딩이 아님을 유추할수 있다.
      판독 기호가 붙은 라틴 문자, 그리스 문자, 키릴 문자, 콥트 문자, 아르메니아 문자, 히브리 문자, 아랍 문자 등이 입력되면 판독 오류가 발생하겠지만 이는 무시해도 좋을듯 하다.

    3. Null 값의 경우 자바에서는 변형된 utf-8 인코딩 방식에 따라 1byte가 아닌 2byte(11000000 10000000)로 표기하므로 110xxxxx 10xxxxxx 의 경우 null 인지 비교해야 정확한 판독이 가능하지만 입력된 값의 인코딩여부를 판독하므로 상황에 따라서는 무시해도 괜찮을듯 하다.
    4. CJK 2바이트+한글 2바이트 가 '1110xxxx 10xxxxxx 10xxxxxx 0xxxxxxx' 와 같은 패턴으로 utf-8 3바이트 와 아스키1바이트 조합과 유사할 경우 앞자리 3바이트를 유니코드 형태로 역치환 해서 000800 ~00FFFF 범위가 맞는지 체크한다.

utf-8 인코딩 체크 예제

utf-8 인코딩 판독 예제

1. '위'.getBytes("ISO-8859-1") : -20 , -100, -124
2. unsigned byte = 236, 156, 132
3. 16진수 : EC , 9C, 84
4. 2진수 : 11101100 10011100 10000100
5. urf-8 패턴제거: 00001100 00011100 00000100
6. 유니코드 타입으로 치환 : 00001100<<12 + 0011100<<6 + 00000100 = 11000000 00000100
7. 16진수 : 000800 <= 00E704 =< 00FFFF

package util;

import java.io.UnsupportedEncodingException;

/** 
 *  <pre>
 *  작성자 : 이종희 (qola@naver.com)
 *  JAlbum.com (http://jalbum.net/download.jsp?ref=list) 소스 참고함.   
 *  <b>특정 문자열이 utf-8 인코딩인지 아닌지 체크한다.</b>
 * 
 *  utf-8 인코딩 패턴인  110xxxxx 10xxxxxx , 1110xxxx 10xxxxxx 10xxxxxx 인지 비교한다.
 *  2바이트 (110xxxxx 10xxxxxx) 패턴의 유니 코드 중복으로 인해 100% 검증할수 없지만 
 *  한글의 경우 3byte 로 표기 되므로  2바이트 패턴일 경우 utf-8 인코딩이 아닌것으로 간주한다.
 *  
 *  따라서 000080 ~0007FF 영역의 라틴 문자, 그리스 문자, 키릴 문자, 콥트 문자, 
 *  아르메니아 문자, 히브리 문자, 아랍 문자 등은 utf-8 인코딩을 비교할수 없다. 
 *  
 *  수정된 utf-8의 의한 null값 \u0000 은 11000000 10000000 로 표기되지만 무시하기로 한다.
 *  
 *  </pre>
 */

public class UTFUtil {
	   
	
	public static boolean isUTF8(String str) throws Exception{
		byte[] bytes=str.getBytes("ISO-8859-1");
		return isUTF8(bytes,0,bytes.length);
	}
	   
	public static boolean isUTF8(byte[] buf, int offset, int length) {

	       boolean yesItIs = false;
	       for (int i=offset; i<offset+length; i++) {
	          if ((buf[i] & 0xC0) == 0xC0) { // 11xxxxxx 패턴 인지 체크 
	             int nBytes;
	             for (nBytes=2; nBytes<8; nBytes++) {
	                int mask = 1 << (7-nBytes);
	                if ((buf[i] & mask) == 0) break;
	             }
	            
                      //CJK영역이나 아스키 영역의 경우 110xxxxx 10xxxxxx 패턴으로 올수 없다.
	             if(nBytes==2) return false;
	             
	             // Check that the following bytes begin with 0b10xxxxxx
	             for (int j=1; j<nBytes; j++) {
	                if (i+j >= length || (buf[i+j] & 0xC0) != 0x80) return false;
	             }
                
                if(nBytes==3){
                	// 유니코드 형태로 역치환 해서 0x0800 ~ 0xFFFF 사이의 영역인지 체크한다. 
                    char c = (char) (((buf[i] & 0x0f) << 12) + ((buf[i+1] & 0x3F) << 6) + (buf[i+2] & 0x3F));
                    if(!(c >= 0x0800 && c <= 0xFFFF)){
                        return false;
                    }	                	
                }
	                
	             yesItIs = true;
	          }
	       }
	       return yesItIs;
	 }
	    
}

clear=all>

 

 

한글 URL 사용시 문제 발생 케이스

  • IE에는 유니코드 지원을 위해 기본적으로 URL을 UTF-8 로 전송해 주지만 옵션 사항이므로 사용자 마다 환경이 다를수 있다.
  • utf-8로 다시 보내는 기능을 제공하지 않는 브라우저도 존재한다.
  • RSS 리더와 같은 별도의 클라이언트를 사용할경우 서버인코딩, 클라이언트, 브라우저 인코딩 이 모두 일치하여야만 한다.

해결책

  • REQUEST 요청시 URL이 UTF-8 인코딩 방식인지 아닌지를 체크하여 UTF-8 방식이면 "ISO-8859-1 --> UTF-8" 형태로 인코딩 변환을 해주고 그렇지 않으면 "ISO-8859-1 --> MS949" 로 인코딩 변환을 시켜준다.

구현 예제

  • APACHE MOD_REWRITE
    • 아래 예와 같이 MOD_REWRITE를 이용해 특정 패턴의 URL을 REWRITE 시킨다.
      RewriteEngine   on
          # // http://tag.naver.com/tag2/한글 --> http://tag.naver.com/tag/index.jsp?tag=한글
          RewriteRule ^/tag2/(.+)$  /tag/index.jsp?tag=$1 [PT]
  • JSP 샘플
    • isUTF8() 체크 메소드를 이용해 파라메터의 인코딩을 각각 처리해준다.
      <%@page language="java" contentType="text/html;charset=utf-8"%>
      <%@page import="java.net.URLEncoder, util.*" %>
      
      <html>
      <head>
      	<meta http-equiv="Content-type" content="text/html; charset=utf-8">
      </head>
      
      <body>
        index.jsp... <br>
        
        <%
          String uri=request.getRequestURL().toString();
        	String tag=request.getParameter("tag");
        	byte[] tagBytes=tag.getBytes("ISO-8859-1");
        	
        	out.println("byte[]===");
        		for(int i=0;i<tagBytes.length;i++){
        			out.println(tagBytes[i]+",");
        		}
        	out.println("<br>");  
        	
        	boolean isUTF8=UTFUtil.isUTF8(tag);
        	
        	if(isUTF8) {
        		out.println(util.Enco.toUtf(tag));
        		out.println("<br>");
        		out.println(isUTF8);
        		
        	}else{ 
        		out.println(new String(tag.getBytes("ISO-8859-1"),"ms949"));
        		out.println("<br>");
        		out.println(isUTF8);
        	}
        %>
        
        <a href="http://tag_test.com/tag2/한글">http://tag_test.com/tag2/한글</a><br>
        <a href="http://tag_test.com/tag2/코리아">http://tag_test.com/tag2/코리아</a><br>
        <a href="http://tag_test.com/tag2/위">http://tag_test.com/tag2/위</a>
      </body>
      </html>
       

UTF-8과 java.net.URLDecoder 클래스

java.lang.Object

 ↑ java.net.URLDecoder

public class URLDecoder extends Object

 

특별한 encode 방식을 사용해 application/x-www-form-urlencoded 캐릭터 라인을 디코드합니다. 지정된 encode 방식을 사용해, %xy의 형식의 연속 순서가 나타내는 문자를 결정합니다.

 

 

 

 

2009년 12월 1일 화요일

java [] 배열은 함수인자로 넘겨도 내부가 포인터구조여서 값이 변한다

배열만 열외인듯

[code java] public class TestInt { public void aa0(int a) { } public static void aa1(int []a){ a[0]=1; System.out.println("a[0]="+a[0]); } // public ~~ main(){ // int []a = {30,31}; // // a[0] = 30; // aa(a); // // a[0] = 1; // // // } public static int aa2(int i){ i=1; System.out.println("i="+i); return i; } public static void main(String[] args) { int a = 30; int a1[] = {30}; // a = 30; int t = aa2(a); aa1(a1); // a = 30; System.out.println("t="+t); System.out.println(a); System.out.println(a1[0]); } } [/code]

 

a = 30

a[0] = 1