'java'에 해당되는 글 13건

  1. 2009.02.06 [스크랩]java.lang.OutOfMemoryError by 지영아빠
  2. 2008.11.25 Sorting Algorithms Demonstration in Java by 지영아빠
  3. 2008.11.21 JDK 6에서 Class Loading시 ClassNotFoundException문제 by 지영아빠
  4. 2008.11.21 NoClassDefFoundError by 지영아빠
  5. 2008.11.19 HPjconfig by 지영아빠
  6. 2008.11.05 Windows java nio를 이용한 file copy시 IOException문제 by 지영아빠
  7. 2008.10.24 MalformedInputException in depth by 지영아빠
  8. 2008.10.23 findclass (jar 파일 내의 class를 찾아서 알려주는 utility) by 지영아빠
  9. 2008.10.23 Too many open files 에러 by 지영아빠
  10. 2008.10.21 [리뷰]자바 이론과 실습: 제네릭스 해부, Part 1 by 지영아빠

Java OOM관련 참고자료가 있어 올려놓습니다. 참고하시기 바랍니다.


java.lang.OutOfMemoryError

 

                   2005-05-31     송학렬    ㈜아이티플러스 기술지원부

 

 

이 문서는 기술지원 또는 개발 시 java.lang.OutOfMemoryError 를 만났을 때 원인 파악 및 해결방안 입니다.

 

 

java.lang.OutOfMemoryError 에는 크게 2가지 패턴이 있다고 볼 수 있습니다.(전적으로 개인적인 생각이지만..^^)

Java heap 메모리가 정말로 Full 되서 나는 종류가 있고 그렇지 않은데도 나는 종류가 있습니다.

그 둘 중에 어는 것 인지부터 가려내는 것이 가장 먼저 선행되어야 합니다.

Java 가상머신에는 메모리 구조가 여러단계로 나뉘어 져 있으므로 어느 영역에 의해 java.lang.OutOfMemoryError 가 나는지 알기 위해 JAVA OPTION으로 싸이트가 안정화 되기 전까진 verbosegc 또는 -XX:+PrintGCDetails  옵션을 추가해 놓는 것이 java.lang.OutOfMemoryError 났을 때를 대비해 좋은 습관이라 할 수 있습니다.

 

-verbosegc 또는  -XX:+PrintGCDetails  옵션으로 로그에 남는 heap 메모리 정보를 본 후 java.lang.OutOfMemoryError 가 날 때 heap이 꽉 차서 나는 것인지 아닌지 부터 판단합니다.

 

1.   Heap Memory Full 차지 않았을 때

1)   Perm 영역이 full 되는 경우

 

Permanent generation is full...

increase MaxPermSize (current capacity is set to: 134217728 bytes)

 

[Full GC[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor31282]

 810207K->802132K(1013632K), 8.3480617 secs]

<GC: 2 4  2465625.831280 10348 0 31 113802808 105534632 286326784 0 0 35782656 715849728 715848840 715849728 134217720 134023296 134217728 8.348677 8.348677 >

Passwd Check =============

<2005. 5. 19. 오전 9 32 23 KST> <Error> <HTTP> <BEA-101017> <[ServletContext(id=2536415,name=/,context-path=)] Root cause of ServletException.

java.lang.OutOfMemoryError

위와 같은 case 인 경우네는 Java 가상머신중에 Perm 영역이 full 차는 경우 입니다. 

Perm 영역에는 class object 및 관련된 meta data가 로드되는 곳인데 싸이트가 매우 많은 수의 class를 사용하는 경우 늘려줘야 하는 case도 있습니다.

얼마가 적정한 사이즈란 정답이 없는 것 같고 max가 계속 늘어나지 않고 일정한 사이즈를 유지 하면 됩니다.

 

             위 에러가 났을때는 -XX:MaxPermSize=256m  옵션으로 사이즈를 적당하게 늘려주는게 방

             법이며 늘려주었는데도 불구하고 Full 차는 시간만 늘어날 뿐 계속 사이즈가 늘어난다면 이 영역은 일반 비즈니스 프로그램으로 핸들링 할 수 없는 영역이므로 WAS 제품의 버그 및 jdk 버그로 보는 것이 일반적입니다.

       

2)   MAXDSIZ 사이즈 관련

  - Exception in thread "CompileThread0" java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool::allocate

