반응형

3. package와 import

   

3.1 패키지(package)


패키지란, 클래스의 묶음이다. 패키지에는 클래스 또는 인터페이스를 포함 시킬 수 있으며, 서로 관련된 클래스들끼리 그룹 단위로 나누어 놓음으로써 클래스를 효율적으로 관리할 수 있다.
또한 같은 이름의 클래스 일지라도 서로 다른 패키지에 존재하는 것이 가능하므로, 자신만의 패키지 체계를 유지함으로써 다른 개발자가 개발한 클래스 라이브러리의 클래스와 이름이 충돌하는 것을 피할 수 있다.
지금까지는 단순히 클래스명으로만 클래스를 구분 했지만 클래스의 실제 이름(full name)은 패키지명을 포함한 것이다. 예를 들면, String클래스의 패키지명을 포함한 이름은 java.lang.String이다. 즉, java.lang패키지에 속한 String클래스라는 의미이다. 그래서 같은 이름의 클래스일 지라도 서로 다른 패키지에 속하면 패키지명으로 구별이 가능하다.
클래스가 물리적으로 하나의 클래스파일(.class)인 것과 같이 패키지는 물리적으로 하나의 디렉토리이다. 그래서 어떤 패키지에 속한 클래스는 해당 디렉토리에 존재하는 클래스파일(.class)이어야 한다.

예를 들어, java.lang.String클래스는 물리적으로 디렉토리 java의 서브디렉토리인 lang에 속한 String.class파일이다. 그리고 우리가 자주 사용하는 System클래스 역시 java.lang패키지에 속하므로 lang디렉토리에 포함되어 있다.







String클래스는 rt.jar파일에 압축되어 있으며 아래의 그림은 압축을 풀기 전과 후의 그림이다. 클래스와 관련 파일들을 압축한 것이 jar파일(*.jar)이며, jar파일은 jar.exe이외에 알집이나 winzip으로 압축을 풀 수 있다.



디렉토리가 하위디렉토리를 가질 수 있는 것처럼, 패키지도 다른 패키지를 포함할 수 있으며 점(.)으로 구분한다. 예를 들면 java.lang패키지에서 lang패키지는 java패키지의 하위패키지이다.


- 하나의 소스파일에는 첫 번째 문장으로 단 한번의 패키지 선언을 허용한다.
- 모든 클래스는 반드시 하나의 패키지에 속해야한다.
- 패키지는 점(.)을 구분자로 하여 계층구조로 구성할 수 있다.
- 패키지는 물리적으로 클래스 파일(.class)을 포함하는 하나의 디렉토리이다.





3.2 패키지의 선언

패키지를 선언하는 것은 아주 간단하다. 클래스나 인터페이스의 소스파일(.java)에서 다음과 같이 한 줄만 적어주면 된다.


package 패키지명;



위와 같은 패키지 선언문은 반드시 소스파일에서 주석과 공백을 제외한 첫 번째 문장이어야 하며, 하나의 소스파일에 단 한번만 선언될 수 있다. 해당 소스파일에 포함된 모든 클래스나 인터페이스는 선언된 패키지에 속하게 된다.
패키지명은 대소문자를 모두 허용하지만, 클래스명과 쉽게 구분하기 하기위해서 소문자로 하는 것을 원칙으로 하고 있다.

모든 클래스는 반드시 하나의 패키지에 포함되어야 한다고 했다. 그럼에도 불구하고 지금까지 소스파일을 작성할 때 패키지를 선언하지 않고도 아무런 문제가 없었던 이유는 자바에서 기본적으로 제공하는 '이름없는 패키지(unnamed package)' 때문이다.

소스파일에 자신이 속할 패키지를 지정하지 않은 클래스는 자동적으로 '이름 없는 패키지'에 속하게 된다. 결국 패키지를 지정하지 않는 모든 클래스들은 같은 패키지에 속하는 셈이 된다.
간단한 프로그램이나 애플릿은 패키지를 지정하지 않아도 별 문제 없지만, 큰 프로젝트나 Java API와 같은 클래스 라이브러리를 작성하는 경우에는 미리 패키지를 구성하여 적용하도록 한다.

[예제7-9] PackageTest.java

package com.javachobo.book;

class PackageTest
{
      public static void main(String[] args)
      {
            System.out.println("Hello World!");
      }
}

위의 예제를 작성한 뒤 다음과 같이 '-d' 옵션을 추가하여 컴파일을 한다.


C:\j2sdk1.4.1\work>javac -d . PackageTest.java


'-d'옵션은 소스파일에 지정된 경로를 통해 패키지의 위치를 찾아서 클래스파일을 생성한다. 만일 지정된 패키지와 일치하는 디렉토리가 존재하지 않는다면 자동적으로 생성한다.
'-d'옵션 뒤에는 해당 패키지의 루트(root)디렉토리의 경로를 적어준다. 여기서는 현재디렉토리(.) 즉, 'C:\j2sdk1.4.1\work' 로 지정했기 때문에 컴파일을 수행하고 나면 다음과 같은 구조로 디렉토리가 생성된다.



기존에 디렉토리가 존재하지 않았으므로 컴파일러가 패키지의 계층구조에 맞게 새로 디렉토리를 생성하고 컴파일된 클래스파일(PackageTest.class)를 book디렉토리에 놓았다.

[참고] 만일 '-d'옵션을 사용하지 않으면, 프로그래머가 직접 패키지의 계층구조에 맞게 디렉토리를 생성해야한다.

이제는 패키지의 루트 디렉토리를 클래스패스(classpath)에 포함시켜야 한다. com.javachobo.book패키지의 루트 디렉토리는 디렉토리 'com'의 상위 디렉토리인 'C:\j2sdk1.4.1\work'이다. 이 디렉토리를 클래스패스에 포함시켜야만 실행 시 JVM이 PackageTest클래스를 찾을 수 있다.
[참고]클래스패스는 컴파일러(javac.exe)나 JVM 등이 클래스의 위치를 찾는데 사용되는 경로이다.

Windows 98이하에서는 autoexec.bat파일에 다음과 같은 명령을 한 줄 추가하면 된다.


SET CLASSPATH=.;C:\j2sdk1.4.1\work;


Windows 2000에서는 '시스템등록정보-고급-환경변수-새로만들기'를 통해 아래의 그림과 같이 설정해 준다.



';'를 구분자로 하여 여러 개의 경로를 클래스패스에 지정할 수 있으며, 맨 앞에 '.;'를 추가한 이유는 현재 디렉토리(.)를 클래스패스에 포함시키기 위해서이다.
클래스패스를 지정해 주지 않으면 기본적으로 현재 디렉토리(.)가 클래스패스로 지정되지만, 이처럼 클래스패스를 따로 지정해주는 경우에는 더 이상 현재 디렉토리가 자동적으로 클래스패스로 지정되지 않기 때문에 이처럼 별도로 추가를 해주어야 한다.
jar파일을 클래스패스에 추가하기 위해서는 경로와 파일명을 적어주어야 한다. 예를 들어 C:\j2sdk1.4.1\work\util.jar파일을 클래스패스에 포함시키려면 다음과 같이 한다.

SET CLASSPATH=.;C:\j2sdk1.4.1\work;C:\j2sdk1.4.1\work\util.jar;

이제 클래스패스가 바르게 설정되었는지 확인하기 위해 다음과 같은 명령어를 입력해보자.


C:\WINDOWS>echo %classpath%
.;C:\j2sdk1.4.1\work;


현재 디렉토리를 의미하는 '.'와 'C:\j2sdk1.4.1\work'가 클래스패스로 잘 지정되었음을 알 수 있다. 자, 이제 PackageTest예제를 실행시켜보자.

[실행결과]
C:\WINDOWS>java com.javachobo.book.PackageTest
Hello World!

실행 시에는 이와 같이 PackageTest클래스의 패키지명을 모두 적어주어야 한다.

