Generic Erasure

java core 2009. 2. 24. 03:19

jdk5 부터 지원되는 generic을 컴파일하고 ,jad로 역컴파일하면, generic 코드부분은 완젼 사라져 있다.

이것을 erasure 라고 한다.

자바가 erasure라는 것을 사용하는 것은 바로 java runtime 환경에 backwards compatibility  때문이다. generic이 생기전에 먼저 jvm이 생겼음을 생각해 보자.

 

이런 generic을 왜 지원하게 될까? 그것은 runtime때 일어나는 부주의한 실수조차 없게 하기 위함이다. 하지만, 이렇게 자주 사용하게 되면, 반발이 많이 일어날 수 있다. 불필요한 수준의 타입 명시로 인해서 개발비용은 늘어날 수도 있다.

 

아마도 이 만든 사람은 Static Typed language를 지원함으로서, classcasetexception이 일어나지 않도록 도와주려고 한거 같은데. 그 마음 누가 알랴?

 

 

 

참조

http://www.mindview.net/WebLog/log-0060

http://lastmind.net/blog/2007/01/effective-java-reloaded.html

 

 

'java core' 카테고리의 다른 글

exception시 어떻게 되는가?  (0) 2009.03.05
PermGen에서의 OutOfMemoryError 발생 대처하기  (0) 2009.02.25
Java Profiling API 공부 시작..  (0) 2009.02.20
아파치 세션이 계속 있다??  (0) 2009.02.20
jstack  (0) 2009.02.20
Posted by '김용환'
,

리눅스에서 메모리를 잡아먹고 싶은 녀석을 찾고 싶다면.. 어떻게 할 것인가??

 

바로. top 명령어를 이용하면 된다. % 까지 나온다.

sar -r 1 1000, free 명령어를 이용하여 캐쉬/버퍼 메모리를 확인한다.

 

하지만, 좀 더 구체적으로 알고 싶다면.

ps -auxf 를 사용한다.

 

RSS, VSZ를 확인한다.

VSZ : 현재 사용중인 가상메모리 또는 페이지.

RSS : 현재 사용중인 Real 메모리

 

그래도. 메모리가.. 계속 먼가가 잡고 있는데. 이상하다 싶으면. X를 확인하라.

리눅스 운영체제의 GUI는 50%는 잡느다.ㅡ.ㅡ;;

 

init[5]로 되어 있는지, /etc/inittab 의 initdefault가 5인지도 확인할껏..

 

개발자로 들어왔는데.. ....

개발 시간이 줄어들고 있다..

Posted by '김용환'
,

자바 프로파일링 api를 이용해서 자바에서 정보를 꺼집어오는 일을 할 것 같다..

흐흐~~ 공부 시작~

 

출처 : http://zeous.egloos.com/tag/java/page/1

 

3. ASM

3.1 정보를 수집&분석하는 Tool 이다.
3.2 BCI의 API 를 이용해서 가장 low 레벨로 컨트롤하는 방법임
3.3 HPRof가 모든 class에 대한 분석임에 반해 이 방법은 특정 클래스에 대한 action을 원하는 형태로 지정(코딩)할수 있다.
3.4 장단점
    - 특정 class에 대한 컨트롤이 가능하다(예, connection 연결이 몇번 호출되었는지 카운트가능)
    - 자유도가 높은 만큼 처음부터 코딩해야 한다.
3.5 참고자료
    - http://somnusong.tistory.com/275
    - http://asm.objectweb.org/index.html

 

 

출처

http://openframework.or.kr/Wiki.jsp?page=JvmtiNjvmpi

 

 

Java Profiling API

 

 

http://j2eearchitect.net/viewtopic.php?t=1322

Java Profiling API란 무엇인가?

보통 프로파일러라고 함은 애플리케이션의 문제를 진단하고 성능을 측정하기 위해서 사용하는 도구를 의미합니다.

자바에서는 Profiling API를 통해서 애플리케이션의 다양한 정보를 프로파일링할 수 있습니다.