Possible causes:

         - not enough swap space left, or

         - kernel parameter MAXDSIZ is very small.

-          java.lang.OutOfMemoryError: unable to create new native thread

 

위 두 에러가 나는 이유는 Data 사이즈가 Full 차서 더 이상 메모리 할당을 할 수 없다는 java.lang.OutOfMemoryError 입니다.

 

Jdk도 내부적으로 c 라이브러리를 쓰고 jni를 통해서 c프로그램을 호출할 수 도 있는 환경에서 Data 영역이상으로 메모리 사용 시 위 에러를 만날 수 있습니다.

Heap 영역에는 java heap C heap이 있는데 C heap Data 메모리 영역에 영향을 미치는 것으로 보이며 보통 C의 전역 변수들이 잡히는 영역입니다.

 

위 현상을 만났을 때는 hp os MAXDSIZ가 너무 작게 잡혀있지 않은지 확인 후 적당한 크기로 늘려 줘야 합니다.

 

Glance 에서 shift+m 을 누른 후 jvm pid를 누르면 java가 사용하는 Data 사이즈를 모니터링 할 수 있습니다.

모니터링을 통해 적정한 사이즈로 MAXDSIZ를 늘려주어야 하며 만일 늘려 준게 에러 발생의 시간만 지연 시킬 뿐 계속 사용량이 늘어난다면 이는 사용하는 c라이브러리 쪽에 메모리 릭 버그가 있는 것이므로 c라이브러리를 체크 하셔야 합니다.

java.lang.OutOfMemoryError: unable to create new native thread

이 경우는 프로그램에서 Thread pool 프로그램 실수로 필요이상으로 쓰레드가 생성되는 경우도 과도하게 메모리를 사용할 수 있으므로 jvm 쓰레드 덤프를 통해 과도한 쓰레드가 생성되지 않았는지도 확인해 보셔야 합니다.

 

2.   Heap Full 찾을 때

이 경우는 java가 사용하는 heap 영역이 Full 되서 java.lang.OutOfMemoryError 가 나는 경우 인데 두 가지 패턴이 있습니다.

순간적으로 대량의 데이터를 메모리에 올리는 프로그램이 실행되어 문제를 야기 할수 있으며 다른 한 가지는 조금씩 메모리 릭이 발생하여 점차적으로 메모리가 쌓여 가는 경우 입니다.

두 가지 중에  어느 것인지 구별하는 것이 중요하며 이를 위해서도 마찬가지로 -verbosegc 또는  -XX:+PrintGCDetails  로그를 통해 순간적으로 메모리가 차는 것인지 조금씩 메모리가 차는 것인지를 확인하셔야 합니다.

 

1) 특정 프로그램의 특정시점의 과도한 메모리 사용에 의한 경우

                특정 프로그램이 과도하게 heap 메모리 이상 메모리를 사용하면서

java.lang.OutOfMemoryError가 발생하는 경우는 이 에러가 발생하는 시점의 쓰레드 덤프를 통해 어느 프로그램인지 쉽게 찾을 수 있습니다.

쓰레드 덤프에 메모리를 쓸만한 프로그램은 어느 정도의 자바프로그램 경험이 있으면 찾을 수 있습니다.

 

Ex)

"ExecuteThread: '36' for queue: 'default'" daemon prio=10 tid=0x0048e7b0 nid=48 lwp_id=4139729 runnable [0x23f32000..0x23f30500]

          at java.net.SocketInputStream.socketRead(Native Method)

          at java.net.SocketInputStream.read(Unknown Source)

          at oracle.net.ns.Packet.receive(Unknown Source)

          at oracle.net.ns.NetInputStream.getNextPacket(Unknown Source)

          at oracle.net.ns.NetInputStream.read(Unknown Source)

          at oracle.net.ns.NetInputStream.read(Unknown Source)

          at oracle.net.ns.NetInputStream.read(Unknown Source)

          at oracle.jdbc.ttc7.MAREngine.unmarshalUB1(MAREngine.java:718)

          at oracle.jdbc.ttc7.MAREngine.unmarshalSB1(MAREngine.java:690)

          at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:373)

          at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1405)

          at oracle.jdbc.ttc7.TTC7Protocol.fetch(TTC7Protocol.java:889)

          - locked <0x35e8e3b0> (a oracle.jdbc.ttc7.TTC7Protocol)

          at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:242)

          - locked <0x36f66c98> (a oracle.jdbc.driver.OracleResultSetImpl)

          at weblogic.jdbc.pool.ResultSet.next(ResultSet.java:180)

          at Dcard.AAA.ejb.monitor.member.wbbb.WACBean.getInfoList(WACBean.java:5789)

 