J2SDK에 기본적으로 설정되어 있는 클래스패스를 이용하면 위의 예제에서와 같이 클래스패스를 따로 설정하지 않아도 된다. 새로 추가하고자 하는 클래스를 'J2SDK설치디렉토리\jre\classes'디렉토리에, jar파일인 경우에는 'J2SDK설치디렉토리\jre\lib\ext'디렉토리에 넣기만 하면 된다.

[참고] jre디렉토리 아래의 classes디렉토리는 J2SDK설치 시에 자동으로 생성되지 않으므로 사용자가 직접 생성해야한다.

또는 실행 시에 '-cp'옵션을 이용해서 일시적으로 클래스패스를 지정해 줄 수도 있다.

C:\WINDOWS>java -cp c:\j2sdk1.4.1\work com.javachobo.book.PackageTest



3.3 import문

소스코드를 작성할 때 다른 패키지의 클래스를 사용할 때는 패키지명이 포함된 이름을 사용해야한다. 하지만, 매번 패키지명을 붙여서 작성하기란 여간 불편한 일이 아닐 것이다.
클래스의 코드를 작성하기 전에 import문으로 사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에 사용되는 클래스이름에서 패키지명은 생략할 수 있다.

import문의 역할은 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공하는 것이다. 컴파일 시에 컴파일러는 import문을 통해 소스파일에 사용된 클래스들의 패키지를 알아 낸 다음, 모든 클래스이름 앞에 패키지명을 붙여 준다.

[참고] import문은 프로그램의 성능에 전혀 영향을 미치지 않는다. import문을 많이 사용하면 컴파일 시간이 아주 조금 더 걸릴 뿐이다.



3.4 import문의 선언

모든 소스파일(.java)에서 import문은 package문 다음에, 그리고 클래스 선언 문 이전에 위치해야한다. 그리고 import문은 package문과는 달리 한 소스파일에 여러 번 선언할 수 있다.


일반적인 소스파일의 구성은 'package문-import문-클래스선언'의 순서로 되어 있다.


import문을 선언하는 방법은 다음과 같다.


import 패키지명.클래스명;
또는
import 패키지명.*;


키워드import와 패키지명을 생략하고자 하는 클래스의 이름을 패키지명과 함께 써주면 된다. 같은 패키지에서 여러 개의 클래스가 사용될 때, import문을 여러 번 사용하는 대신 '패키지명.*'을 이용해서 지정된 패키지에 속하는 모든 클래스를 패키지명 없이 사용할 수 있다.
[참고] 클래스이름을 지정해주는 대신 '*'을 사용하면, 컴파일러는 해당 패키지에서 일치하는 클래스이름을 찾아야 하는 수고를 더 해야 할 것이다. 단지 그 뿐이다. 다른 차이는 없다.


import java.util.Calendar;
import java.util.Date;
import java.util.ArrayList;


이처럼 import문을 여러 번 사용하는 대신


import java.util.*;


위와 같이 한 문장으로 처리할 수 있다. 한 패키지에서 여러 클래스를 사용하는 경우 클래스의 이름을 일일이 지정해주는 것보다 '패키지명.*'과 같이 하는 것이 편리하다.

하지만, import하는 패키지의 수가 많을 때는 어느 클래스가 어느 패키지에 속하는지 구별하기 어렵다는 단점이 있다.
한가지 더 알아두어야 할 것은 import문에서 클래스의 이름 대신 '*'을 사용하는 것이 하위 패키지의 클래스까지 포함하는 것은 아니라는 것이다.


import java.util.*;
import java.text.*;


그래서, 위의 두 문장 대신 다음과 같이 할 수는 없다.


import java.*;


[예제7-10] ImportTest.java

import java.text.SimpleDateFormat;
import java.util.Date;

class ImportTest
{
      public static void main(String[] args)
      {
            Date today = new Date();
           
            SimpleDateFormat date = new SimpleDateFormat("yyyy/MM/dd");
            SimpleDateFormat time = new SimpleDateFormat("hh:mm:ss a");

            System.out.println("오늘 날짜는 " + date.format(today));
            System.out.println("현재 시간은 " + time.format(today));
      }
}
[실행결과]
오늘 날짜는 2003/01/07
현재 시간은 01:59:53 오후

현재 날짜와 시간을 지정된 형식에 맞춰 출력하는 예제이다. SimpleDateFormat과 Date클래스는 다른 패키지에 속한 클래스이므로 import문으로 어느 패키지에 속하는 클래스인지 명시해 주었다. 그래서 소스에서 클래스이름 앞에 패키지명을 생략할 수 있었다.
만일 import문을 지정하지 않았다면 다음과 같이 클래스이름에 패키지명도 적어줘야 했을 것이다.


java.util.Date today = new java.util.Date();
           
java.text.SimpleDateFormat date = new java.text.SimpleDateFormat("yyyy/MM/dd");
java.text.SimpleDateFormat time = new java.text.SimpleDateFormat("hh:mm:ss a");


import문으로 패키지를 지정하지 않으면 위와 같이 '이름없는 패키지'에 속한 클래스를 제외한 모든 클래스이름 앞에 패키지명을 반드시 붙여야 한다.
지금까지 System과 String 같은 java.lang패키지의 클래스들을 패키지명 없이 사용할 수 있었던 이유는 모든 소스파일에는 묵시적으로 다음과 같은 import문이 선언되어 있기 때문이다.


import java.lang.*;


java.lang패키지에는 매우 빈번히 사용되는 중요한 클래스들이 속한 패키지이기 때문에 따로 import문으로 지정하지 않아도 되도록 한 것이다.

 

출처 : http://kin.naver.com/open100/db_detail.php?d1id=1&dir_id=10106&eid=PRkOvR1lMBu/xAgOgb4ka1KrOj9CeukU

반응형
반응형


마이크로 소프트 사가 제공하는

 

악성코드 제거 프로그램 실행하기 ~

 

시작 -> 실행 -> MRT

 

아래는 실행 모습~

 
















반응형
반응형

시작 → 실행(R) → 열기(O) - " cmd /k ipconfig" 를 입력 여기서 /k는 쉘을 종료하지 않도록하는 명령행 옵션이다.

이렇게 쓰기 싫으면 그냥 cmd 치고 창 열어 놓고 하면 된다

Win95, 98은 cmd 가 아니고 command다


" Window ip Configuration "


그중에.. ip Address를 보면.. 지금 내 pc의 ip dhcp는 랜카드의 주소지만, Adsl등은 전화 접속 어댑터의 주소임 헷갈리지 말것


IP 해제는 " ipconfig/release 그럼 전부 다 0.0.0.0 으로 나옴

이러면 당연히 Internet이 않되고, 새로 Ip를 받을려면 " ipconfig/renew "

더 자세한 ip 정보는 " ipconfig -all "


그리고 죽어도 Command Mode는 싫다는 사람은 바탕화면에 있는 네트웍 환경에서도 할수있다


1. ipconfig

자신의 IP주소를 나타내주고 gateway,subnet mask까지
더 자세한 내용을 알고싶으시면 -all 옵션


[ 속성 ]

Error: unrecongnized or incomplete command line.

USAGE:
    ipconfig [/? | /all | /renew [adapter] | /release [adapter] |
              /flushdns | /displaydns | /registerdns |
              /showclassid adapter |
              /setclassid adapter [classid] ]

where
    adapter         Connection name
                   (wildcard characters * and ? allowed, see examples)

    Options:
       /?           Display this help message
       /all         Display full configuration information.
       /release     Release the IP address for the specified adapter.
       /renew       Renew the IP address for the specified adapter.
       /flushdns    Purges the DNS Resolver cache.
       /registerdns Refreshes all DHCP leases and re-registers DNS names
       /displaydns  Display the contents of the DNS Resolver Cache.
       /showclassid Displays all the dhcp class IDs allowed for adapter.
       /setclassid  Modifies the dhcp class id.


The default is to display only the IP address, subnet mask and
default gateway for each adapter bound to TCP/IP.