그렇게 하기 위해서는 어떻게 해서든지 간에 JVM의 정보를 가지고 와야 합니다. 보통 JVM의 정보를 실시간으로 가져오기 위해서 자바에서 제공하는 특별한 API를 이용하여 JVM과 통신을 시도하고 콘솔은 원격 JVM과 통신을 통해서 프로파일링 정보를 가지고 오게 됩니다.

Java Profiling API란 프로파일러와 JVM 간의 통신을 수행하고 프로파일링 정보를 가져올 수 있게 하는 Sun에서 규정한 API입니다.

이러한 API는 JVMPI와 JVMTI가 있습니다. 실제로 비슷해 보이지만 동작하는 구조와 그 특성은 서로 상이합니다.

JVMPI for Java 1.3, 1.4

JVMPI(http://java.sun.com/j2se/1.5.0/docs/guide/jvmpi/index.html)는 원래 클래식 자바 가상 머신에서 잘 동작하도록 설계되어 있기 때문에 현대적인 JVM에서는 잘 어울리지 않습니다. 예를 들면 Java 1.4가 되겠습니다.

최신의 JVM은 바이트 코드를 동적으로 최적화 하는 기능이 들어 있는데 JVMPI는 성능 정보를 수집하기 위해서 이벤트를 이용합니다.

이 이벤트가 많은 문제를 발생시키는데 대표적으로 GC를 제대로 동작하지 못하게 하는 문제점입니다. 또 다른 문제는 JVMPI가 큰 크기의 힙 메모리를 제대로 프로파일링 하지 못한다는 점입니다.

Sun에서 JVMPI를 "실험적"이라고 밝히고 있기 때문에 JVMPI는 사실 완전한 표준이 되기 어렵다고 봅니다. 하지만 실제로 마치 표준처럼 사용하고 있습니다.

JVMPI는 Java 1.3, Java 1.4에서 사용가능한 프로파일링 인터페이스이기 때문에 Java 5에서는 호환성의 이유로 JVMPI를 지원합니다. 하지만 Java 6에서는 더이상 JVMPI를 지원하지 않습니다.

일반적으로 JVMPI를 구동하려면 JVM을 구동할 때 JVM 입력 인자로 -Xrun... 을 이용합니다. 예를 들면 JProfiler는 다음과 같은 인자를 이용합니다.

코드:

#java -Xrunjprofiler FooClass

-Xrun 인자는 JVMPI를 구동하라는 의미로써 "-Xrun"을 제외한 "jprofiler"에 대해서 JVMPI를 이용하여 JVM과 통신할 네이티브 코드 파일을 의미합니다.

즉, Windows에서는 jprofiler.dll, Linux에서는 jprofiler.so, HPUX에서는 jprofiler.sl을 로딩하려고 시도합니다.

새로운 JVMTI for Java 5 이상

JVMPI의 이벤트 기반 모델 대신, JVMTI(http://java.sun.com/j2se/1.5.0/docs/guide/jvmti/index.html)는 이른바 "bytecode instrumentation"이라는 방법을 사용합니다.

"bytecode instrumentation"이란 애플리케이션을 프로파일링 하기 위해서 프로파일링할 애플리케이션의 바이트 코드를 변경한다는 의미입니다.

즉, 모니터링 하고자 하는 바이트 코드의 정확한 위치에 프로파일링 코드를 추가함으로써 프로파일링을 수행합니다.

그러므로 이론적으로 이러한 접근은 더욱더 perspective하지만 Java 5에서 JVMTI의 구현은 여러 가지 문제가 있습니다(물론 이 문제는 Java 6에서 해결되었습니다).

-XX:+UseConcMarkSweepGC, -Xincgc 옵션을 이용한 parallel garbage collector을 지원하지 않는데 JVMPI 또한 이러한 제한이 있습니다.

그러므로 메모리 스냅샷을 생성했을 때 정확한 배열의 길이를 가져올 빠른 방법이 없습니다. 또한 여러 가지 성능 문제도 있습니다.

JVMTI는 JVMPI와 다르게 구동하는 JVM 입력 인자가 다릅니다. 예를 들어 YourKit Java Profiler의 경우 JVMTI를 활성화 시키기 위해서 다음과 같이 입력 인자를 사용해야 합니다.

코드:

#java -agentlib:yjpagent FooClass

Java 버전별 프로파일링 API 지원

* JVMPI : Java 1.3, Java 1.4 * JVMTI : Java 1.5 (강력 권장), Java 1.

 

'java core' 카테고리의 다른 글

PermGen에서의 OutOfMemoryError 발생 대처하기  (0) 2009.02.25
Generic Erasure  (0) 2009.02.24
아파치 세션이 계속 있다??  (0) 2009.02.20
jstack  (0) 2009.02.20
톰캣-이클립스 리모트 디버깅 하기  (0) 2009.02.19
Posted by '김용환'
,

아파치-톰캣 환경에서 아파치 세션을 확인해보다.

 

WGWWWWWWWWWWWWWWWWWWWWWww_,...................

 

 Sending Relpay "W"

 

 

 

sending Replay 객체가 엄청 많아졌다. 확인해보니.

하나는 deadlock, 또 하나는 wait 되는 녀석이었다.

 

jstat 으로 쓰레드 덤프해서 찾으면 된다..

 

1분당 한번씩, 3번 찍어서 파일 다운로드헤서 kdiff3로 비교해서 공통된 것이 나오면 가능하다.^^

 

그러면, 틀리지 않는 공통의 것이 나온다..

 

"TP-Processor76" daemon prio=10 tid=0x09724400 nid=0x584e sleeping[0x8451e000..0x84520120]

 

어디선가 wait되어 있거나 deadlock되어 있다면 빙고~~

게다가 jdk6에서는 kill -3 으로 하든 jstat -l로 덤프를 뜨든.. deadlock 상황을 잘 알려준다.

'java core' 카테고리의 다른 글

Generic Erasure  (0) 2009.02.24
Java Profiling API 공부 시작..  (0) 2009.02.20
jstack  (0) 2009.02.20
톰캣-이클립스 리모트 디버깅 하기  (0) 2009.02.19
multipool / 웹 미들웨어 조사  (0) 2009.02.06
Posted by '김용환'
,

홈페이지: http://kdiff3.sourceforge.net/

다운로드: http://sourceforge.net/project/showfiles.php?group_id=58666&package_id=54597&release_id=654466

 

kdiff라는 게 있는데. 디렉토리 비교, 또한 3개의 파일도 동시에 비교가 가능하다.

소스 변경 또는 쓰레드 덤프사이의 비교할 떄 큰 도움이 된다.

'etc tools' 카테고리의 다른 글

ACK 의 위력 (faster than grep)  (0) 2009.03.04
7zip과 bzip2의 비교  (0) 2009.03.02
James 메일 서버  (0) 2009.02.19
jad.bat JAD 디컴파일러 효율적으로 쓰기  (0) 2007.06.29
특수 문자 기호 이름  (0) 2007.06.04
Posted by '김용환'
,

 

jpda를 이용하여 리모트 디버깅이 가능하다. jpda라는 것을 이용하면 된다. 설명은 아래~

써머으니 좋더라~~

 

 

http://www.eaves.org/blog-archive/000246.html

 

Debugging with Tomcat and Eclipse using jpda

I've not had much need for debugging my servlets, but while I'm currently working on a legacy codebase, it's a great means of stepping through what is really happening.

I'm not a fan of the "run Tomcat in Eclipse", well, just because it feels ooky, and I'd rather run the two VM's separately so I can bounce them independently, and because I write such crap code, I'd rather not crash both of them at the same time.

The information on how to make Tomcat and Eclipse play nicely together is a bit sparse, so I've provided a nice little summary here. This is working with Tomcat 5.0.X, Eclipse 3.2, JDK 1.4.2_*

Step 1. Configure Tomcat
(This is for the Win32 build with the spiffy UI for starting/stopping)
a) Open up the configuration GUI ("Configure Tomcat")
b) Select the Java tab
c) Into the Java Options include (substituting the correct locations)
-Xdebug
-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n
-Dcatalina.home=c:\tomcat
-Djava.endorsed.dirs=c:\tomcat\common\endorsed
-Djava.io.tmpdir=c:\tomcat