java.lang.OutOfMemoryError 가 날 상황에 쓰레드 덤프를 두 세번 떠서 같은 쓰레드 번호로 위 같은 로직이 오래 결려있다면 이는 프로그램에서 while(rs.next()) 를 오랜 기간 돌면서 메모리에 DB로부터 읽어서 올리고 있다는 것을 의미 합니다 대량 데이터 조회가 일어나는 경우인 것 입니다.

 

이런 식으로 특정 프로그램의 특정 시점에 과도한 메모리 사용으로 인한 java.lang.OutOfMemoryError 에러는 쓰레드 덤프를 통해 찾을 수 있습니다.

-- 물론 2번에서 설명 할 heap dump를 통해서도 찾을 수 있습니다.

 

2) 메모리 릭에 의해 조금씩 메모리가 쌓인 경우

JVM위 에서 실행중인 프로그램중에 어떤 것이 GC 대상에서 제외되는 영역에 data를 조금씩 쌓고 있다는 얘기입니다.

GC 대상에서 제외되는 영역은 다음과 같은 곳이 있습니다.

- Http Session에 넣는 데이터..(세션 타임아웃 또는 invilidate 씨 까지 제외됨)

- Static 변수

- 서블릿 또는 jsp의 멤버변수 ( WAS 기동 후 최초 호출 시 인스턴스 화 되어 WAS가 내려 갈 때 까지 사라지지 않음 )

- EJB의 멤버변수( pool안에서 객체가 존재하는 한 GC대상에서 제외)

          위 같은 영역에 프로그램에서 data add 하는 구조를 메모리 릭 이라고 할 수 있습니다.

           IBM 또는 SUN JDK 인 경우에는 heapdump를 통해서 분석하여 어느 데이터가 메모리를 많이 잡고 있는지를 알 수 있습니다.

           Heapdump 사용법 및 분석 법은 다음을 참조 하시면 됩니다.

 http://www.alphaworks.ibm.com/aw.nsf/FAQs/heaproots

http://www-1.ibm.com/support/docview.wss?uid=swg21190476

http://www-1.ibm.com/support/docview.wss?rs=180&context=SSEQTP&q1=heapdump+solaris&uid=swg21190608&loc=en_US&cs=utf-8&lang=en

http://www.skywayradio.com/tech/WAS51/IBMHeapDump/

 

 

저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 지영아빠
좋은 자료가 있어 스크랩합니다.

자바로 된 각종 정렬알고리즘을 일목요연하게 보여줍니다.
아래 정렬 알고리즘만 알고 있으면 정렬관련문제는 거의 다 해결 할 수 있습니다.



알고리즘 첨부: 

Sorting Algorithms Demonstration in Java






저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 지영아빠


