달력

4

« 2024/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
2014. 3. 11. 12:52

AngularJS 자료 정리 I.lib()/I.lib(Script)2014. 3. 11. 12:52

.. .. ..

AngularJS 시작하기.

 

http://www.nextree.co.kr/p3241/

 

AngularJS 구현하기

 

http://jcf.daewoobrenic.co.kr/blog/?p=237

 

AngularJS 관련 자료

 

 

 

.
:
Posted by .07274.
.. .. ..

 

 

강력하고 새로운 웹 부하테스트 도구 Gatling으로 JBoss 부하테스트 하기

 

.
:
Posted by .07274.
2014. 2. 10. 10:06

[펌] Spring camp 발표 영상 I.lib()/I.lib(Spring)2014. 2. 10. 10:06

.. .. ..

 

[펌] : https://groups.google.com/forum/#!topic/ksug/QNiYQbJI-2I

[문제가 있을시 삭제하겠습니다.]

 

안녕하십니까, KSUG 일꾼단 김지헌입니다.

지난 해에 발표한 영상이 편집되어 유투브에 기재되었습니다.
이에 내용을 정리해서 공유합니다.

즐거운 설명절 무사히~ 즐겁게~ 보내시길 바랍니다. ^^ 

@ Track A

  1. DSL 로 만나는 Groovy (장시영)

  2. 무식하게 배우는 Gradle! (김지헌)

  3. Cloud Foundry 를 활용한 PaaS 구축기 (안병현)

  4. TDD 라이브 (최범균)

  5. Spring MVC Test 어렵지 않아요! (최용은)


@ Track B

  1. 좌충우돌 SNS 솔루션 만들기 (김성박)

  2. Java Configuration 없인 못살아! (박용권)

  3. Spring data JPA (김영한)

  4. Spring Security 를 적용한 웹 시스템 구축 사례 (이수홍)

  5. Spring Boot 로 무얼 할 수 있나? (이재일)


@ Track C

  1. JDK 8에 추가된 것들은? (이상민)

  2. ORM 프레임워크를 활용할 때의 설계, 개발 프로세스 (박재성)

  3. 대규모 프로젝트와 Grails (이정택)

  4. Spring Scala : 스프링이 스칼라를 만났을 때 (변정훈)

  5. Scala for Play (최정열)


@ Track D

  1. Effective Scala (이희종)

  2. Java8.next() == Scala (정대원)

  3. Akka 소개 및 Redis 를 활용한 Pub/Sub 시스템 구현 (이장원)

  4. 스칼라가 빅데이터 및 현재 각광 받고 있는 이유 (강지훈)

  5. 스칼로이드: 스칼라 기반의 안드로이드 개발 라이브러리 (이성호)

.
:
Posted by .07274.
.. .. ..

 

[펌] : http://yunsunghan.tistory.com/562

Spring에서 DWR 사용하기(모든 설정을 annotation 하기)