NB: These are all on separate lines, with a <CR> at each EOL
d) Select the Startup tab
e) Into the Arguments section include:
jpda
start

NB: These are all on separate lines, with a <CR> at each EOL
f) Start and Stop Tomcat completely

2. Configure Eclipse (well, not much really to configure)
a) While in the Java perspective select Run/Debug...
b) Choose "Remote Java Application" from the tree (right click/New)

c) The defaults are all that is required.
d) Click "Debug" in the bottom corner to start it now, or Close for later

3. Debugging the Application
a) Select the servlet/code that requires examination
b) Create a breakpoint in the code
c) Click on the "Debug" (if not already debugging) (*)
d) Click on the Debug Perspective (optional)
-- this should show the Eclipse connected to Tomcat, and there should be a huge list Threads and the title of the Debug should be something like:
NameOfApplication [Remote Java Application]
Java HotSpot(TM) Server VM[localhost:8000]

e) Now just run the application as normal (via a browser or whatever)
f) Watch in amazement as Eclipse debugs the application at the breakpoint.

(*) If you get an error such as "Failed to connect to remote VM. Connection Refused". This normally means that Tomcat isn't started, _or_ there is already a debugging session started via jpda. Check Tomcat is running, and check the Debug perspective to make sure that it isn't running.

Posted by jon at May 10, 2006 10:16 AM
Posted by '김용환'
,