For Release and Renew, if no adapter name is specified, then the IP address leases for all adapters bound to TCP/IP will be released or renewed.


For Setclassid, if no ClassId is specified, then the ClassId is removed.


Examples:
    > ipconfig                   ... Show information.
    > ipconfig /all              ... Show detailed information
    > ipconfig /renew            ... renew all adapters
    > ipconfig /renew EL*        ... renew any connection that has its
                                     name starting with EL
    > ipconfig /release *Con*    ... release all matching connections,
                                     eg. "Local Area Connection 1" or
                                         "Local Area Connection 2"

2. arp

arp명령어는 네트워크에서 데이터를 전달할때 데이터를 교환하는 컴퓨터의 IP주소와
물리적인 주소 목록을 잠시동안 보관하는 arp cache를 볼수있도록 출력하는 명령


[ 속성 ]

Displays and modifies the IP-to-Physical address translation tables used by
address resolution protocol (ARP).

ARP -s inet_addr eth_addr [if_addr]
ARP -d inet_addr [if_addr]
ARP -a [inet_addr] [-N if_addr]

  -a            Displays current ARP entries by interrogating the current
                protocol data.  If inet_addr is specified, the IP and Physical
                addresses for only the specified computer are displayed.  If
                more than one network interface uses ARP, entries for each ARP
                table are displayed.
  -g            Same as -a.
  inet_addr     Specifies an internet address.
  -N if_addr    Displays the ARP entries for the network interface specified
                by if_addr.
  -d            Deletes the host specified by inet_addr. inet_addr may be
                wildcarded with * to delete all hosts.
  -s            Adds the host and associates the Internet address inet_addr
                with the Physical address eth_addr.  The Physical address is
                given as 6 hexadecimal bytes separated by hyphens. The entry
                is permanent.
  eth_addr      Specifies a physical address.
  if_addr       If present, this specifies the Internet address of the
                interface whose address translation table should be modified.
                If not present, the first applicable interface will be used.
Example:
  > arp -s 157.55.85.212   00-aa-00-62-c6-09  .... Adds a static entry.
  > arp -a                                    .... Displays the arp table.


3. netstat

netstat는 네트워크를 통한 접속종류와 상태를 보여주는 명령어

-a 내 네트워크에 대기중인 상태도 확인가능


-n (도메인 이름 검색 생략)스위치를 추가해주시면 좀더 빠른검색이 됨
Ex) netstat -na


-s 각각의 프로토콜에서 전송된 패킷의 양도 확인가능


LISTEN :

서버의 데몬이 떠서 접속 요청을 기다리는 상태


SYS-SENT :

로컬의 클라이언트 어플리케이션이 원격 호스트에 연결을 요청한 상태


SYN_RECEIVED :

서버가 원격 클라이언트로부터 접속 요구를 받아 클라이언트에게 응답을 하였지만 아직 클라이언트에게 확인 메시지는 받지 않은 상태


ESTABLISHED :

3 Way-Handshaking 이 완료된 후 서로 연결된 상태


FIN-WAIT1 , CLOSE-WAIT , FIN-WAIT2 :

서버에서 연결을 종료하기 위해 클라이언트에게 종결을 요청하고 회신을 받아 종료하는 과정의 상태


CLOSING :

흔하지 않지만 주로 확인 메시지가 전송도중 분실된 상태


TIME-WAIT :

연결은 종료되었지만 분실되었을지 모를 느린 세그먼트를 위해 당분간 소켓을 열어놓은 상태


CLOSED :

완전히 종료

4. nslookup

nslookup은 IP로 도메인이름을 알아보거나 도메인이름의 IP를 확인할때


[ 속성 ]

C:\>nslookup
Default Server:  ReveroF
Address:  ***.***.135.135

> help
Commands:   (identifiers are shown in uppercase, [] means optional)
NAME            - print info about the host/domain NAME using default server
NAME1 NAME2     - as above, but use NAME2 as server
help or ?       - print info on common commands
set OPTION      - set an option
    all                 - print options, current server and host
    [no]debug           - print debugging information
    [no]d2              - print exhaustive debugging information
    [no]defname         - append domain name to each query
    [no]recurse         - ask for recursive answer to query
    [no]search          - use domain search list
    [no]vc              - always use a virtual circuit
    domain=NAME         - set default domain name to NAME
    srchlist=N1[/N2/.../N6] - set domain to N1 and search list to N1,N2, etc.
    root=NAME           - set root server to NAME
    retry=X             - set number of retries to X
    timeout=X           - set initial time-out interval to X seconds
    type=X              - set query type (ex. A,ANY,CNAME,MX,NS,PTR,SOA,SRV)
    querytype=X         - same as type
    class=X             - set query class (ex. IN (Internet), ANY)
    [no]msxfr           - use MS fast zone transfer
    ixfrver=X           - current version to use in IXFR transfer request
server NAME     - set default server to NAME, using current default server
lserver NAME    - set default server to NAME, using initial server
finger [USER]   - finger the optional NAME at the current default host
root            - set current default server to the root
ls [opt] DOMAIN [> FILE] - list addresses in DOMAIN (optional: output to FILE)
    -a          -  list canonical names and aliases
    -d          -  list all records
    -t TYPE     -  list records of the given type (e.g. A,CNAME,MX,NS,PTR etc.)
view FILE           - sort an 'ls' output file and view it with pg
exit            - exit the program


5. ping

ping은 네트워크가 연결이 잘 안될때 임의의 주소로 핑을 날려서 잘받았나
확인해보는 명령어


[ 속성 ]

Usage: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS]
            [-r count] [-s count] [[-j host-list] | [-k host-list]]
            [-w timeout] target_name

Options:
    -t             Ping the specified host until stopped.
                   To see statistics and continue - type Control-Break;
                   To stop - type Control-C.
    -a             Resolve addresses to hostnames.
    -n count       Number of echo requests to send.
    -l size        Send buffer size.
    -f             Set Don't Fragment flag in packet.
    -i TTL         Time To Live.
    -v TOS         Type Of Service.
    -r count       Record route for count hops.
    -s count       Timestamp for count hops.
    -j host-list   Loose source route along host-list.
    -k host-list   Strict source route along host-list.
    -w timeout     Timeout in milliseconds to wait for each reply.


6. tracert
tracert는 네트워크의 병목현상을 확인하는데 도움
임의의 사이트로 접속하는동안 거치는 라우터의 IP가나오고 그에대한
그것에 대한 ping값이 보임


[ 속성 ]

반응형
반응형

휴 관리자 계정이 하나 있었고(암호존재)

테스트 하다가 관리자 계정이 2개가 되어버렸다. ㄷㄷ;

but... !!! 그것이 문제가 아니었다... 관리자 계정 2개가 생성되어 로그인이

불가능한 상태가 되어버렸다 ㅜㅜ 된짱 찌게 ㅡㅜ

부팅 시 F8을 눌러 명령어 모드로 부팅하고

암호 설정 복구 방법

copy c:\windows\system32\config\regback\sam c:\windows\system32\config /y

관리자 계정 2개일때 이전 시스템으로 복귀 !

copy c:\windows\system32\config\regback\SAM.OLD c:\windows\system32\config\SAM /y

copy c:\windows\system32\config\regback\SYSTEM.OLD c:\windows\system32\SYSTEM /y

system은 계정에 대한 정보(?)인듯 하다 ㅋㅋ

위와 같이 해결 ~

반응형
반응형

예전에 무자게 찾아서 헤메고 다녔던 기억이...

반응형
반응형

<IPCPERM>

inter-process communication permission mask

Web Server 시스템에 대한 관리자가 아닌 개발자와 같은 다른 사용자가 wsdown이나 특정 프로세스를 기동 및 종료를 할 수 있으며 이를 wsadmin를 통해 확인할 수 있도록 한다. Unix 시스템 환경 하에서는 관리자 개인이나 그룹, 기타에게 각각 파일 접속 제어(판독기능/기록기능/수행기능)를 지정 할 수 있다. 즉, default인 경우에는 다른 사용자들은 위의 기능을 사용할 수 없으나, IPCPERM이 0777인 경우에는 다른 사용자들은 위의 모든 기능을 사용할 수 있다.

 

