hs_err_pid 파일을 열어보면 


# A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc=0xff380700, pid=583, tid=3156104 # # JRE version: 6.0_16-b01 # Java VM: Java HotSpot(TM) Server VM (14.2-b01 mixed mode solaris-sparc ) # Problematic frame: # C [libc_psr.so.1+0x700] memcpy+0x2f8 ... --------------- T H R E A D --------------- Current thread (0x00746400): JavaThread "p: default-threadpool; w: Idle" daemon [_thread_in_native, id=3156104, stack(0xb0c00000,0xb0c80000)] siginfo:si_signo=SIGSEGV: si_errno=0, si_code=1 (SEGV_MAPERR), si_addr=0xfe0cc000 Registers: O0=0xfe0cbfc0 O1=0x00000000 O2=0xc3230063 O3=0x6f727465 O4=0x6d612f67 O5=0x70726f63 O6=0xb0c7c890 O7=0xfe202378 G1=0x00054000 G2=0x00c4f5d0 G3=0x00000000 G4=0xff140000 G5=0x03785238 G6=0x00000000 G7=0xb7314200 Y=0x00000000 PC=0xff380700 nPC=0xff380704 Top of Stack: (sp=0xb0c7c890) 0xb0c7c890: fe0c77d2 00000008 00000065 00007200 0xb0c7c8a0: 00000072 96898d9b ffffffff 00000000 0xb0c7c8b0: 03789a00 fe0cbfc0 0000002c 00001d80 0xb0c7c8c0: ff3303a8 00000000 b0c7c8f0 fe20d194 0xb0c7c8d0: 00c4f5e4 00000000 00000001 00000000 0xb0c7c8e0: 00000000 00000000 00000001 00c4f608 0xb0c7c8f0: fe0c77d2 00000076 00000065 00007200 0xb0c7c900: 00000072 96898d9b ffffffff 00000000 Instructions: (pc=0xff380700) 0xff3806f0: d8 5e 60 30 da 5e 60 38 d6 f6 20 20 d8 f6 20 28 0xff380700: d4 5e 60 40 d6 5e 60 48 da f6 20 30 d4 f6 20 38 Stack: [0xb0c00000,0xb0c80000], sp=0xb0c7c890, free space=498k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) C [libc_psr.so.1+0x700] memcpy+0x2f8 C [libzip.so+0xd19c] C [libzip.so+0x2380] ZIP_GetEntry+0xe4 C [libzip.so+0x2800] Java_java_util_zip_ZipFile_getEntry+0xc4 j java.util.zip.ZipFile.getEntry(JLjava/lang/String;Z)J+0 j java.util.zip.ZipFile.getEntry(JLjava/lang/String;Z)J+0 j java.util.zip.ZipFile.getEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;+31 j java.util.jar.JarFile.getEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;+2 j java.util.jar.JarFile.getJarEntry(Ljava/lang/String;)Ljava/util/jar/JarEntry;+2 ... 위와 비슷한 내용이 보인다면


원인

JVM 충돌


해결하기

가장 흔한 이유는 아래 2가지가 있습니다.

1. 기기의 SWAP 공간이 부족

2. JVM에서 해당 JAR 파일이 사용중일때 JAR 파일이 수정되거나 덮어쓰여졌을 경우, JAR 파일이 손상됐다고 판단.


1번의 이슈같은 경우는 논외로 하겠습니다.


2번의 이슈가 거의 대부분인데 이유는 아래와 같습니다.

JVM은 성능향상을 목적으로 JAR 파일의 central directory structure(mmap를 사용하여)를 캐싱합니다. 

central directory는 JAR파일의 내용(엔트리 주소, 사이즈같은)을 담고있는데 그것을 캐싱한다는 것은 매번 JAR파일의 엔트리를 사용할때마다 디스크 에서 읽는것을 없애줍니다.  


그런데 만일 JAR파일이 수정되었다면 JAM의 central directory는 더이상 정확한 정보를 가지지 못하게되고 결과적으로 수정된 JAR파일에서 엔트리를 로딩하려 할때 SIGBUS나 SIGSEGV를  발행하게됩니다.