(cl) ClassLoader.loadClass() throws java.lang.ClassNotFoundException: [Ljava.lang.String; in JDK 6.0


JDK 5.0(1.5)에서 개발된 모듈을 JAVA 6에 포팅하려고 테스트를 해보니 다음과 같은 에러가 발생하였습니다. 

java.lang.ClassNotFoundException: [Ljava.lang.String; 

이 발생하였습니다.

자료를 찾아보니 Sun에 이미 버그 리포트가 되었나 봅니다.
버그 id: 6434149


public class test { public static void main(String[] args) throws Exception { String[] s = new String[] { "123" }; String clName = s.getClass().getName(); test.class.getClassLoader().loadClass(clName); } }


이것을 돌리면 1.5에서는 괜찮지만, 1.6에서는 ClassNotFoundException 이 발생합니다.

이것을 Class.forName()으로 수정하면 이상 없다고 합니다. ^^;;

-------------------------------------------
2008.12.22 추가사항

자료를 찾아보니 아래와 같은 옵션이 있었습니다. ^^;;

SUN, IBM VM 모두 적용되는 옵션입니다.
아래를 적용하면 forName을 사용하는 경우에는 발생하지 않으나 loadClass 호출시 발생하던 ClassNotFoundException을 방지합니다.

jdk1.6부터 loader 내부에서 recursive하게 class를 load할때... 아래 옵션이 명시적으로 없으면 class의 array 형 이름을 처리하지 않고 예외를 발생시키고 있습니다.

-Dsun.lang.ClassLoader.allowArraySyntax=true


저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 지영아빠

NoClassDefFoundError

언어/Java : 2008.11.21 10:05

NoClassDefFoundError 


NoClassDefFoundError는 개발하면서 종종 접하게 되는 Error입니다. Class로딩 단계에서 Class를 찾을 수 없을때에 발생합니다.


java doc에는 다음과 같이 소개되어 있습니다.

Thrown if the Java Virtual Machine or a ClassLoader instance tries to load in the definition of a class (as part of a normal method call or as part of creating a new instance using the new expression) and no definition of the class could be found.

The searched-for class definition existed when the currently executing class was compiled, but the definition can no longer be found.

만약 NoClassDefFoundError가 생겼다면 이는 실행시 참조하는 class를 찾을 수 없다는 에러로 classpath에 원하는 패키지가 잘 설정되어 있는지 확인해 보시기 바랍니다. 그리고 classpath를 적을 때, 실행을 원하는 위치를 입력하는게 좋습니다. 
예를 들면 classpath=.; 



아래는 dW에 소개된 내용입니다.


출처: http://www.ibm.com/developerworks/kr/library/j-dclp2.html


NoClassDefFoundError는 로딩 단계 동안 클래스 로더에 의해 던져진 또 다른 예외(Exception)이다. JVM 스팩은 NoClassDefFoundError를 다음과 같이 정의하고 있다.

자바 가상 머신(Java virtual machine) 또는 ClassLoader 인스턴스가 클래스 정의 중 로딩을 시도하고(정상적인 메소드 호출의 일환으로, 또는 새로운 식을 사용하여 새로운 인스턴스를 생성하는 것의 일환으로), 이 클래스에 대한 어떤 정의도 찾을 수 없을 때 예외(Exception)가 던져진다.

현재 실행 중인 클래스가 컴파일 될 때 searched-for 클래스 정의가 존재했지만, 그 정의는 더 이상 찾을 수 없다.

NoClassDefFoundError는 실패한 클래스 로드의 결과로 생기는 예외(Exception)이다.

Listing 2에서 Listing 4까지의 테스트 케이스는 클래스 B의 로딩이 실패했기 때문에 만들어진NoClassDefFoundError를 보여주고 있다.


Listing 2. NoClassDefFoundErrorTest.java
				
public class NoClassDefFoundErrorTest {
public static void main(String[] args) {
A a = new A();
}
}


Listing 3. A.java
public class A extends B {
}


Listing 4. B.java
public class B {
}

이러한 리스팅에서 코드를 컴파일 했다면, B의 classfile을 제거하라. 이 코드가 실행되면 다음과 같은 에러가 생긴다.

Exception in thread "main" java.lang.NoClassDefFoundError: B
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:810)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:147)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:475)
at java.net.URLClassLoader.access$500(URLClassLoader.java:109)
at java.net.URLClassLoader$ClassFinder.run(URLClassLoader.java:848)
at java.security.AccessController.doPrivileged1(Native Method)
at java.security.AccessController.doPrivileged(AccessController.java:389)
at java.net.URLClassLoader.findClass(URLClassLoader.java:371)
at java.lang.ClassLoader.loadClass(ClassLoader.java:572)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:442)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
at NoClassDefFoundErrorTest.main(NoClassDefFoundErrorTest.java:3)

Class A는 Class B를 오버라이드(override)한다. 따라서, Class A가 로딩될 때, 클래스 로더는 ClassB를 내재적으로 로딩한다. Class B는 존재하지 않기 때문에, NoClassDefFoundError가 던져진다. 클래스 로더가 Class B를 로딩 명령을 받으면 (예를 들어, loadClass("B") 호출),ClassNotFoundException이 던져진다.