<Set user ID, Set group ID, Sticky bit>

In addition to the basic permissions discussed above, there are also three bits of information defined for files in UNIX :

  • SUID or setuid : change user ID on execution : if setuid bit is set, when the file be executed by a user, thre process will have the same rights as the owner of the file being executed.
  • SGID or setgid : chage group ID on execution : Same as above, but inherits rights of the group of the owner of the file. For directories it also may mean that when a new file is created in the directory it will inherit the group of the directory (and not of the user who created the file)
  • Sticky bit : It was used to trigger process to "stick" in memory after it is finished, now this usage is obsolete. Currently its use is system dependant and it is mostly used to suppress deletion of the files that belong to other users in the folder where you hava "write" access to.
  • Numeric representation

    • Octal digit | Binary value | Meaning
    • 0 000 setuid, setgid sticky bits are cleared
    • 1 001 sticky bit is set
    • 2 010 setgid bit is set
    • 3 011 setgid and sticky bits are set
    • 4 100 setuid bit is set
    • 5 101 setuid and sticky bits are set
    • 6 110 setuid and setgid bits are set
    • 7 111 setuid, setgid, sticky bits are set
  • Textual representation

    • SUID : if set, then replaces "x" in the owner permissions to "s", if owner has execute permission, or to "S" otherwise. Example: -rws------ both owner execute and SUID are set, -r-S------ SUID is set, but owner execute is not set
    • SGID : If set, then repplaces "x" in the group permissions to "s", if group has execute permission, or to "S" otherwise.
    • Sticky : If set, then replaces "x" in the others permissions to "t", if others have execute permissions, or to "T" otherwise

 

<Invocation Manager 설정>

Method invocation manager는 Engine Container에서 Servlet/JSP methods, stateless EJB methods 그리고 MDB methods와 같은 Stateless 메소드를 호출하는 동안 사용하는 외부 자원(external resource)을 추적하고 보고한다.

  • NoAction : 기능을 사용하지 않는다.
  • Warning : 이 선택사항이 선택되면, 만약 한 자원이 무상태 메소드 호출 동안 사용되었지만 반환할 때 닫지 않게 될 경우 이벤트가 container log에 warning 메시지로 기록된다.
  • AutoClose : 이 선택사항이 선택되면, 만약 한 자원이 무상태 메소드 호출 동안 사용되었으나 반환할 때 닫히지 않는다면 자원이 자동적으로 닫힌다.

위치는 <jeus-system> - <node> - <engine-container> - <invocation-manager-action> 이다.

AutoClose일 때 다음과 같은 메시지가 나온다.

  • 2008.05.08 17:17:16][0][0_540] [test-19] [Network-0907] <SocketStreamImpl> closing the SocketStream because of occuring the exception: [SocketStream(remote : test:63370(), local : test:9736(JNSServer), jeus.net.impl.SocketStream14@17dc299)]
     java.io.IOException: disconnected

Warning일 때

  • [2008.05.28 16:26:56][1][0_540] [container1-20] [MGR-0396] Resources are not closed after use: [JeusConnection[ID=oracle-13,actual=oracle.jdbc.driver.LogicalConnection@107e4bc]]
    [2008.05.28 16:26:56][0][0_540] [container1-20] [MGR-0107] RequestURI : /test.jsp

 

 

<WebtoB와 JEUS 사이에서 DOCROOT 변경 없이 이미지가 정상적으로 뜨게 하는 방법>

  • ServiceOrder가 URI, EXT 일 경우 : URI 절에서는 구별해서 처리하기 어렵다. 왜냐하면, URI에서 처리를 담당할 ServerType이나 Vhost를 설정하기 때문이다.
  • ServiceOrder가 EXT, URI 일 경우 : EXT 절에서 각각에 타입들에 대해서 각각의 ServerType를 설정하기 때문에 각각의 ServerType이나 Vhost에 따라서 JSP/Servlet는 해당 JEUS의 어플리케이션의 PATH에, 정적인 것은 해당 WebtoB의 DOCROOT나 Vhost의 DOCROOT에 저장하면 된다.

 

<period>의 역할

Worker Thread를 없애기 위해서 풀을 검사하는 시간 간격

 

<asqcount> 확인

문제가 있어서.. 다음에 확인.(cqcount가 증가하는 문제 발생.. 자세한 내역은 모르겠음)

 

<disable-pipe> 옵션

  • 이것은 JEUS에서 나오는 error 메시지에서 차이를 알 수 있다.
  • false 일때 : fail to reconnect => No such file or directory [IOException]

    • [2008.05.07 09:12:40][1][0_540] [container1-14] [WEB-3346] worker(webtob1-hth0(localhost:9900)-w00:null) : fail to reconnect
      <<__Exception__>>
      java.io.IOException: No such file or directory
              at jeus.util.net.PipeSocketImpl.pipeConnect(Native Method)
              at jeus.util.net.PipeSocketImpl.connect(PipeSocketImpl.java:46)
              at jeus.util.net.PipeSocket.createImpl(PipeSocket.java:89)
              at jeus.util.net.PipeSocket.<init>(PipeSocket.java:66)
              at jeus.util.net.WebtobPipeSocket.<init>(WebtobPipeSocket.java:25)
              at jeus.util.net.JeusNetUtil.getWebtobSocket(JeusNetUtil.java:194)
              at jeus.servlet.engine.WebtobThreadPoolManager.connectSocket(WebtobThreadPoolManager.java:529)
              at jeus.servlet.engine.WebtobThreadPoolManager.registryConnection(WebtobThreadPoolManager.java:522)
              at jeus.servlet.engine.WebtobRequestProcessor.reconnect(WebtobRequestProcessor.java:362)
              at jeus.servlet.engine.WebtobRequestProcessor.reconnect(WebtobRequestProcessor.java:328)
              at jeus.servlet.engine.WebtobRequestProcessor.run(WebtobRequestProcessor.java:82)
      <<__!Exception__>>
  • true 일때 : fail to reconnect => Connection refused [ConnectException]

    • [2008.05.07 09:11:16][1][0_540] [container1-15] [WEB-3346] worker(webtob1-hth0(localhost:9900)-w01:null) : fail to reconnect
      <<__Exception__>>
      java.net.ConnectException: Connection refused
              at java.net.PlainSocketImpl.socketConnect(Native Method)
              at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:305)
              at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:171)
              at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:158)
              at java.net.Socket.connect(Socket.java:464)
              at java.net.Socket.connect(Socket.java:414)
              at java.net.Socket.<init>(Socket.java:310)
              at java.net.Socket.<init>(Socket.java:125)
              at jeus.util.net.JeusNetUtil.getWebtobSocket(JeusNetUtil.java:179)
              at jeus.servlet.engine.WebtobThreadPoolManager.connectSocket(WebtobThreadPoolManager.java:529)
              at jeus.servlet.engine.WebtobThreadPoolManager.registryConnection(WebtobThreadPoolManager.java:522)
              at jeus.servlet.engine.WebtobRequestProcessor.reconnect(WebtobRequestProcessor.java:362)
              at jeus.servlet.engine.WebtobRequestProcessor.reconnect(WebtobRequestProcessor.java:328)
              at jeus.servlet.engine.WebtobRequestProcessor.run(WebtobRequestProcessor.java:82)
      <<__!Exception__>>

 