James 메일 서버

etc tools 2009. 2. 19. 16:21

메일 설정  DB로 변경 변경하기.

 

        <!--
      <inboxRepository>
         <repository destinationURL="file://var/mail/inboxes/" type="MAIL"/>
      </inboxRepository>
        -->

      <inboxRepository>
         <repository destinationURL="db://maildb/inbox/" type="MAIL"/>
      </inboxRepository>

 

      <data-source name="maildb" class="org.apache.james.util.dbcp.JdbcDataSource">
         <driver>com.mysql.jdbc.Driver</driver>
         <dburl>jdbc:mysql://insert-log.google.com/maildb?autoReconnect=true</dburl>
         <user>mail</user>
         <password>1111</password>
         <max>20</max>
      </data-source>

 

 

에러가 나면...

 

org.apache.avalon.phoenix.containerkit.lifecycle.LifecycleException: Component named "database-connections" failed to pass through the Starting stage. (Reason: java.lang.NoClassDefFoundError: org/aspectj/lang/Signature).
java.lang.NoClassDefFoundError: org/aspectj/lang/Signature

 

이런 에러 안나오게 하려면, mysql jar를 신경쓰면서 봐야 한다.

mysql의 bin-g 버젼 쓰지 않기
mysql의 2개이상 넣지 않기
mysql 안정적인 버젼 사용하기

 

 

 

Posted by '김용환'
,

No space left on device:
에러로그에 이렇게 남기면서 아파치 데몬이 뜨지 않는 않는 경우는 2가지 정도이다.

1. 정말 파일 시스템이 찬 경우.

df로 확인

2. 파일 시스템이 차지 않았다면.. 아파치 모듈과 연동하면서 resource leak(아마도 거의 세마포일듯)이라 생각하면 된다.

httpd 프로세스가 뜨지 않았는데...

ipcs -s | grep www

이걸로 보면, 세마포를 잡고 있는 것이 보인다..

 

다음의 명령으로 자원 릭을 다 제거한다..