참고 : 1.6.0_23 부터 ZIP/JAR 파일에 대하여 메모리 매핑을 사용하지않는 명령행 옵션이 추가되었습니다.


-Dsun.zip.disableMemoryMapping=true


상기 옵션을 사용하게 되면 성능에 영향을 끼치게되는데 이유는 VM이 매번 JAR의 엔트리를 사용할때마다 추가적인 디스크 IO가 발생되기때문입니다(central directory structrure 를 알아내기 위하여).


가급적 새롭게 JAR파일을 배포하게되면 해당 JAR파일을 사용하여 실행되고 있는 프로세스를 재시작하는것을 추천합니다.


참고

http://www-01.ibm.com/support/docview.wss?uid=swg21625858

http://bugs.sun.com/view_bug.do?bug_id=7129299  

Posted by 빨강토끼
,

eclipse 가 아닌 다른방식으로 컴파일을 했을때 아래와 같은 warring message 를 볼수있습니다.


sun.misc.BASE64Incoder is Sun proprietary API and may be removed in a future release

sun.misc.BASE64Decoder is Sun proprietary API and may be removed in a future release


http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html


이 이야기는 간단히 이야기해서 sun.* 패키지의 클래스들은 사용하지 말고 다른것으로 바꾸라는 경고입니다.


대체할만 한것으로는


http://www.source-code.biz/base64coder/java/


http://huikyun.tistory.com/234


http://devday.tistory.com/2027


고맙습니다.

Posted by 빨강토끼
,

http://hckim.tistory.com/108


http://tinywolf.tistory.com/103


http://omen666.tistory.com/40


http://fly32.tistory.com/438


http://ssiso.net/cafe/club/club1/board1/content.php?board_code=javaStudy|javaTuning&idx=7401&club=javaStudy&cp=1&cb=1&search=&search_word=


http://donzbox.tistory.com/150



Posted by 빨강토끼
,

http://blog.kangwoo.kr/58


http://javacan.tistory.com/124


http://namoda.springnote.com/pages/568469


http://xrath.com/javase/ko/6/docs/ko/api/java/util/concurrent/Executors.html


http://blog.naver.com/PostView.nhn?blogId=minis24&logNo=80152375114


http://blog.naver.com/PostView.nhn?blogId=seban21&logNo=70111658316&categoryNo=12&viewDate=&currentPage=1&listtype=0


http://ismydream.tistory.com/46 (어렵다, 책을 사서 봐야겠다)


JVM은 모든 스레드가 종료되기 전에는 종료되지 않고 대기하기 때문에 Executor를 제대로 종료시키지 않으면 JVM 자체가 종료되지 않고 대기하기도 합니다.

Posted by 빨강토끼
,

RSA 암호화를 사용하게 되었습니다.

앞글에서 언급했드시 seed, des , 등 이것저것 다 사용하는군요.ㅎㅎㅎ


지금까지 그랬드시

"이론, 배경지식, 그런거 벌써 검색을 통해 다 이해했으니

(혹은 개발시간도 별로 없고 바쁘니깐 그냥 소스를 알려달라!)"


하시는 분을위해 기본 소스를 먼저 공개하겠습니다.