<oracle database type>

  • OCI(type 2)

    • Oracle Call Interfase(OCI)
    • SQL을 실행하는 PL>SQL 어플리케이션, OCCI를 이용하는 C++ 어플리케이션, OCI기반 JDBC 드라이버를 사용하는 Java 어플리케이션, ODBC 드라이버를 사용하는 C 어플리케이션, OLEDB 드라이버를 사용하는 VB 어플리케이션, Pro*C 어플리케이션, 분산형 SQL에서 사용
    • 최신 Oracle Database Server 기능의 즉각적인 활용, 엔터프라이즈 수준의 성능과 확장성, 안정적인 보안 모델 구현, Oracle이 실행되는 모든 플랫폼에서 호환성 보장
  • THIN(type 4)

 

 

<enable-wait>

  • true :

    • tmax@test:~/jeus5/config/test$ da 1
      JEUS 5.0 (fix #25) JDBC Connection Pool Controller
      test_container1>info
      ==========================================================================
      id     name       min  max  current  idle  disposable  waiting   working
      ==========================================================================
      ==========================================================================
      test_container1>info
      ==========================================================================
      id     name       min  max  current  idle  disposable  waiting   working
      ==========================================================================
      1  oracle         2    10   10     0      0       true      true
      ==========================================================================
      test_container1>info
      ==========================================================================
      id     name       min  max  current  idle  disposable  waiting   working
      ==========================================================================
      1  oracle         2    10   10     0      0       true      true
      ==========================================================================
    • 와 같이 나왔으며 위의 연결정보를 끊지 않고 12개를 띄운 것이다.
    • 결과로는 11번째 요청부터는 일정 시간이 지난 뒤에 요청이 반환되지 않았다.
    • <<__Exception__>>
      jeus.jdbc.connectionpool.WaitTimeoutException: enable-wait timeout occurred from the connection pool; export-name=[oracle]
              at jeus.jdbc.connectionpool.ConnectionStore.getObject(ConnectionStore.java:191)
              at jeus.jdbc.connectionpool.ConnectionStore.getConnection(ConnectionStore.java:245)
              at jeus.jdbc.connectionpool.ConnectionPool.prepareConnection(ConnectionPool.java:820)
              at jeus.jdbc.connectionpool.ConnectionPool.innerGetConnection(ConnectionPool.java:705)
              at jeus.jdbc.connectionpool.ConnectionPool.getConnection(ConnectionPool.java:642)
              at jeus.jdbc.datasource.DataSourceWrapper.getConnection(DataSourceWrapper.java:42)
              at jeus_jspwork._500_test_5fjsp._jspService(_500_test_5fjsp.java:64)
              at jeus.servlet.jsp.HttpJspBase.service(HttpJspBase.java:54)
              at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
              at jeus.servlet.jsp.JspServletWrapper.executeServlet(JspServletWrapper.java:101)
              at jeus.servlet.engine.ServletWrapper.execute(ServletWrapper.java:214)
              at jeus.servlet.jsp.JspServletWrapper.execute(JspServletWrapper.java:147)
              at jeus.servlet.engine.WebtobRequestProcessor.run(WebtobRequestProcessor.java:183)
      <<__!Exception__>>
      jeus.jdbc.connectionpool.WaitTimeoutException: enable-wait timeout occurred from the connection pool; export-name=[oracle]
              at jeus.jdbc.connectionpool.ConnectionStore.getObject(ConnectionStore.java:191)
              at jeus.jdbc.connectionpool.ConnectionStore.getConnection(ConnectionStore.java:245)
              at jeus.jdbc.connectionpool.ConnectionPool.prepareConnection(ConnectionPool.java:820)
              at jeus.jdbc.connectionpool.ConnectionPool.innerGetConnection(ConnectionPool.java:705)
              at jeus.jdbc.connectionpool.ConnectionPool.getConnection(ConnectionPool.java:642)
              at jeus.jdbc.datasource.DataSourceWrapper.getConnection(DataSourceWrapper.java:42)
              at jeus_jspwork._500_test_5fjsp._jspService(_500_test_5fjsp.java:64)
              at jeus.servlet.jsp.HttpJspBase.service(HttpJspBase.java:54)
              at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
              at jeus.servlet.jsp.JspServletWrapper.executeServlet(JspServletWrapper.java:101)
              at jeus.servlet.engine.ServletWrapper.execute(ServletWrapper.java:214)
              at jeus.servlet.jsp.JspServletWrapper.execute(JspServletWrapper.java:147)
              at jeus.servlet.engine.WebtobRequestProcessor.run(WebtobRequestProcessor.java:183)
  • false = 옵션이 없을 때

    • tmax@test:~/jeus5/config/test$ da 1
      JEUS 5.0 (fix #25) JDBC Connection Pool Controller
      test_container1>info
      ==========================================================================
      id     name       min  max  current  idle  disposable  waiting   working
      ==========================================================================
      ==========================================================================
      test_container1>info
      ==========================================================================
      id     name       min  max  current  idle  disposable  waiting   working
      ==========================================================================
      1  oracle         2    10   2      1      0       false     true
      ==========================================================================
      test_container1>info
      ==========================================================================
      id     name       min  max  current  idle  disposable  waiting   working
      ==========================================================================
      1  oracle         2    10   10     0      1       false     true
      ==========================================================================
      test_container1>info
      ==========================================================================
      id     name       min  max  current  idle  disposable  waiting   working
      ==========================================================================
      1  oracle         2    10   10     0      2       false     true
      ==========================================================================
    • 와 같이 나왔으며 위의 정보 연결을 끊지 않고 12개를 띄웠을 때이다.
    • 다음 12번째 의 결과 이다
      ConnectionPool query is select sysdate from dual
      con is JeusConnection[ID=oracle-12,actual=oracle.jdbc.driver.LogicalConnection@ed3e63]
      ??깃?? : 2008-05-07 12:34:42.0
    • ==========================================================================
      id     name       min  max  current  idle  disposable  waiting   working
      ==========================================================================
      1  oracle         3    10   10     0      5       false     true
      ==========================================================================
      test_container1>coninfo oracle
      ========================================================
      Connection information list for oracle
      --------------------------------------------------------
      | id                   | state | usecount | state time(sec)
      --------------------------------------------------------
      oracle-15             idle    0          27.0
      oracle-5              active  0          31.0
      oracle-8              active  0          30.0
      oracle-13             idle    0          28.0
      oracle-4              active  0          32.0
      oracle-12             idle    0          28.0
      oracle-1              active  1          34.0
      oracle-9              active  0          29.0
      oracle-14             idle    0          27.0
      oracle-10             active  0          29.0
      oracle-11             idle    0          29.0
      oracle-2              active  1          33.0
      oracle-6              active  0          31.0
      oracle-3              active  1          33.0
      oracle-7              active  0          30.0
      ========================================================
      test_container1>coninfo oracle
      ========================================================
      Connection information list for oracle
      --------------------------------------------------------
      | id                   | state | usecount | state time(sec)
      --------------------------------------------------------
      oracle-15             idle    0          69.0
      oracle-5              active  0          74.0
      oracle-8              active  0          72.0
      oracle-13             idle    0          70.0
      oracle-4              active  0          74.0
      oracle-12             idle    0          70.0
      oracle-1              active  1          77.0
      oracle-9              active  0          72.0
      oracle-14             idle    0          70.0
      oracle-10             active  0          71.0
      oracle-11             idle    0          71.0
      oracle-2              active  1          76.0
      oracle-6              active  0          73.0
      oracle-3              active  1          75.0
      oracle-7              active  0          73.0
      ========================================================
      test_container1>info
      ==========================================================================
      id     name       min  max  current  idle  disposable  waiting   working
      ==========================================================================
      1  oracle         3    10   10     0      9       false     true
      ==========================================================================
      test_container1>coninfo oracle
      ========================================================
      Connection information list for oracle
      --------------------------------------------------------
      | id                   | state | usecount | state time(sec)
      --------------------------------------------------------
      oracle-15             idle    0          90.0
      oracle-5              active  0          94.0
      oracle-17             idle    0          6.0
      oracle-18             idle    0          5.0
      oracle-8              active  0          93.0
      oracle-13             idle    0          91.0
      oracle-4              active  0          95.0
      oracle-12             idle    0          91.0
      oracle-1              active  1          97.0
      oracle-9              active  0          92.0
      oracle-14             idle    0          90.0
      oracle-10             active  0          92.0
      oracle-11             idle    0          92.0
      oracle-2              active  1          96.0
      oracle-6              active  0          94.0
      oracle-16             idle    0          7.0
      oracle-3              active  1          96.0
      oracle-7              active  0          93.0
      oracle-19             idle    0          5.0
      ========================================================
      test_container1>coninfo oracle
      ========================================================
      Connection information list for oracle
      --------------------------------------------------------
      | id                   | state | usecount | state time(sec)
      --------------------------------------------------------
      oracle-15             idle    0          121.0
      oracle-5              active  0          125.0
      oracle-17             idle    0          37.0
      oracle-18             idle    0          36.0
      oracle-8              active  0          124.0
      oracle-13             idle    0          121.0
      oracle-4              active  0          126.0
      oracle-12             idle    0          122.0
      oracle-1              active  1          128.0
      oracle-9              active  0          123.0
      oracle-14             idle    0          121.0
      oracle-10             active  0          123.0
      oracle-11             idle    0          122.0
      oracle-2              active  1          127.0
      oracle-6              active  0          125.0
      oracle-16             idle    0          37.0
      oracle-3              active  1          126.0
      oracle-7              active  0          124.0
      oracle-19             idle    0          35.0
      ========================================================
      test_container1>
    • <<__!Exception__>>
      jeus.jdbc.connectionpool.JeusSQLException: Failed to create a new PooledConnection from [oracle]
              at jeus.jdbc.connectionpool.ConnectionPool.getPooledConnection(ConnectionPool.java:468)
              at jeus.jdbc.connectionpool.ConnectionStore.createDisposableConnection(ConnectionStore.java:349)
              at jeus.jdbc.connectionpool.ConnectionPool.prepareConnection(ConnectionPool.java:825)
              at jeus.jdbc.connectionpool.ConnectionPool.innerGetConnection(ConnectionPool.java:705)
              at jeus.jdbc.connectionpool.ConnectionPool.getConnection(ConnectionPool.java:642)
              at jeus.jdbc.datasource.DataSourceWrapper.getConnection(DataSourceWrapper.java:42)
              at jeus_jspwork._500_test_5fjsp._jspService(_500_test_5fjsp.java:64)
              at jeus.servlet.jsp.HttpJspBase.service(HttpJspBase.java:54)
              at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
              at jeus.servlet.jsp.JspServletWrapper.executeServlet(JspServletWrapper.java:101)
              at jeus.servlet.engine.ServletWrapper.execute(ServletWrapper.java:214)
              at jeus.servlet.jsp.JspServletWrapper.execute(JspServletWrapper.java:147)
              at jeus.servlet.engine.WebtobRequestProcessor.run(WebtobRequestProcessor.java:183)
      Caused by: java.sql.SQLException: Listener refused the connection with the following error:
      ORA-12519, TNS:no appropriate service handler found
      The Connection descriptor used by the client was:
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(PORT=1521)(HOST=127.0.0.1))(CONNECT_DATA=(SID=orcl10)))

              at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
              at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:261)
              at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
              at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:414)
              at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
              at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
              at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
              at oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSource.java:297)
              at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:221)
              at oracle.jdbc.pool.OracleConnectionPoolDataSource.getPhysicalConnection(OracleConnectionPoolDataSource.java:157)
              at oracle.jdbc.pool.OracleConnectionPoolDataSource.getPooledConnection(OracleConnectionPoolDataSource.java:94)
              at oracle.jdbc.pool.OracleConnectionPoolDataSource.getPooledConnection(OracleConnectionPoolDataSource.java:75)
              at jeus.jdbc.connectionpool.ConnectionPool.getPooledConnection(ConnectionPool.java:444)
              ... 12 more

 

 