ipcs -s | grep www | perl -e 'while (<STDIN>) { @a=split(/\s+/); print `ipcrm sem $a[1]`}'

 

 

Posted by '김용환'
,

Content-disposition 속성

web 2009. 2. 13. 19:50

Content-Disposition 은 컨텐트 타입의 옵션이기도 하며 실제로 지정된 파일명을 지정함으로써 더 자세한 파일의 속성을 알려줄 수 있다.

 

http://www.ietf.org/rfc/rfc2183.txt 스펙을 보면..


2.1  The Inline Disposition Type

   A bodypart should be marked `inline' if it is intended to be
   displayed automatically upon display of the message.  Inline
   bodyparts should be presented in the order in which they occur,
   subject to the normal semantics of multipart messages.

2.2  The Attachment Disposition Type

   Bodyparts can be designated `attachment' to indicate that they are
   separate from the main body of the mail message, and that their
   display should not be automatic, but contingent upon some further
   action of the user.  The MUA might instead present the user of a
   bitmap terminal with an iconic representation of the attachments, or,
   on character terminals, with a list of attachments from which the
   user could select for viewing or storage.

 

이렇게 정의되어 있다.

 


즉  "Content-disposition: inline"은

브라우저 인식 파일확장자를 가진 파일들에 대해서는 웹브라우저 상에서 바로 파일을 자동으로 보여줄 수 있어서 의미상인 멀티파트 메시지를 표현하는데 있다. 그외의 파일들에 대해서는 "파일 다운로드" 대화상자가 뜨도록 하는 헤더속성이다.

"Content-disposition: attachment"은
브라우저 인식 파일확장자를 포함하여 모든 확장자의 파일들에 대해,  다운로드시 무조건 "파일 다운로드" 대화상자가 뜨도록 하는 헤더속성이라 할 수 있다.

 

스펙에 보면. 다음과 같은 BNF 는 이렇게 정의되어 있다.

 

     disposition := "Content-Disposition" ":"
                    disposition-type
                    *(";" disposition-parm)

     disposition-type := "inline"
                       / "attachment"
                       / extension-token
                       ; values are not case-sensitive

     disposition-parm := filename-parm
                       / creation-date-parm
                       / modification-date-parm
                       / read-date-parm
                       / size-parm
                       / parameter

     filename-parm := "filename" "=" value

     creation-date-parm := "creation-date" "=" quoted-date-time

     modification-date-parm := "modification-date" "=" quoted-date-time

     read-date-parm := "read-date" "=" quoted-date-time

     size-parm := "size" "=" 1*DIGIT

     quoted-date-time := quoted-string
                      ; contents MUST be an RFC 822 `date-time'
                      ; numeric timezones (+HHMM or -HHMM) MUST be used

 

 

 

샘플 예제는 다음과 같다. 게시판에서 자주 쓸 수 있다.

게시판 서버에서 html, htm, jsp은 보여주고 나머지는 attachment로 알려주는 것이다. 

    <Location  / >
        Header set Content-Disposition "attachment"
    </Location>

    <Location ~ "/.*(html|htm|jsp|)" >
        Header unset Content-Disposition
    </Location>

만약  swf 파일도 그냥 보여주고 싶다면, attachment 속성 대신 inline을 쓰면 되겠다.

Posted by '김용환'
,

dbcp가 자주 끊길 때..

web 2009. 2. 11. 05:26

 

 

validationQuery는 커넥션이 살아 있는지 체크, 보통  오라클은 "select 1 from dual", MySQL은 "select 1" 로 사용한다. 

testWhileIdle은 커넥션에 아무런 데이터 송수신이 없는 긴 시간에가 (while ide) 체크를 하지는 한다. 


 timeBetweenEvictionRunsMillis는 커넥션이 쉬고 있을 때, (사실은 강제 철거중에) 커넥션 체크 쿼리를 실행하는 시간 간격을 지정한다. 1분정도 주면 좋을 듯.

Posted by '김용환'
,