import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;
import javax.crypto.Cipher;
public class TestRsa
{
 public static void main( String [] args )
 {
  try
  {
   // RSA 공개키/개인키를 생성한다.
   KeyPairGenerator clsKeyPairGenerator = KeyPairGenerator.getInstance("RSA");
   clsKeyPairGenerator.initialize(2048);
  
   KeyPair clsKeyPair = clsKeyPairGenerator.genKeyPair();
   Key clsPublicKey = clsKeyPair.getPublic();
   Key clsPrivateKey = clsKeyPair.getPrivate();
   KeyFactory fact = KeyFactory.getInstance("RSA");
   RSAPublicKeySpec clsPublicKeySpec = fact.getKeySpec( clsPublicKey, RSAPublicKeySpec.class);
   RSAPrivateKeySpec clsPrivateKeySpec = fact.getKeySpec( clsPrivateKey, RSAPrivateKeySpec.class);
   System.out.println( "public key modulus(" + clsPublicKeySpec.getModulus( ) + ") exponent(" + clsPublicKeySpec.getPublicExponent( ) + ")" );
   System.out.println( "private key modulus(" + clsPrivateKeySpec.getModulus( ) + ") exponent(" + clsPrivateKeySpec.getPrivateExponent( ) + ")" );
  
   // 암호화 한다.
   String strPinNumber = "1234567890";
  
   Cipher clsCipher = Cipher.getInstance("RSA");
   clsCipher.init( Cipher.ENCRYPT_MODE, clsPublicKey );
    byte[] arrCipherData = clsCipher.doFinal( strPinNumber.getBytes( ) );
    String strCipher = new String( arrCipherData );
    System.out.println( "cipher(" + strCipher + ")" );
   
    // 복호화 한다.
    clsCipher.init( Cipher.DECRYPT_MODE, clsPrivateKey );
    byte[] arrData = clsCipher.doFinal( arrCipherData );
   
    String strResult = new String( arrData );
    System.out.println( "result(" + strResult + ")" );
  }
  catch( Exception e )
  {
  
  }
 }
}


위와 같습니다.

그런데 문제는 실제 필드에서는 이렇게 사용하지 않죠.ㅎㅎㅎ

이유는 서버와 클라이언트간에 통신을 하는데

위의 소스는 그냥 로컬에서 스스로 인코딩하고 디코딩하는 로직입니다.

당연히 서버와 클라이언트간에 키공유 이슈는 빠져있습니다.


"그래 그래 당연하지 . 그러니깐 긴말하지 말고 당장 소스를 내놔라! 바빠죽겠다."


머 패킷통신으로 주거니 받거니 하는건 설명하지 않겠습니다.

결국 cipher 로 암호화하기 위해서는 publicKey 가 필요한데 파일에 저정되어있던 디비에 저장되어있던 하던 아니면 통신으로 받던 바이트배열형식으로 암호화기가 되어있다면 이것을 publiKey로 바꿔야합니다.

그래야 init을 하니깐요. private 도 마찮가기겠지요.


publicKey를 만드는 방법은


KeyFactory fac = KeyFactory.getInstance("RSA");
X509EncodedKeySpec x509Spec = new X509EncodedKeySpec(key); // key 가 바로 byte 배열
PublicKey publicKey = fac.generatePublic(x509Spec);


privateKey를 만드는 방법은


KeyFactory fac = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(key);
PrivateKey privateKey = fac.generatePrivate(keySpec);


이상입니다. 끝!

Posted by 빨강토끼
,

매번 eclipse 에서 만 junit 을 사용했었는데

console 에서 junit를 사용해야 되는 상황이 있습니다.

(예를 들어 리눅스에서 테스트하기 위해)


일단 도스에서 하는 방법은


junit.jar 파일을 bin 폴더에 복사한후


set  CLASSPATH=.;junit.jar

라고해서 클래스패스를 지정후에


만일 junit 버전이 3.x 라면

> java junit.textui.TestRunner 클래스명


만일 junit 버전이 4.x 라면

> java org.junit.runner.JUnitCore 클래스명



Posted by 빨강토끼
,

여러가지 문제.(죄송합니다....)로 런타임시 아래과 같은 에러메시지가 뜰수있습니다.


java.security.NoSuchAlgorithmException: Cannot find any provider supporting DES/CBC/PKCS5Padding

at javax.crypto.Cipher.getInstance(DashoA12275)
at com.cyberpass.crypto.DES.setKey(DES.java:20)

이럴때는 JCE를 새로받아서 설치하면 되는데

주소는 http://java.sun.com/products/jce/ 에서 들어가면 자세한 내용과 다운받을수있는 페이지를 확인할수 있습니다.


참고로 jdk 1.6 이상인 경우엔 