<JDBC type 특성>

  • type 1 : JDBC-ODBC Bridge

    • JDBC-ODBC Bridge는 JDBC가 ODBC Driver에 접근하는 통로를 제공한다.
    • 이것은 Sun에서 이미 구현을 해놓았다.
    • 주로 Window에서 ODBC에 등록해놓은 데이타베이스를 접근할 때 사용을 한다.
  • type 2 : Native - API partly - Java Driver

    • 벤데에서 제공하는 라이브러리를 이용해 DB를 엑서스한다는 의미
    • 그러므로 벤더에서 제공되는 2진 파일과 인터페이스 하기 위해 자바는 부분적으로 Java Native Method를 이용하게 된다.
    • 그래서 type 2 는 플렛폼에 의존적이다. 또한 servlet는 가능하나, applet는 불가능하다.
  • type 3 : JDBC - Net pure Java Driver

    • JDBC의 호출을 DBMS에 비종속적인 네트워크 프로토콜로 바꾼 후 다시 서버에 의해 원하는 DBMS의 프로토콜로 해석
    • 그래서 플렛폼과 프로토콜에 무관하게 DB와 연동하여 사용할 수 있다는 장점을 가지고 있다.
    • 그러나, 유로이며, 전문적인 드라이버 제공 회사가 있다.
  • type 4 : Native - protocol pure Java Driver

    • JDBC API는 DBMS가 사용하는 전용 프로토콜을 이용해 직접 인터페이스를 한다. 클라이언트에서 DBMS 서버로 직접 엑세스하게 되므로 인트라넷을 위한 작고 빠른 실용적인 대안이 된다.
    • 이것은 플렛폼에 무관하지 않고 독립적이다.
    • 앞에서 언급했듯이 DBMS의 프로토콜을 이용하여 접속을 한다.
    • 그래서 벤더의 JDBC 드라이버가 필요하다.(DBMS에 의존적):

 

<덤프 떠보기>

- 현재 실패한 상태.

 

출처 : http://negator.springnote.com/pages/1153896

반응형

'WAS > JEUS' 카테고리의 다른 글

JEUSMain.xml Datasource 암호 설정  (0) 2011.01.13
IBM JVM 튜닝 - 3  (0) 2009.08.24
JAVA HEAPDUMP 분석방법  (0) 2009.03.05
웹상에서 제우스 로그 확인하기  (0) 2009.03.05
제우스 연결 세션 병렬화  (0) 2009.03.05
반응형

Java 프로그램은 처음 시작할 때 사용할 Heap메모리 영역을 할당하고 시작한다. 만일 이러한 Heap영역이 부족하게 되면 OutOfMemoryError이라는 에러를 발생시키고 비정상 종료하게 된다.

이러한 OutOfMemoryError이 발생할 경우 개발자는 난감한 상황에 빠지게 되는데, 어떤 프로그램에서 메모리를 많이 잡아 먹었는지 파악하기 힘들기 때문이다.

이러한 경우 일반적으로 사용되는 도구가 Profiler인데, Profiler의 가장 큰 문제는 사용하게 되면 실행 속도가 10배 이상 느려져서 정상적으로 동작하기 힘들어 진다. 그래서 Profiler를 사용하게 되면 OutOfMemoryError이 발생하지 않는 경우도 종종 있다.

그러면 이러한 OutOfMemoryError를 좀더 현실적으로 진단할 방법은 무엇일까?

1. IBM JVM의 경우

IBM JVM을 사용해 보신 분들을 이미 알고 있겠지만 IBM에서는 Heapdump라는 메모리의 Heap정보를 파일로 추출하는 기능을 제공해 준다. (필자의 경우 IBM JVM의 가장 큰 장점이라고 생각하는 기능이다.)

AIX와 같은 IBM OS에서 프로그램을 실행시켜 보신 분들은 아래와 같은 파일이 생성된 것을 볼 수 있었을 것이다.

확장자가 phd로 끝나는 파일이 Heapdump파일이고 javacore로 시작되는 파일이 Threaddump 파일이다.

Threaddump는 파일을 읽는 방법만 익히면 어렵지 않게 읽을 수 있다. 관련 내용은 추후에 다른 포스트에서 설명하겠다.