확실히, 이 특수한 예제에서 문제를 해결하려면, Class B는 합당한 클래스 로더의 classpath에 존재해야 한다. 이 예제는 단순하고도 비현실적이다. 많은 클래스들을 갖고 있는 복잡한 실제 시스템에서는, 패키징 또는 전개 동안 클래스가 소실될 때 이 같은 상황이 발생할 수 있다.

이 예제에서 A는 B를 확장한다. 하지만, A가 메소드 매개변수 또는 인스턴스 필드로서 B를 참조한다면 같은 에러가 여전히 발생한다. 두 클래스들 간 관계가 상속이 아닌 참조라면, A를 로딩하는 동안이 아닌, A를 처음 사용할 때 예외(Exception)가 던져진다.

저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 지영아빠
HPjconfig는 HP-UX상에서 JAVA 정보와 OS의 패치정보를 한번에 보여주는 utility입니다.



HPjconfig: Java configuration tool for tuning HP-UX for java

Key HPjconfig features and requirements are:

  • HPjconfig is a configuration tool for tuning HP-UX 11i system kernel parameters
  • HPjconfig provides required HP-UX patch information
  • HPjconfig is a pure Java™ application
  • HPjconfig is supported on all HP-UX 11i HP Integrity Itanium® and HP 9000 PA-RISC systems
  • HP-UX SDK or RTE version 1.4.2.x or later is required

HPjconfig is a Java configuration tool for tuning your HP-UX 11i HP Integrity Itanium® and HP 9000 PA-RISC system kernel parameters to match the characteristics of your application.   HPjconfig provides kernel parameter recommendations tailored to your HP-UX hardware platform.   It offers save and restore functions for easy distribution of tailored recommendations across your customer base.   When given specific Java and HP-UX versions, HPjconfig will determine if all of the latest HP-UX patches required for Java performance and functionality are installed on the system, and highlight any missing or superseded patches.

HPjconfig is a pure Java Application that runs on the HP-UX SDK or JRE for the Java 2 Platform version 1.4.2.x, 5.0.x, and 6.0.x.   HPjconfig is supported on HP PA-RISC 11i v1 (11.11), 11i v2 (11.23), 11i v3 (11.31) and HP Itanium® 11i v2 (11.23) and 11i v3 (11.31).

All HP-UX 11i HP Integrity Itanium® and HP 9000 PA-RISC systems are supported.




http://cafe.naver.com/ghson.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=206

저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 지영아빠
Windows에서 java nio를 이용하여 파일 복사시 아래와 같은 오류가 있었습니다.

Exception in thread "main" java.io.IOException: 사용 가능한 저장소가 부족하여 이 명령을 처리할 수 없습니다
    at sun.nio.ch.FileChannelImpl.map0(Native Method)
    at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:742)
    at sun.nio.ch.FileChannelImpl.transferToTrustedChannel(FileChannelImpl.java:448)
    at sun.nio.ch.FileChannelImpl.transferTo(FileChannelImpl.java:521)


기존 코드는 다음과 같았습니다.

 FileChannel in = new RandomAccessFile("1.dat", "r").getChannel();
FileChannel out = new RandomAccessFile("1.cpy", "rw").getChannel();

try {
  in.transferTo(0, in.size(), out);
}catch (Exception e) {
  e.printStackTrace();
}

이렇게 되어있었습니다.

자료를 찾아보니 Windows에서는 버퍼 제한이 있어서 다음과 같이 수정 하여아 합니다.

 FileChannel in = new RandomAccessFile("1.dat", "r").getChannel();
FileChannel out = new RandomAccessFile("1.cpy", "rw").getChannel();

try {
    int maxCount = 1024*1024*200;     // 시스템 상황에 따라 조정합니다.
    long size = in.size();
    long position = 0;
        System.out.println("size:"+size);
    while (position < size) {
       position += in.transferTo(position, maxCount, out);
    }
}catch (Exception e) {
  e.printStackTrace();
}

이렇게 수정하니 해결되었습니다.