http://www.oracle.com/technetwork/java/javase/downloads/index.html 맨 아래쪽에 다운로드 링크가 있고


jdk 1.5 이하인경우에는

http://www.oracle.com/us/technologies/java/jce-140292.html 여기서 다운 받으면 되실듯....


jce를 받아서 jre/lib/ext 에 복사합니다.


Posted by 빨강토끼
,
일주일간 스프링교육을 받았습니다.
교육시 배운내용을 정리하고 나름의 생각을 추가해보았습니다.
메뉴얼보다는 개인적으로 메모 및 참조용이라서 설명이 그다지 친절하지는 않고
심플합니다. 이해해주세요.^^

먼저
jdk 1.6 버전을 다운받습니다.
http://oracle.com
1.7 버전도 있는데 1.6이 안정적이라고 하더군요.

maven 을 가장 최신버전으로 다운받습니다.
http://maven.apache.org

tomcat 6.0버전을 다운받습니다.
http://tomcat.apache.org
7.0 버전도 있는데 jdk 1.6과 호환이 6.0과 잘되고 안정적이라고 하더군요.

이클립스를 다운받습니다.
http://eclipse.org

jdk 를 설치하고 환경설정에 반영합니다.
JAVA_HOME
커맨드라인에서 javac 를 실행해본다.

mavan을 적당한 폴더에 압축을 풀고 환경설정에 반영합니다.
M2_HOME
커맨드라인에서 mvn -version을 실행해본다.

tomcat을 적당한 폴더에 압출을 풀고 환경설정에 반영합니다.
CATALINA_HOME
커맨드라인에서 startup 을 실행해본다.

mavan 사이트에서 eclipse 용 ide 로 q2e 를 다운받습니다.
m2e를 사용하여 교육할줄 알았는데 강사님이 q2e가 더편하고 좋다고 하더라구요.
회사에서도 그렇고 인터넷에서도 그렇고 m2e를 더많이 사용하는것 같던데....
직접다운로드를 받아서 설치하는것이 아니고 eclipse에서 인스톨하는 방식입니다.
Enabling Features 를 뺀 Addition Integrations, Core features, Tooling 을 설치합니다.

spring 사이트에서 eclipse 용 ide 를 다운받습니다.
springsource.org에서 springide를 검색
직접다운로드를 받아서 설치하는것이 아니고 eclipse에서 인스톨하는 방식입니다.
Core / Spring IDE , Extensions(incubation) / Spring IDE , Extensions / Spring IDE 를 설치 합니다.

eclipse 사이트에서 AspectJ develop tool 을 다운받습니다.
http://www.eclipse.org/ajdt
직접다운로드를 받아서 설치하는것이 아니고 eclipse에서 인스톨하는 방식입니다.
AspectJ develop Tools (Requird) 를 설치합니다.

springsource tool suite(sts)는 교육과정중에 설치하지는 않았습니다.
아무래도 m2e 나 sts 는 개인적으로 공부를 해야될것 같습니다.
Posted by 빨강토끼
,
자바를 잘몰라 배우고 있는데 C/C++ 처럼 seek 을 이용하여 임의의 파일포인터위치부터 읽기가 가능한 함수를 찾았습니다.

RandomAccessFile() 입니다.
InputStream이나 OutputStream의 서브 클래스는 아니지만 파일의 읽기, 쓰기를 위한 독립적인 메소드를 제공합니다.
아래는 간단한 예제입니다.




내용은 간단합니다. 텍스트형식의 파일을 읽고 10줄까지 화면에 뿌린후 읽은곳 까지의 포인터위치를 저장후
파일을 닫고 다시 연후 좀전에 저장한 포인터 위치부터 읽어서 화면에 뿌리는 형식입니다.


참조
http://docs.oracle.com/javase/1.4.2/docs/api/java/io/RandomAccessFile.html
Posted by 빨강토끼
,
http://www.squirrelsql.org/#installation 다운

cdm창
설치폴더 가서
java -jar 파일명****install.jar

에궁....

Posted by 빨강토끼
,