하지만 Heapdump파일의 경우 별도의 Tool이 필요하다. IBM은 HeapRoots라는 명령창 기반 프로그램과 HeapAnalyzer라는 GUI기반 프로그램을 제공한다.

HeapRoots의 경우 복잡하지는 않지만 별도의 사용법을 알아야 하지만 HeapAnalyser의 경우 직관적인 UI가 제공되서 쉽게 사용이 가능하다.

각 프로그램은 다음 링크에서 다운 받을 수 있다.

Heap Analyzer를 실행한 화면은 아래와 같다.

 

2. SUN JVM의 경우

SUN JVM의 경우 Heapdump를 따로 제공하지 않았었다. 정석은 Profiler를 이용하는 것인네 너무 느리기 때문에 여러가지 편법들이 난무했는데, 그 중에는 IBM Heapdump 모듈을 이용하는 편법도 있었다.

IBM HeapDump for Solaris : http://www.skywayradio.com/tech/WAS51/IBMHeapDump/ 

하지만 JDK 1.4.1에서만 동작하고 1.4.2이후 버전에서는 동작하지 않는다는 치명적인 단점이 있었다.

시간이 지나 Java 5가 나오면서 SUN도 운영 관리의 중요성에 눈을 조금씩 떠가면서 JMX 가 추가되었고 HotSpot VM 명령 옵션에 Heapdump를  추출하는 옵션을 추가하게 되었다.

옵션은 다음과 같다.

-XX:+HeapDumpOnOutOfMemoryError

이 옵션은 1.5.0_07 이나 1.4.2_12 이상 버전 부터 지원한다.

옵션을 추가해서 실행하면 아래와 같이 나온다.

$ java -XX:+HeapDumpOnOutOfMemoryError -mn256m -mx512m ConsumeHeap
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid2262.hprof ...
Heap dump file created [531535128 bytes in 14.691 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at ConsumeHeap$BigObject.(ConsumeHeap.java:22)
        at ConsumeHeap.main(ConsumeHeap.java:32)

파일은 현재 폴더에 HPROF 바이너리 포멧으로 생성되고 JHAT(Java Heap Analysis Tool)와 같이 HPROF 포멧을 지원하는 툴로 분석할 수 있다.

JHAT : http://java.sun.com/javase/6/docs/technotes/tools/share/jhat.html

만일 폴더를 변경하려면 -XX:HeapDumpPath= 옵션을 이용할 수 있다.

관련 링크 : http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/gdaog.html#gbzrr

                  http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/gblfj.html

3. HP JVM의 경우

SUN JVM과 동일한데 1.5.0_04 나 1.4.2_11부터 지원한다. 상세한 내용은 아래 링크를 참고한다.

Java Troubleshooting Guide for HP-UX Systems : http://docs.hp.com/en/5992-1918/5992-1918.pdf

분석하는데 HPJtune를 사용한다.

HPjtune :  http://www.hp.com/products1/unix/java/java2/hpjtune/

 

 
 
반응형
반응형

------------------------------------------

tail_log_ajax.jsp

------------------------------------------

 

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.io.*" %>
<%!
public String toKorean(String param) {
 try{
  //param=new String(param.getBytes("ISO-8859-1"),"EUC-KR");
 }catch(Exception e){
 }
 return param;
}
%>

<%
response.setHeader("Pragma","No-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0);
response.setHeader ("Cache-Control", "no-cache");
%>

<%
//로그파일명
String log_filename = request.getParameter("log_filename") == null ? "": request.getParameter("log_filename");
long end_point = (request.getParameter("end_point")==null)? 0:Long.parseLong(request.getParameter("end_point")+"");
//로그파일이 있는 디렉토리
String log_dir = request.getParameter("log_dir");
if(log_dir==null||log_dir.length()==0){
 log_dir = "/home/jeus5/logs/vmstest/";
}

StringBuffer sb = new StringBuffer();
RandomAccessFile read_file = new RandomAccessFile(log_dir+"/"+log_filename, "r");
long str_length = read_file.length();
long start_point = (end_point>0)?end_point:str_length;
read_file.seek(start_point);  
String str;
long file_point = start_point;
while((str = read_file.readLine()) != null){
 sb.append(toKorean(str)+"\n");
 file_point = read_file.getFilePointer();
 read_file.seek(file_point);  
}
read_file.close();
String log_data = sb.toString();
out.print(file_point+","+log_data);
%>

 

 

-------------------------------------------

 

--------------------------------------------

tail_log.jsp

--------------------------------------------

 

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.io.*" %>
<%!
public String toKorean(String param) {
 try{
  //param=new String(param.getBytes("ISO-8859-1"),"EUC-KR");
 }catch(Exception e){
 }
 return param;
}
%>

<%
//로그파일이 있는 디렉토리
String log_dir = request.getParameter("log_dir");
if(log_dir==null||log_dir.length()==0){
 log_dir = "/home/jeus5/logs/vmstest/";
}

//화면에 나타낼 로그파일 길이
long log_length = 100000;
//로그파일명
String log_filename = request.getParameter("log_filename") == null ? "": request.getParameter("log_filename");

// 디렉토리인 객체를 생성
File myDir = new File(log_dir);
// 디렉토리의 내용 구하기
File[] list_files = myDir.listFiles();

//파일시작위치
long start_point = 0;
//파일끝위치
long end_point = 0;
//파일내용
String log_data = "";
if(!log_filename.equals("")){
 StringBuffer sb = new StringBuffer();
 RandomAccessFile read_file = new RandomAccessFile(log_dir+"/"+log_filename, "r");
 //파일 길이를 구한다.
 long str_length = read_file.length();
 //파일을 읽을 위치를 정한다.
 start_point = (str_length<log_length)?0:(str_length-log_length);
 read_file.seek(start_point);  
 String str;
 end_point = str_length;
 while((str = read_file.readLine()) != null){
  sb.append(toKorean(str)+"\n");
  //파일을 읽고 마지막 위치를 알아낸다.
  end_point = read_file.getFilePointer();
  read_file.seek(end_point);  
 }
 read_file.close();
 //파일내용
 log_data = sb.toString();
}
%>

<HTML>
<HEAD>
<title>로그파일보기</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<style type="text/css">
<!--
a {text-decoration:none; color: black;}
a:link {text-decoration:none; color: black;}
a:visited {text-decoration:none; color: black;}
a:active {text-decoration:none; color: black;}
a:hover {text-decoration:none; color:black;}
body,table,tr,td {  font-family: "굴림"; font-size: 9pt; font-style: normal; color: black;}
-->
</style>
<script>
 //ajax를 위한 함수입니다.
 function getXmlHttpRequest(){
  var xmlhttp = false;
  // Mozilla/Safari
  if (window.xmlhttpuest) {
    xmlhttp = new xmlhttpuest();
  }
  // IE
  else if (window.ActiveXObject) {
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  }
  return xmlhttp;
 }
</script>
</head>

<body>
<table border="0" cellspacing="0" cellpadding="0" width="100%" height="100%">
 <tr height="10%">
  <td align="left" valign="bottom">
   <table border="0" cellspacing="0" cellpadding="0">
   <form name="fileform" method="post" action="tail_log.jsp">
    <tr>
     <td align="left" valign="bottom" height="20">
      로그파일을 tail -f 명령어 처럼 보여줍니다.
     </td>
    </tr>
    <tr>
     <td>
      <select id="log_dir" name="log_dir" onChange="window.Location='tail_log.jsp?log_dir='+this.options[this.selectedIndex].value">
      <option value="/home/jeus5/logs/vmstest/">개발서버      
      </select><script>document.fileform.log_dir.value="<%=log_dir%>";</script>
      <select name="log_filename">
       <option value="">파일선택</option>
       <%
       if (list_files != null) {
        for (int i = 0; i < list_files.length; i++) {
         if(!list_files[i].isDirectory()){
          String filename = list_files[i].getName();
          filename = filename.substring(filename.lastIndexOf("/")+1,filename.length());
       %>
       <option value="<%=filename%>" <%=log_filename.equals(filename)?"selected":""%>><%=filename%></option>
       <%
         }
        }
       }
       %>
      </select>
     </td>
     <td>
      <input type="submit" value="로그파일보기">
     </td>
    </tr>
   </form>
   </table>
  </td>
 </tr>
 <tr height="90%">
  <td>
   <table border="0" cellspacing="0" cellpadding="0" width="100%" height="100%">
   <form name="logform">
    <tr>
     <td><!--textarea id="log_data_area" name="log_data" style="width:100%;height:100%;"></textarea--><xmp id="log_data" name="log_data" style="text-overflow:ellipsis;overflow:auto;border:1 solid #000000;width:1300;height:100%"><%=log_data%>
     </xmp></td>
    </tr>
   </form>
   </table>
  </td>
 </tr>
</table>
<%
if(!log_filename.equals("")){
%>
<script>
 var end_point = <%=end_point%>;
function include_ajax_repeat(){
  var url = 'tail_log_ajax.jsp?log_filename=<%=log_filename%>&end_point='+end_point;
  //alert(url);
  var xmlhttp = getXmlHttpRequest();
  if(url){
   xmlhttp.open("GET", url, true);
   xmlhttp.onreadystatechange = function() {
    if(xmlhttp.readyState == 4) {
     if(xmlhttp.status == 200) {
      var resText = xmlhttp.responseText;
      //마지막 위치
      end_point = resText.substring(0,resText.indexOf(','));
      //새로운 로그 데이타
      var data = resText.substring(resText.indexOf(',')+1,resText.length);
      log_data.innerText = log_data.innerText + data;
      //일정한 양의 로그데이타만 남긴다.
      if(log_data.innerText.length><%=log_length%>) log_data.innerText = log_data.innerText.substring(log_data.innerText.length-<%=log_length%>);
      //스크롤 이동
      document.getElementById('log_data').scrollTop=document.getElementById('log_data').scrollHeight+<%=log_length%>;
      xmlhttp = null;
     } else {
      //alert("Error loading "+url+", "+xmlhttp.status+"("+xmlhttp.statusText+")");
      top.window.title="Error loading "+url+", "+xmlhttp.status+"("+xmlhttp.statusText+")";
      xmlhttp = null;
     }
    }
   }
   xmlhttp.send(null);
  }  
  setTimeout("include_ajax_repeat()", 2000);//msec 마다 서버와 통신함
  return false;
 }
 function include_ajax_repeat_old(){
  var url = 'tail_log_ajax.jsp?log_filename=<%=log_filename%>&end_point='+end_point;
  //alert(url);
  var xmlhttp = getXmlHttpRequest();
  if(url){
   xmlhttp.open("GET", url, true);
   xmlhttp.onreadystatechange = function() {
    if(xmlhttp.readyState == 4) {
     if(xmlhttp.status == 200) {
      var resText = xmlhttp.responseText;
      //마지막 위치
      end_point = resText.substring(0,resText.indexOf(','));
      //새로운 로그 데이타
      var log_data = resText.substring(resText.indexOf(',')+1,resText.length);
      document.logform.log_data.value = document.logform.log_data.value + log_data;
      //일정한 양의 로그데이타만 남긴다.
      if(document.logform.log_data.value.length><%=log_length%>) document.logform.log_data.value = document.logform.log_data.value.substring(document.logform.log_data.value.length-<%=log_length%>);
      //스크롤 이동
      document.getElementById('log_data_area').scrollTop=document.getElementById('log_data_area').scrollHeight+<%=log_length%>;
     } else {
      //alert("Error loading "+url+", "+xmlhttp.status+"("+xmlhttp.statusText+")");
      top.window.document.title="Error loading "+url+", "+xmlhttp.status+"("+xmlhttp.statusText+")";
     }
    }
   }
   xmlhttp.send(null);
  }
  setTimeout("include_ajax_repeat()", 2000);//msec 마다 서버와 통신함
  return false;
 }
 include_ajax_repeat();
</script>
<%
}
%>
</body>
</html>

 

---------------------------------------------------------

 

출처 : http://realcool.egloos.com/4778358

*** 주의사항

Clustering 환경에서는 경로를 반드시 파일로 부터 읽어 와야 한다.

안그럼 무자게 많은 error 가 발생함.

반응형
반응형

<database>
                <vendor>oracle</vendor>
                <export-name>VIIMS</export-name>
                <data-source-class-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-class-name>
                <data-source-type>ConnectionPoolDataSource</data-source-type>
                <database-name>BILNS30</database-name>
                <data-source-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-name>
                <description>ICIS_NSBL_DB</description>
                <user>vimis</user>
                <password>votmdnjem</password>
                <property>
                   <name>URL</name>
                   <type>java.lang.String</type>
                   <value>jdbc:oracle:thin:@(DESCRIPTION=(ENABLE=BROKEN)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(Host=200.182.154.51)(Port=1523))(ADDRESS=(PROTOCOL=TCP)(Host=200.182.154.52)(Port=1523))(FAILOVER = o
n)(LOAD_BALANCE =off))(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME=VIMIS)))</value>
                </property>
                <driver-type>thin</driver-type>
                <connection-pool>
                   <pooling>
                        <min>30</min>
                        <max>40</max>
                        <step>5</step>
                        <period>3600000</period>
                   </pooling>
                   <wait-free-connection>
                      <enable-wait>true</enable-wait>
                      <wait-time>2000</wait-time>
                   </wait-free-connection>
                   <check-query>select 1 from dual</check-query>
                   <check-query-period>300000</check-query-period>
                </connection-pool>
        </database>