신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 지영아빠
MalformedInputException에 대해서 궁금하신게 많은것 같아 자료를 조금더 보강해 봤습니다. MalformedInputException이 발생하는 것은 encoding에 맞지 않는 byte가 들어왔을때 발생합니다.

 sun.io.MalformedInputException
    at sun.io.ByteToCharUTF8.convert(ByteToCharUTF8.java:262)
    at sun.nio.cs.StreamDecoder$ConverterSD.convertInto(StreamDecoder.java:314)
    at sun.nio.cs.StreamDecoder$ConverterSD.implRead(StreamDecoder.java:364)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:250)
    at java.io.InputStreamReader.read(InputStreamReader.java:212)
    at java.io.BufferedReader.fill(BufferedReader.java:157)
    at java.io.BufferedReader.read1(BufferedReader.java:208)
    at java.io.BufferedReader.read(BufferedReader.java:282)
    at java.io.Reader.read(Reader.java:143)

이런 Exception이 발생한 경우에 ByteToCharUTF8 소스를 찾아보면 다음과 같이 되어있습니다.

소스: ByteToCharUTF8

UTF-8을 예를 들어 설명하겠습니다.

UTF-8은 기존 unicode의 단점인 속도문제를 개선하기 위해서 만들어진 인코딩 방식으로 Unicode에서 정의된 문자를 1~4byte의 가변으로 처리하는 것입니다.

코드 범위
(십육진법)
UTF-16BE 표현
(이진법)
UTF-8 표현
(이진법)
설명
000000-00007F 00000000 0xxxxxxx 0xxxxxxx ASCII와 동일한 범위
000080-0007FF 00000xxx xxxxxxxx 110xxxxx 10xxxxxx 첫 바이트는 110 또는 1110으로 시작하고, 나머지 바이트들은 10으로 시작함
000800-00FFFF xxxxxxxx xxxxxxxx 1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF 110110yy yyxxxxxx 110111xx xxxxxxxx 11110zzz 10zzxxxx 10xxxxxx 10xxxxxx UTF-16 서로게이트 쌍 영역 (yyyy = zzzzz - 1). UTF-8로 표시된 비트 패턴은 실제 코드 포인트와 동일하다.


영어의 경우에는 u0000~u007F영역으로 ASCII와 동일한 값을 갖습니다. 1byte로 표시됩니다. 한글의 경우에는 u0800~uFFFF영역으로 표시되기 때문에 UTF-8에서는 3byte로 표시됩니다.
예를들어 '김' 이란 글자는 UTF-8에서는 EA B9 80으로 표시가 됩니다. 2진수로 변환하면
11101010 10111001 10000000 이렇게 표시됩니다.

아래 소스코드에서 살펴보면, MalformedInputException은 UTF-8형식에 안맞는 byte가 들어왔을때 발생하는 exception입니다.