내가 이글(http://yunsunghan.tistory.com/137)를 쓴지가 벌써 3,4년 전이였는데 아직도 그설정 그대로 사용하고 있는걸 보니, 이젠 뭔가 바뀌어 있지 않을까 하고 찾아 봤다. 별고 바뀐건 없지만, 한가지 눈에 띄는게 있다. @DataTransferObject 인데, 그땐 발견하지 못한건지, 적용하지 못하고 있음을 과거글에서 찾아 볼수있다. 모델 매핑은 XML에서 하고 있으니 말이다. 

경기도 시흥에 1박으로 놀려놨다가 아침에 다른(addon)것 찾아보다 발견하여 기록해본다. @DataTransferObject를 적용하는 방법은 여기(http://www.butterdev.com/dwr/2010/10/dwr-spring-and-annotations/)에 잘 나와 있다. 핵심은 아래 코드를 참조하자. 

[XML설정]

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd">
  
   <dwr:configuration />   
   <dwr:annotation-scan base-package="org.uk.ltd.dwr.dev" scanDataTransferObject="true" scanRemoteProxy="true"/>   
</beans>

 



[소스코드-Bean]

@DataTransferObject
public class Address {
private String street;
...

 


[소스코드-Biz]

@RemoteProxy(name="dwrService")
public class DWRService {
public DWRService() { }
@RemoteMethod
public Address getAddress() throws Exception {
Address address = new Address();
address.setStreet("2245 NW Overlook Drive");
address.setCity("Portland");
address.setState("Oregon");
return address;
}
     ... 

'I.lib() > I.lib(Web)' 카테고리의 다른 글

Spring 과 DWR 적용 Sample  (0) 2014.01.10
web.xml 태그 설정  (0) 2011.05.03
.
:
Posted by .07274.
2014. 1. 10. 11:39

Spring 과 DWR 적용 Sample I.lib()/I.lib(Web)2014. 1. 10. 11:39

.. .. ..

 

[펌] : http://blog.naver.com/PostView.nhn?blogId=fbstar&logNo=100120366091

 

spring 2.5 까지는 페이지 로딩시 spring mvc 를 통해 전달받은 객체에서 값들을 꺼내쓰는 직관적인 개발 구조이다.

그래서 깔끔하고 안정적인 개발환경을 유지할 수 있었으나 매번 새 페이지를 reloading 할 수만은 없어서 Ajax 를 구현하고자 하였다.

정보를 좀 찾아보니 Spring 에서는 DWR 이 그 역할을 대신하고 있어서 dwr 을 이용한 Ajax 통신 구조를 구현하였고 이로써 페이지 reloading 없이

원하는 값을 background 에서 처리 후 가져올 수 있었다.

 

구현시 몇가지 주의할 사항들이 있으니 참조하기 바람.

 

필요 모듈 :  

1. spring 2.5~3.0  

(3.0 에서 테스트해도 별 이상은 없었으나 3.0 부터는 json 을 위한 별도의 viewResolver 등 좀더 세부적인 업데이트가 이루어진듯 하다. )

2. dwr.jar

 

1.  view 페이지
<script type='text/javascript' src='/dwr/interface/mapService.js'></script>
<script type='text/javascript' src='/dwr/engine.js'></script>
<script type='text/javascript' src='/dwr/util.js'></script>

위의 3 가지 script 는 그대로 카피해 넣는다. (필수항목임)

주의 사항은 /dwr/ 은 web.xml 에서 servlet-mapping 으로 설정해놓은 url 이라는 것과 (아래 web.xml 이미지 참조)

/dwr/interface/mapService.js 에서 실제 javascript 객체로 사용되는 mapService명.js 앞에 '/dwr/interface/' 까지는 무조건 표시해야 한다는 것.

reference 를 직접 찾아보진 않아서 이유는 확인 못했으나 사용되는 객체는 반드시 /interface/객체명.js 로 표시해야 하는 듯 하다.

GetGeoCode 는 mapService 클래스의 GetGeoCode method 와 맵핑이 되며 첫번째 파라미터는  전달할 인자가 되고

두번째 파라미터는 callback 함수가 된다. (수행 후 등록한 calback 함수를 통해 수행결과를 return 받는다. )

 

 

2. web.xml

URL 주소가 /dwr/ 로 들어오는 경우 모두 /WEB-INF/dwrController.xml 의 설정을 따르라는 설정. 

 

3. dwrController.xml

위 경로를 통해 들어오는 요청에 대한 처리를 담당하는 controller.xml 이다.

 <beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans  
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.directwebremoting.org/schema/spring-dwr
       http://www.directwebremoting.org/schema/spring-dwr-2.0.xsd">

위의 xml 에 대한 참조 정의를 그대로 카피해서 사용한다.

모든 url 은 dwrContrller 이라고 명명한 dwr:controller 로 연결되어 있으며

실제 javascript 에서 사용할 객체는 <dwr:remote javascript="mapService" > 에서 정의하였고

아래 코드는 " javascript 상의 mapService.getGeoCode() 에 대한 구현이 spring.dwr.service.MapServiceImpl 클래스의

getGeoCode 로 매핑된다."고 해석할 수 있다.

 

주의 사항은 

반드시 <props> 내에 정의된 "/engine.js, /util.js, /interface/**, /* " key 를 모두 등록을 해주어야 한다는 것.

jsp 페이지상의 url 과 맵팽되는 prop key 들을 수정해서 테스트 해본 바 engine.js, util.js 는 dwr 에서 기본적으로 추가해주어야 하는

항목인 듯하며jsp 페이지에서 사용하는 객체는 반드시 /interface/** 를 통해서 들어와야 하고 /* 무조건 있어야 에러가안나고....

쓰다보니 좀 부족한듯...^^;;아무튼 정확한 이유에 대해서는 reference 를 통해 공부하기를 바라며 url 맵핑을 각자 테스트해 보시길...^^:

 

 

 

4. spring.dwr.service.MapServiceImpl 을 구현한 class 이다.

여기서는 google geocode 를 가져오는 java source 일부 구현하였다.

인자값으로 받는 MapBean 은 상황에 맞게 Bean 또는 String 등등 으로 대체가능할 듯(^^;)

다만 bean 을 사용할 경우 위 소스 처럼 <dwr:configuration > 에서 사용할 bean 을 등록해주어야 한다.




5. 위에서 등록한 Bean 이다.

이 bean 클래스를 통해서 값을 전달 받는다.

 

6. 여기까지 정상적으로 구현이 되었다면 1번 이미지에서 callback 함수로 등록했던 onGetComments 함수를 통해서

alert() 메세지를 띄울 것이다.

 

여기까지 완성.. ^^;

'I.lib() > I.lib(Web)' 카테고리의 다른 글

Spring에서 DWR 사용하기( annotation 사용)  (0) 2014.01.10
web.xml 태그 설정  (0) 2011.05.03
.
:
Posted by .07274.
.. .. ..

 

[펌] : 출처 : http://www.gurubee.net/pages/viewpage.action?pageId=26740202&

Servlet의 이해 및 간단예제

1. Servlet의 이해

1.1 Servlet 이란

  • Servlet은 웹에서 JAVA 프로그래밍을 구현하기 위해 탄생 함.
  • JAVA 로 구현된 CGI(Common Gateway Interface) 라고들 흔히 말함
  • HTTP protocol 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속하여 개발하며, Servlet은 Container에 의해서 실행되고, 관리된다.
  • HTML 변경시 Servlet을 재컴파일 해야 하는 단점이 있다.

1.2 Servlet Container란

  • HTTP 요청을 받아서 Servlet을 실행시키고, 그 결과를 사용자 브라우저에게 전달해주는 기능을 제공하는 컴포넌트 이다.
  • Servlet을 실행하고 생명주기를 관리하는 역할을 한다.
  • Servlet과 웹 서버(Apache, nginx..)가 서버 통신 할 수 있는 방법을 제공한다.
  • 멀티 스레딩을 지원하여 클라이언트의 다중 요청을 알아서 처리해준다.
  • 대표적인 Conatainer에는 Tomcat, jetty, jboss 등이 있다.

1.3 Servlet 동작과정

  • ① 사용자가 URL을 클릭하면 HTTP Request를 Servlet Container에 보낸다.
  • ② Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성한다.
  • ③ 사용자가 요청한 URL을 분석하여 어느 서블릿에 대한 요청인지 찾는다. (DD를 참조하여 분석)
  • ④ 컨테이너는 서블릿 service() 메소드를 호출하며, POST, GET여부에 따라 doGet() 또는 doPost()가 호출된다.
  • ⑤ doGet() or doPost() 메소드는 동적인 페이지를 생성한 후 HttpServletResponse객체에 응답을 보낸다.
  • ⑥ 응답이 완료되면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다.
DD (배포서술자, Deployment Descriptor) = web.xml
  • Servlet, Error Page, Listener, Fillter, 보안 설정등 Web Application의 설정 파일이다.
  • URL과 실제 서블릿의 매핑 정보도 담고 있다.
  • 하나의 웹 어플리케이션에 하나만 존재한다.
  • 보통 Web Document Root 디렉토리에 WEB-INF 폴더 아래 web.xml 파일로 존재한다.

1.4 JSP의 동작구조

2. Servlet 간단예제

2.1 Servlet 예제 코드 작성

  • src/main/java 폴더 아래에 com.oracleclub.study.servlet 패키지를 생성하고 아래의 HelloServlet을 생성한다.
  • 모든 JAVA 파일은 직접 코딩해 주세요
com.oracleclub.study.servlet.HelloServlet.java
/*
 * HelloServlet.java 2012. 9. 14.
 *
 * Copyright oracleclub.com All rights Reserved.
 */
package com.oracleclub.study.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet 간단 예제
 * 
 * @author : oramaster
 * 
 */
@SuppressWarnings("serial")
public class HelloServlet extends HttpServlet {

    // 대부분의 Servlet은 doGet 또는 doPost만 작성하며,
    // 컨테이너가 생성한 Request와 Response 객체를 전달 받는다.
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        resp.setContentType("text/html; charset=UTF-8");

        // Response 객체의 PrintWriter를 사용해 브라우저에 HTML을 출력한다.
        PrintWriter out = resp.getWriter();
        out.println("<HTML><HEAD><TITLE>HelloServlet</TITLE></HEAD>");
        out.println("<BODY>");
        out.println("<H2> Clinet IP: " + req.getRemoteAddr() + "</H2>");
        out.println("<H2> Client Host : " + req.getRemoteHost() + "</H2>");
        out.println("<H2> Request URI : " + req.getRequestURI() + "</H2>");
        out.println("</BODY></HTML>");
    }
}

2.2 URL과 Servlet 매핑하기

  • HelloServlet 작성이 완료 되었다면, 배포서술자(DD=web.xml) 파일에 URL 매핑을 기술한다.
web.xml
<servlet>
   <servlet-name>hello</servlet-name>  <!-- DD 안에서 사용될 이름을 지정한다. -->
   <servlet-class>com.oracleclub.study.servlet.HelloServlet</servlet-class>  <!-- Servlet 클래스 이름을 기술한다. -->
</servlet>

<servlet-mapping>
   <servlet-name>hello</servlet-name>        <!-- Servlet 클래스의 DD안에서 정의한 이름 -->
   <url-pattern>/servlet/hello</url-pattern>  <!-- 클라이언트가 요청하게 될 이름. -->
</servlet-mapping>
  • 배포서술자에서 서블릿 관련 항목을 간단히 설명하면 아래와 같다.
    • <servlet> : <servlet-name>과 <servlet-class>를 연결 한다.
    • <servlet-name> : DD 안에서 사용될 이름
    • <servlet-class> : 자바 클래스 이름
    • <url-pattern> : 클라이언트가 요청하게 될 이름
    • <servlet-mapping> : <servlet-name>과 <url-pattern>을 연결 한다.

2.3 Tomcat 연동 하기

  • 톰캣 다운로드 클릭 후 압축해제 한다.
  • 배포서술자까지 작성이 완료되었다면 톰캣을 연동하여 실행해 보자
  • 이클립스 <Servers>에서 <New>→<Server>를 실행한다.
  • <그림2-3>과 같이 <Tomcatv6.0 Server>를 선택한 후 <Server name> 을 web-project로 입력한다.
  • <Server runtime environment> 가 설정되어 있지 않다면 <Add> 버튼을 클릭하여 압축해제 한 Tomcat 디렉토리를 선택한다.
  • 강의에서는 Tomcat 6.x 버전을 기준으로 하였으며, 개인의 버전에 맞추어서 선택하면 된다.
  • Next 버튼을 클릭하고 위와 같이 spring-project를 [STUDY:Add]한 후 Finish 버튼을 클릭한다.

2.4 서블릿 실행

2.5 Apache+Tomcat연동 후 서블릿 실행

  • 정상적으로 호출이 된다면 Apache와 연동을 해보자. 좀 전에 테스트한 http-vhost.conf 파일의 DocumentRoot를 spring-project의 webapps 디렉토리로 변경하고 Apache를 restart하면 된다.
  • JkMount 설정에 /servlet/ 디렉토리도 추가해 주자
http-vhost.conf 파일 설정
<VirtualHost *:80>
    ServerName test.apache.org
    DocumentRoot C:\workspace\project\spring-project\webapps 
 
# URL중 jsp로 오는 Request만 Tomcat에서 처리 함
JkMount  /*.jsp  spring-project 

# 아래의 spring-project는 workers.properties에서 등록한 worker이름 이다.
# servlet 예제 실행을 위해서 추가
JkMount  /servlet/*  spring-project
</VirtualHost> 

2.6 URL과 Servlet을 간단하게 매핑하기

  • 위 예제에서 간단하게 HelloServlet을 실행하였는데, 만약 서블릿 클래스가 굉장히 많아 진다면, <servlet> , <servlet-mapping> 설정이 서블릿의 두 배만큼 많아 질 것이다.
  • 톰캣에서는 서블릿 매핑 설정을 간단하게 할 수 있는 기능을 제공하며, 톰캣 서버의 web.xml(이클립스에서는 <Servers> <spring-project-config>의 web.xml) 에서 아래 부분의 주석만 해제하면 된다.
web.xml 파일 설정
<!-- 122라인 -->
<servlet>
      <servlet-name>invoker</servlet-name>
      <servlet-class>
        org.apache.catalina.servlets.InvokerServlet
      </servlet-class>
      <init-param>
          <param-name>debug</param-name>
          <param-value>0</param-value>
      </init-param>
      <load-on-startup>2</load-on-startup>
  </servlet>

<!-- 382라인 -->
  <servlet-mapping>
      <servlet-name>invoker</servlet-name>
      <url-pattern>/servlet/*</url-pattern>
  </servlet-mapping>
  • Tomcat Server의 web.xml 수정 후 이클립스를 다시 실행한다.
  • spring-project의 web.xml 에서 아래와 같이 servlet 이름만 지정하고 <servlet-mapping> 설정은 제거한다.
web.xml
<servlet>
   <servlet-name>hello</servlet-name>  <!-- DD 안에서 사용될 이름을 지정한다. -->
   <servlet-class>com.oracleclub.study.servlet.HelloServlet</servlet-class>  <!-- Servlet 클래스 이름을 기술한다. -->
</servlet>
  • Tomcat Server를 재시작 한 후 http://test.apache.org/servlet/hello URL로 접속하여 정상 접속이 되는지 확인해보자
  • Invoker를 이용한 매핑의 경우 클라이언트 URL은 /servlet/servlet-name 이 된다.

3. 톰캣 startup 시 오류

3.1 404 Not Found 오류

  • <Server> → <spring-project> → <Web Moduls>에서 Path가 아래와 같이 공백으로 되어 있는지 확인한다.

3.2 java.lang.SecurityException

  • 톰캣이 startup시 "Caused by: java.lang.SecurityException: Servlet of class org.apache.catalina.servlets.InvokerServlet is privileged and cannot be loaded by this web application" 에러가 발생한다면 Tomcat Server의 server.xml 파일에서 <Context> 태그에 privileged="true" 옵션을 추가하면 된다.

3.3 java.lang.ClassNotFoundException

  • 톰캣이 startup시 "java.lang.ClassNotFoundException" 오류가 발생하면 .classpath의 MAVEN2_CLASSPATH_CONTAINER 부분을 확인한다.
  • 아래와 같이 attributes의 /WEB-INF/lib 폴더를 추가한다.
  • Project Clean, Tomcat Clean 한 후 다시 start 해보자
.classpath의 MAVEN2_CLASSPATH_CONTAINER 설정
    <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER" >
       <attributes>
            <attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
        </attributes>
    </classpathentry>

-- STS 버전
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
	    <attributes>
            <attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
        </attributes>
	</classpathentry>
  • <Project> → <Clean>
  • <Server> → <Clean>

문서정보

 

'I.lib() > I.lib(Java)' 카테고리의 다른 글

[펌] JAVA 의 ENUM 정리.  (0) 2014.08.01
[펌] 필터란 무엇인가!  (0) 2014.07.01
jstat 사용법  (0) 2014.01.03
JVM에서 Pid 를 이용하여 Process 정보 읽기 (Attach api)  (0) 2014.01.02
J2EE 란?  (0) 2013.10.30
.
:
Posted by .07274.
2014. 1. 6. 16:07

CentOS 에 Oracle 설치하기 I.lib()/I.lib(Oracle)2014. 1. 6. 16:07

.. .. ..

http://blueray21.tistory.com/21

.
:
Posted by .07274.
2014. 1. 3. 11:10

jstat 사용법 I.lib()/I.lib(Java)2014. 1. 3. 11:10

.. .. ..

 

[펌] : http://5dol.tistory.com/182

 

 

우선 간단히 확인하면 아래처럼 나온다. jstat -옵션 -pid -시간 하면 된다.
ex) ~]jstat -gc 16543 1000

저건 pid 16543(java)를 1초에 한번씩 결과값을 보여달란거다.

pid는 ps -efw | grep java로 알아내면 된다.

~] jstat --help

 invalid argument count
Usage: jstat -help|-options
       jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

Definitions:
  <option>      An option reported by the -options option
  <vmid>        Virtual Machine Identifier. A vmid takes the following form:
                     <lvmid>[@<hostname>[:<port>]]
                Where <lvmid> is the local vm identifier for the target
                Java virtual machine, typically a process id; <hostname> is
                the name of the host running the target Java virtual machine;
                and <port> is the port number for the rmiregistry on the
                target host. See the jvmstat documentation for a more complete
                description of the Virtual Machine Identifier.
  <lines>       Number of samples between header lines.
  <interval>    Sampling interval. The following forms are allowed:
                    <n>["ms"|"s"]
                Where <n> is an integer and the suffix specifies the units as
                milliseconds("ms") or seconds("s"). The default units are "ms".
  <count>       Number of samples to take before terminating.
  -J<flag>      Pass <flag> directly to the runtime system.



옵션은 다음과 같다.

 옵션명 내용 
 class  클래스 로더의 동작에 관한 통계 데이터
 compiler  HotSpot Just-in-Time 컴파일러의 동작에 관한 통계 데이터
 gc  가베지 컬렉트된 heap의 동작에 관한 통계 데이터
 gccapactiy  세대마다의 용량과 대응하는 영역에 관한 통계 데이터
 gccause  가베지 콜렉션 통계 데이터의 개요 (-gcutil 와 같다)와 직전 및 현재 (적용 가능한 경우)의 가베지 콜렉션 이벤트의 원인
 gcnew  New 세대의 동작에 관한 통계 데이터
 gcnewcapacity  New 세대의 사이즈와 대응하는 영역에 관한 통계 데이터
 gcold  Old 세대 및 Permanent 세대의 동작에 관한 통계 데이터
 gcoldcapacity  Old 세대의 사이즈에 관한 통계 데이터
 gcpermcapacity  Permanent 세대의 사이즈에 관한 통계 데이터
 gcutil  가베지 콜렉션 통계 데이터의 개요
 printcompilation HotSpot 컴파일 방법의 통계 데이터

각 옵션에 대한 컬럼에 대한 설명은 다음과 같다.

-class  클래스 로더의 통계 데이터
 Loaded  Bytes  Unloaded  Bytes  Time
 로드 된 클래스의 수  로드 된 K 바이트수  언로드된 클래스의 수  언로드된 K 바이트수  클래스의 로드나 언로드 처리에 필요로 한 시간

-compiler HotSpot Just-In-Time 컴파일러의 통계 데이터
 Compiled  Failed  Invalid  Time  FailedType  FailedMethod
 실행된 컴파일 태스크의 수  실패한 컴파일 태스크의 수  무효로 된 컴파일 태스크의 수  컴파일 태스크의 실행에 필요로 한 시간  마지막에 실패한 컴파일의 컴파일 타입  마지막에 실패한 컴파일의 클래스명과 메소드

-gc 가비지 컬렉트된 heap의 통계 데이터
 컬럼명  설명
 S0C  Survivor 영역 0 의 현재의 용량 (KB)
 S1C  Survivor 영역 1 의 현재의 용량 (KB)
 S0U  Survivor 영역 0 의 사용율 (KB)
 S1U  Survivor 영역 1 의 사용율 (KB)
 EC  Eden 영역의 현재의 용량 (KB)
 EU  Eden 영역의 사용율 (KB)
 OC  Old 영역의 현재의 용량 (KB)
 OU  Old 영역의 사용율 (KB)
 PC  Permanent 영역의 현재의 용량 (KB)
 PU  Permanent 영역의 사용율 (KB)
 YGC  Young 세대의 GC 이벤트수
 YGCT  Young 세대의 가베지 콜렉션 시간
 FGC  풀 GC 이벤트수
 FGCT  풀 가베지 콜렉션 시간
 GCT  가베지 콜렉션의 합계 시간

-gccapacity 메모리프르 세대 및 영역 용량

 컬럼명 설명 
 NGCMN  New 세대의 최소 용량 (KB)
 NGCMX  New 세대의 최대 용량 (KB)
 S0C  Survivor 영역 0 의 현재의 용량 (KB)
 S1C  Survivor 영역 1 의 현재의 용량 (KB)
 EC  Eden 영역의 현재의 용량 (KB)
 OGCMN  Old 세대의 최소 용량 (KB)
 OGCMX  Old 세대의 최대 용량 (KB)
 OGC  Old 세대의 현재의 용량 (KB)
 OC  Old 영역의 현재의 용량 (KB)
 PGCMN  Permanent 세대의 최소 용량 (KB)
 PGCMX  Permanent 세대의 최대 용량 (KB)
 PGC  Permanent 세대의 현재의 용량 (KB)
 PC  Permanent 영역의 현재의 용량 (KB)
 YGC  Young 세대의 GC 이벤트수
 FGC  풀 GC 이벤트수
 NGC  New 세대의 현재의 용량 (KB)

-gcutil 가베지 콜렉션 통계 데이터의 개요
 컬럼명  설명
 S0  Survivor 영역 0 의 사용율 (현재의 용량에 대한 퍼센티지)
 S1  Survivor 영역 1 의 사용율 (현재의 용량에 대한 퍼센티지)
 E  Eden 영역의 사용율 (현재의 용량에 대한 퍼센티지)
 O  Old 영역의 사용율 (현재의 용량에 대한 퍼센티지)
 P  Permanent 영역의 사용율 (현재의 용량에 대한 퍼센티지)
 YGC  Young 세대의 GC 이벤트수
 YGCT  Young 세대의 가베지 콜렉션 시간
 FGC  풀 GC 이벤트수
 FGCT  풀 가베지 콜렉션 시간
 GCT  가베지 콜렉션총시간

-gccause GC 이벤트를 포함한 가베지 콜렉션 통계 데이터(gcutil에 두개 컬럼이 추가됨)
 컬럼명  설명
 LGCC  마지막 가베지 콜렉션의 원인
 GCC  현재의 가베지 콜렉션의 원인

-gcnew New 세대의 통계 데이터
 컬럼명  설명
 S0C  Survivor 영역 0 의 현재의 용량 (KB)
 S1C  Survivor 영역 1 의 현재의 용량 (KB)
 S0U  Survivor 영역 0 의 사용율 (KB)
 S1U  Survivor 영역 1 의 사용율 (KB)
 TT  전당 들어가 귀의치
 MTT  최대 전당 들어가 귀의치
 DSS  적절한 Survivor 사이즈 (KB)
 EC  Eden 영역의 현재의 용량 (KB)
 EU  Eden 영역의 사용율 (KB)
 YGC  Young 세대의 GC 이벤트수
 YGCT  Young 세대의 가베지 콜렉션 시간

-gcold 옵션 Old 및 Permanent 세대의 통계 데이터
 컬럼명 설명 
 PC  Permanent 영역의 현재의 용량 (KB)
 PU  Permanent 영역의 사용율 (KB)
 OC  Old 영역의 현재의 용량 (KB)
 OU  Old 영역의 사용율 (KB)
 YGC  Young 세대의 GC 이벤트수
 FGC  풀 GC 이벤트수
 FGCT  풀 가베지 콜렉션 시간
 GCT  가베지 콜렉션총시간

-gcoldcapacity Old 세대의 통계 데이터
 컬럼명 설명 
 OGCMN  Old 세대의 최소 용량 (KB)
 OGCMX  Old 세대의 최대 용량 (KB)
 OGC  Old 세대의 현재의 용량 (KB)
 OC  Old 영역의 현재의 용량 (KB)
 YGC  Young 세대의 GC 이벤트수
 FGC  풀 GC 이벤트수
 FGCT  풀 가베지 콜렉션 시간
 GCT  가베지 콜렉션총시간

-printcompilation HotSpot 컴파일 방법의 통계 데이터

 컬럼명 설명 
 Compiled  실행된 컴파일 태스크의 수
 Size  메소드의 바이트 코드의 바이트수
 Type  컴파일 타입
 Method  컴파일 방법을 특정하는 클래스명과 메소드명. 클래스명에서는, 이름 공간의 단락 문자로서 「.」(은)는 아니고 「/」이 사용된다. 메소드명은, 지정된 클래스내의 메소드이다. 이러한 2 개의 필드의 형식은, HotSpot -XX:+PrintComplation 옵션과 대응하고 있다


사용 방법

jstat -gcutil -h5 16543 1000 10

jstat를 -gcutil 옵션을 주고 5개씩 출력마다 헤더를 출력(h5)하고 1초마다 출력하되 10개씩 보여준다.

.
:
Posted by .07274.
.. .. ..

 

[출처] Attach API|작성자 날씬한곰

 

Java EE/초급 2007/09/03 14:08

저자 JZ Ventures사의 사장 겸 대표 컨설턴트 John Zukowski

이 아티클의 영문 원본은 http://java.sun.com/mailers/techtips/corejava/2007/tt0807.html#2
에서 볼수 있습니다.

Java 플랫폼을 다룰 때 일반적으로 표준 java.*javax.* 라이브러리를 사용하여 프로그래밍한다. 그러나 Sun JDK(Java Development Kit)에서 이 라이브러리만 제공하는 것은 아니다. JDK 설치 디렉토리 아래 lib 디렉토리에 있는 tools.jar 파일에서 몇 가지 추가 API를 제공한다. javadoc 도구와 Attach API라는 API의 확장이 지원됨을 알 수 있다.

이름이 암시하는 것처럼, Attach API는 대상 VM(virtual machine)에 연결할 수 있게 해준다. 다른 VM에 연결하면 현재 상황을 모니터링하고 문제가 발생하기 전에 이를 발견할 수도 있다. Attach API 클래스는 com.sun.tools.attachcom.sun.tools.attach.spi 패키지에 있지만, 일반적으로 com.sun.tools.attach.spi 클래스를 직접 사용하는 일은 없다.

사용하지 않을 .spi 패키지에 있는 유일한 클래스를 비롯하여 전체 API는 총 7개의 클래스로 구성된다. 그 중에 3개는 exception 클래스이고 하나는 permission이다. 따라서 VirtualMachine 및 이와 관련된 VirtualMachineDescriptor 클래스를 제외하곤 학습할 내용이 그리 많지 않다.

VirtualMachine 클래스는 특정 JVM 인스턴스를 나타낸다. VirtualMachine 클래스에 프로세스 ID를 제공하여 JVM에 연결한 다음 사용자 정의 동작을 수행하도록 관리 에이전트를 로드한다.

VirtualMachine vm = VirtualMachine.attach (processid);
String agent = ...
vm.loadAgent(agent);

VirtualMachine을 얻는 또 다른 방법은 시스템에 알려진 VM의 목록을 요청하고 관심 있는 하나를 선택하는 것인데, 흔히 이름을 기준으로 한다.

String name = ...
List vms = VirtualMachine.list();
for (VirtualMachineDescriptor vmd: vms) {
    if (vmd.displayName().equals(name)) {
        VirtualMachine vm = VirtualMachine.attach(vmd.id());
        String agent = ...
        vm.loadAgent(agent);
        // ...
    }
}

이 에이전트로 무엇을 할 수 있는지 알아보기에 앞서 고려해야 할 사항 두 가지가 있다. 첫 번째는, loadAgent() 메소드가 설정을 에이전트에 전달하는 두 번째 인수 옵션을 갖는다는 것이다. 여기서는 여러 개의 옵션을 전달할 가능성이 있는 단 하나의 인수만 존재하므로, 여러 개의 인수는 쉼표로 구분된 목록의 형태로 전달된다.

vm.loadAgent (agent, "a=1,b=2,c=3");그런 다음 에이전트는 다음과 비슷한 코드로 그 인수를 분할하는데, 인수가 에이전트의 args 변수에 전달되었다고 가정한다.

String options[] = args.split(",");
for (String option: options)
    System.out.println(option);
}


두 번째로 언급할 점은 현재 VM을 대상 VM으로부터 분리하는 방법이다. 이는 detach() 메소드를 통해 수행된다. loadAgent()를 사용하여 에이전트를 로드한 다음 detach()해야 한다.

JMX 에이전트가 JDK와 함께 제공된 management-agent.jar 파일에 있다. tools.jar와 동일한 디렉토리에 있는 JMX 관리 에이전트는 원격 JMX 에이전트의 MBean Server를 시작하고 그 서버와의 MBeanServerConnection을 얻게 해준다. 그리고 이를 통해 원격 VM에 있는 스레드 등을 나열할 수 있다.

다음 프로그램이 바로 그런 작업을 수행한다. 먼저 식별된 VM과 연결한다. 그런 다음 실행 중인 원격 JMX 서버를 찾고, 아직 시작된 것이 없으면 하나를 시작한다. ,code>management-agent.jar 파일은 원격 VM의 java.home을 찾아 지정한다. 반드시 로컬일 필요는 없다. 일단 연결되면 MBeanServerConnection을 얻으며, 그로부터 ManagementFactory에서 스레드나 ThreadMXBean 등을 쿼리한다. 마지막으로, 스레드와 그 상태의 목록이 표시된다.

import java.lang.management.*;
import java.io.*;
import java.util.*;
import javax.management.*;
import javax.management.remote.*;
import com.sun.tools.attach.*;

public class Threads {

  public static void main(String args[]) throws Exception {
    if (args.length != 1) {
      System.err.println("Please provide process id");
      System.exit(-1);
    }
    VirtualMachine vm = VirtualMachine.attach(args[0]);
    String connectorAddr = vm.getAgentProperties().getProperty(
      "com.sun.management.jmxremote.localConnectorAddress");
    if (connectorAddr == null) {
      String agent = vm.getSystemProperties().getProperty(
        "java.home")+File.separator+&qut;lib&qut;+File.separator+
        "management-agent.jar";
      vm.loadAgent(agent);
      connectorAddr = vm.getAgentProperties().getProperty(
        "com.sun.management.jmxremote.localConnectorAddress");
    }
    JMXServiceURL serviceURL = new JMXServiceURL(connectorAddr);
    JMXConnector connector = JMXConnectorFactory.connect(serviceURL);
    MBeanServerConnection mbsc = connector.getMBeanServerConnection();
    ObjectName objName = new ObjectName(
      ManagementFactory.THREAD_MXBEAN_NAME);
    Set<ObjectName> mbeans = mbsc.queryNames(objName, null);
    for (ObjectName name: mbeans) {
      ThreadMXBean threadBean;
      threadBean = ManagementFactory.newPlatformMXBeanProxy(
        mbsc, name.toString(), ThreadMXBean.class);
      long threadIds[] = threadBean.getAllThreadIds();
      for (long threadId: threadIds) {
        ThreadInfo threadInfo = threadBean.getThreadInfo(threadId);
        System.out.println (threadInfo.getThreadName() + &qut; / &qut; +
            threadInfo.getThreadState());
      }
    }
  }
}


이 프로그램을 컴파일하려면 해당 CLASSPATH에 tools.jar가 있어야 한다. JAVA_HOME이 Attach API가 포함된 Java SE 6 설치 디렉토리로 설정되었다고 가정하면, 다음 줄이 프로그램을 컴파일한다.
> javac -cp %JAVA_HOME%/lib/tools.jar Threads.java

여기서 프로그램을 실행할 수 있지만, 연결할 대상은 없다. 따라서 프레임을 표시하는 간단한 Swing 프로그램을 소개한다. 특별한 것은 없으며, 그저 알아볼 만한 스레드 이름 몇 개를 나열할 뿐이다.

import java.awt.*
import javax.swing.*

public class MyFrame {
  public static void main(String args[]) {
    Runnable runner = new Runnable() {
      public void run() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 300);
        frame.setVisible(true);
      }
    };
    EventQueue.invokeLater(runner);
  }
}

한 창에서 MyFrame 프로그램을 실행하고, 다른 창에서 Threads 프로그램을 실행할 준비를 한다. 시스템이 원격 VM과 연결할 수 있도록 동일한 런타임 위치를 공유해야 한다.

일반적인 시작 명령으로 MyFrame을 시작한다.
> java MyFrame

그런 다음 실행 중인 애플리케이션의 프로세스 ID를 찾아야 한다. 바로 여기서 jps 명령이 진가를 발휘한다. 사용 중인 Java 런타임 디렉토리에 대해 시작된 모든 VM의 프로세스 ID를 나열하는 것이다. 실제로는 아래와 다른 프로세스 ID가 출력될 것이다.

> jps
5156 Jps
4276 MyFrame

jps 명령 자체가 Java 프로그램이므로 그 역시 목록에 나타난다. 여기서 4276이 Threads 프로그램으로 전달되어야 한다. 실제 ID는 이와 다를 것이다. 그런 다음 Threads를 실행하면 실행 중인 스레드의 목록을 덤프한다.

> java -cp %JAVA_HOME%/lib/tools.jar;. Threads 4276

JMX server connection timeout 18 / TIMED_WAITING
RMI Scheduler(0) / TIMED_WAITING
RMI TCP Connection(1)-192.168.0.101 / RUNNABLE
RMI TCP Accept-0 / RUNNABLE
DestroyJavaVM / RUNNABLE
AWT-EventQueue-0 / WAITING
AWT-Windows / RUNNABLE
AWT-Shutdown / WAITING
Java2D Disposer / WAITING
Attach Listener / RUNNABLE
Signal Dispatcher / RUNNABLE
Finalizer / WAITING
Reference Handler / WAITING


JMX 관리 에이전트를 사용하면 스레드를 나열하는 것 이상의 훨씬 많은 일을 할 수 있다. 예를 들어, ThreadMXBeanfindDeadlockedThreads() 메소드를 호출하여 교착 상태의 스레드를 찾을 수 있다.

직접 에이전트를 만드는 것은 더 간단한 편이다. 애플리케이션에서 main() 메소드를 필요로 하는 것과 비슷하게 에이전트는 agentMain() 메소드를 갖는다. 이는 어떤 인터페이스에도 속하지 않는다. 시스템은 그저 정확한 인수가 매개변수로 설정된 것을 찾아야 함을 알 뿐이다.

import java.lang.instrument.*

public class SecretAgent {
   public static void agentmain(String agentArgs,
       Instrumentation instrumentation) {
     // ...
   }
}

에이전트를 사용하려면 컴파일된 클래스 파일을 JAR 파일로 패키지화하고 매니페스트에서 Agent-Class를 지정해야 한다.

Agent-Class: SecretAgent

그러면 프로그램의 main() 메소드가 원래 Threads 프로그램보다 약간 더 짧아지는데, 원격 JMS 커넥터와 연결할 필요가 없기 때문이다. 여기서는 새로 패키지화된 에이전트를 사용하도록 JAR 파일 참조를 변경하면 된다. 그런 다음 SecretAgent 프로그램을 실행하면 시작하는 즉시, 즉 애플리케이션의 main() 메소드가 호출되기도 전에 agentmain() 메소드가 실행된다. Applet처럼, 어떤 인터페이스에도 속하지 않은 작업을 수행하도록 멋진 이름이 지정된 또 다른 메소드들이 존재한다.

Threads 프로그램을 사용하여 또 다른 VM을 모니터링하고, 일부 스레드를 교착 상태로 보낸 다음 이 차단된 VM과 계속 통신할 수 있는 방법을 표시해 본다.

Attach API를 위한 API 문서를 참조한다. 또한 JVM TI(Java Virtual Machine Tool Interface)에 대한 자료도 읽어볼 수 있다. 거기서는 Attach API를 사용해야 한다.

[출처] Attach API|작성자 날씬한곰

.
:
Posted by .07274.
.. .. ..

 

아래와 같은 설정을 pom.xml 에 하고

 

<plugin>
     <artifactId>maven-assembly-plugin</artifactId>
     <inherited>false</inherited>
     <configuration>
      <descriptorRefs>
       <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
     </configuration>
    </plugin>

 

메이븐을 빌드할때 아래 명령을 한다.

 

mvn assembly:assembly

 

위와같이 빌드하면 jar 파일이 두가지 생긴다.

aaa.jar

aaa-jar-with-dependencies.jar

아래 부분이 라이브러리를 포함한 jar 가 된다.

 

.
:
Posted by .07274.