반응형
반응형

$JEUS_HOME -> 제우스 설치 디렉토리(리눅스/유닉스용)
%JEUS_HOME% -> 윈도우 설치 디렉토리
 
제우스 설치 아뒤 기본 암호
administrator/jeusadmin
가끔 암호가 대문자일 경우가 있다 ^^

1. JEUS 3.x
$ encode 암호
ex) $ encode 암호
[jeusadmin] --> [amV1c2FkbWlu]

2. JEUS 4.x  : $JEUS_HOME/config/hostname/file_realm.xml 내용중 아래 password 수정
    <user>
        <user-name>administrator</user-name>
        <password>amV1c2FkbWlu</password>
        <role-name>system</role-name>
    </user>

* Windows> java -classpath "%JEUS_HOME%\lib\system\jeus.jar" jeus.security.Base64 <암호>
* UNIX> java -classpath $JEUS_HOME/lib/system/jeus.jar jeus.security.Base64 <암호>
예) $ java -classpath $JEUS_HOME/lib/system/jeus.jar jeus.security.Base64 암호
[jeusadmin] --> [amV1c2FkbWlu] --> [jeusadmin]

or encryption base64 <암호> ( 4.2.4.0 부터 지원)

3. JEUS 5.x
$JEUS_HOME/config/hostname/security/SYSTEM_DOMAIN/account.xml 내용중 아래수정
        <user>
            <name>administrator</name>
            <password>{base64}amV1c2FkbWlu</password>
            <group>Administrators</group>
        </user>

* Windows > java -classpath "%JEUS_HOME%\lib\system\jeus.jar" jeus.security.admin.Base64Coder  encode | decode <암호>
* Unix > java -classpath $JEUS_HOME/lib/system/jeus.jar jeus.security.admin.Base64Coder encode | decode <암호>
or encryption base64 <암호>

반응형

'WAS > JEUS' 카테고리의 다른 글

제우스 환경 설정 부분  (0) 2009.03.05
JAVA HEAPDUMP 분석방법  (0) 2009.03.05
웹상에서 제우스 로그 확인하기  (0) 2009.03.05
제우스 연결 세션 병렬화  (0) 2009.03.05
JEUS Administrator 명령  (0) 2009.03.05

+ Recent posts