한글의 경우에는 3byte인 경우만 살펴보면,
 
 if ((byte1 & 0x80) == 0){
outputChar[0] = (char)byte1;
outputSize = 1;
} else if ((byte1 & 0xe0) == 0xc0) {
if (byteOff >= inEnd) {
savedSize = 1;
savedBytes[0] = (byte)byte1;
break;
}
byte2 = input[byteOff++] & 0xff;
if ((byte2 & 0xc0) != 0x80) { ==>
badInputLength = 2;
byteOff += byteOffAdjustment;
throw new MalformedInputException();
}
outputChar[0] = (char)(((byte1 & 0x1f) << 6) | (byte2 & 0x3f));
outputSize = 1;
} else if ((byte1 & 0xf0) == 0xe0){ // 한글
if (byteOff + 1 >= inEnd) {
savedBytes[0] = (byte)byte1;
if (byteOff >= inEnd) {
savedSize = 1;
} else {
savedSize = 2;
savedBytes[1] = (byte)input[byteOff++];
}
break;
}
byte2 = input[byteOff++] & 0xff;
byte3 = input[byteOff++] & 0xff;
if ((byte2 & 0xc0) != 0x80 || (byte3 & 0xc0) != 0x80) {
badInputLength = 3;
byteOff += byteOffAdjustment;
throw new MalformedInputException();
}
outputChar[0] = (char)(((byte1 & 0x0f) << 12)
| ((byte2 & 0x3f) << 6)
| (byte3 & 0x3f));
outputSize = 1;

((byte2 & 0xc0) != 0x80 || (byte3 & 0xc0) != 0x80)  ==> byte2와 byte3가

으로 시작하지 않는 경우에 발생합니다.


첫 바이트가 110으로 시작했지만, 두번째나 세번째 바이트가 10으로 시작하지 않는

경우에 MalformedInputException이 발생합니다.


이 경우에는 input데이터가 이상이 없는지, 혹은 encoding이 잘못되진 않았는지 살펴봐야
하겠습니다.

*참조*
위키피디어 UTF-8
Modified UTF-8
소스: ByteToCharUTF8

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 지영아빠

findclass는 Linux나 Unix쪽에서 자바 개발할때 자주 사용하는 shell입니다.

2011-03-16: 

사용예는 다음과 같습니다.

- "findclass . String" 와 같이 사용하면 현재 폴더의 결과를 표시합니다.

[그림]java 경로에서 String을 찾은 결과



아래는 소스입니다.
#!/bin/sh
# by jenix

if [ $# -ne 2 ]
then
echo "Usage: findclass <target directory> <class name>"
exit
fi

targetDIR="$1"
targetCLASS="$2"
result=

filelist=`ls $targetDIR`

if [ $? -ne 0 ]
then
echo "invalid target directory - fullpath required"
exit
fi

cd $targetDIR

for file in $filelist
do
check=`echo $file | awk '/jar$/'`
if [ -n "$check" ]
then
echo "[searching in $file]"
class=`jar tf $file | grep $targetCLASS`
if [ -n "$class" ]
then
if [ -z "$result" ]
then
resultFS=""
fi
result="${result}${resultFS}${file} ${class}"
resultFS=":"
fi
fi
done

echo "\n*-- RESULT "

IFS=":"

for item in $result
do
echo "$item" | awk 'BEGIN{ FS=" " }{ print " " $1 ": " $2 }'
done


신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 지영아빠
다음과 같은 예외 메시지를 발생시킵니다. 소켓과 파일에서 이런 문제가 발생할 수 있습니다.

예외 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) 문제를 유발합니다. 아래에서 설명하는 방법으로 문제를 파악하여 해결할 수 있습니다.

Unix와 Linux에서는 스트림을 File로서 처리합니다. 이것은 OS에서 사용할 수 있는 파일디스크립터(fd)의 갯수를 지정하는데, 이것이 작을때 발생합니다.

우선, 엔진에 문제가 없는지 확인합니다. 파일(소켓)을 연 상태에서 닫은게 없는지 확인하고 이상이 없다면, 시스템의 fd의 설정을 확인합니다.

저희는 Unix와 Linux를 주로 사용하기에 이 경우에는 ulimit명령으로 간단히 확인할 수 있습니다. ulimit -a 하면 모든 설정이 나오게 됩니다.

 core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 48743
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 48743
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited


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 상수로 정의합니다.



*참고*
Too many open files - BEA

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 지영아빠
Brian Goetz가 쓴 이 글은 제가 C++의 제네릭과는 다른 와일드 카드에 대해서 친절히 다루고 있습니다.

Goetz는 알다시피 Java Concurrency in Practice 의 저자입니다.
이 책을 통해서 Concurrent Package의 개념에 대해서 접할 수 있었는데, 선에서 근무하고 있었나 봅니다.

자바 이론과 실습: 제네릭스 해부, Part 1와일드카드의 정의에 대해서 소개하고 있습니다. 제네릭 중 와일드 카드를 어떻게 써야 하고 이것의 문제점과 회피하는 방법에 대해서 친절히 설명해 줍니다.

와일드카드(타입 매개변수가 있을 자리를 대신 차지하는 웃기는 물음표)는 알려지지 않은 타입의 각도에서 타입 제약을 표현하는 수단입니다.

제네릭 클래스 ArrayList에서, ArrayList<?> 타입은 임의의 (참조) 타입 T에 대해 ArrayList<T>의 슈퍼타입(supertype)을 의미한다. 

또한, 타입추론에 대한 설명과 이를 편리하게 사용해줄 팩토리 메소드 패턴에 대해서도 설명하고 있습니다.

자바 제네릭스의 기능을 보다 잘 이해할 수 있었습니다.


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'관심분야 > 기타' 카테고리의 다른 글

[리뷰]자바 이론과 실습: 제네릭스 해부, Part 1  (0) 2008.10.21
실버라이트 2.0 RC버전 발표  (0) 2008.09.26
TOPCODER 문제:CaptureThemAll  (0) 2007.05.23
Silverlight관련글  (0) 2007.05.04
Posted by 지영아빠

티스토리 툴바