java. lang. OutOfmory Error 가 가 져 온 일련의 자바 바이트 조작

이전 BLOG 에 서 는 자바 메모리 관리 에 대한 인식 을 정리 하 였 습 니 다.http://japi.iteye.com/blog/261626
돌려주다http://japi.iteye.com/blog/260196OutOf Memory Error: PermGen space 원인 을 몇 가지 적 었 습 니 다.
인용 하 다.
다음 과 같은 몇 가지 이유 가 있 을 수 있다.
1. proxool 을 사 용 했 습 니 다. proxool 내부 에 오래된 버 전의 cglib 가 포함 되 어 있 기 때 문 입 니 다.
2, log4j, 사용 하지 않 는 것 이 좋 습 니 다. common - logging 만 사용 하 는 것 이 좋 습 니 다.
3. 오래된 버 전의 cglib, 빨리 최신 버 전 으로 업데이트 합 니 다.
4, 최신 hibernate 3.2 로 업데이트
cglib 에 대해 서 는 좀 더 지 켜 봐 야 겠 어 요.
일단 자료 부터 볼 게 요.
http://www.blogjava.net/calvin/archive/2005/11/28/21741.html
http://www.iteye.com/topic/98178
http://www.ibm.com/developerworks/cn/java/j-lo-asm30/#N10200
http://www.cnjm.net/tech/article1219.html
CGLIB 는 손 은 간단 하지만 기능 은 상당히 강하 다.
인용 하 다.
CGLIB 는 강력 한 고성능 코드 생 성 패키지 이다.그것 은 많은 AOP 의 프레임 워 크 에 광범 위 하 게 사용 되 고 있 습 니 다. 예 를 들 어 Spring AOP 와 dynaop 은 그들 에 게 방법 을 제공 하 는 interception (차단) 입 니 다.가장 유행 하 는 OR Mapping 도구 hibenate 도 CGLIB 를 사용 하여 단일 싱글 엔 드 single - ended (다 대 1 과 1 대 1) 관련 (집합 지연 캡 처 는 다른 메커니즘 으로 이 루어 집 니 다) 을 대리 합 니 다.Easy Mock 과 jMock 은 모방 (moke) 대상 을 사용 하여 자바 코드 를 테스트 하 는 가방 입 니 다.인터페이스 가 없 는 클래스 에 대한 모방 (moke) 대상 을 만 들 기 위해 CGLIB 를 사용 합 니 다.
인용 하 다.
CGLIB 패키지 의 아래쪽 은 작고 빠 른 바이트 처리 프레임 ASM 을 사용 하여 바이트 코드 를 바 꾸 고 새로운 클래스 를 생 성 합 니 다.CGLIB 패 키 지 를 제외 하고 스 크 립 트 언어 인 Groovy 와 BeanShell 도 ASM 을 사용 하여 자바 의 바이트 코드 를 생 성 합 니 다.ASM 을 직접 사용 하 는 것 을 권장 하지 않 을 때, JVM 내부 구조 가 class 파일 을 포함 하 는 형식 과 명령 집합 에 대해 잘 알 아야 하기 때 문 입 니 다.
ASM 은 어떤 사람 인가?
인용 하 다.
ASM 은 자바 바이트 코드 조작 프레임 워 크 입 니 다.그것 은 동적 으로 클래스 를 생 성하 거나 기 존의 기능 을 강화 하 는 데 사 용 될 수 있다.ASM 은 바 이 너 리 클 라 스 파일 을 직접 만 들 수도 있 고 자바 가상 컴퓨터 에 불 러 오기 전에 클래스 행 위 를 동적 으로 변경 할 수도 있 습 니 다.자바 class 는 엄격 한 형식 으로 정 의 된 class 파일 에 저 장 됩 니 다. 이 파일 들 은 클래스 의 모든 요 소 를 분석 할 수 있 는 충분 한 메타 데 이 터 를 가지 고 있 습 니 다. 클래스 이름, 방법, 속성, 자바 바이트 코드 (명령).ASM 은 클래스 파일 에서 정 보 를 읽 은 후에 클래스 행 위 를 바 꾸 고 클래스 정 보 를 분석 할 수 있 으 며 사용자 의 요구 에 따라 새로운 클래스 를 생 성 할 수 있다.
ASM 과 CGLIB 의 관 계 는 LUCENE 와 COMPASS, JDBC 와 SPRING 의 JdbcTemplate 처럼 프로 그래 밍 난이 도 를 간소화 하여 사용 하기 편 한 것 같 습 니 다.
CGLIB 의 실현 을 보 세 요.

public class MyClass {
    public void method() {
        System.out.println("MyClass.method()");
    }
}
import java.lang.reflect.Method;
 
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.MethodInterceptor;
 
public class Main implements MethodInterceptor{
 
    public static void main(String[] args) {
 
        Enhancer enhancer = new Enhancer();
        //      
        enhancer.setSuperclass(MyClass.class);
        enhancer.setCallback(new Main());
 
        //       (     MyClass )
        MyClass my = (MyClass)enhancer.create();
 
        my.method();
    }
    public Object intercept(Object obj, 
                                Method method, 
                                Object[] args, 
                                MethodProxy proxy) throws Throwable {
 
            System.out.println(obj.getClass().getName());
 			
            proxy.invokeSuper(obj, args);
 
            return null;
        }
}

이 프로그램 을 실행 할 때 cglib 가방 뿐만 아니 라 ASM 가방 도 가입 해 야 하 며, 호환성 문제 에 도 주의해 야 합 니 다. spring 이나 hibenate 가방 을 직접 사용 하면 됩 니 다.
자바 와 유사 한 동적 에이전트 이지 만 동적 에이전트 보다 좋 습 니 다. 동적 대 리 는 인 터 페 이 스 를 바탕 으로 하고 CGLIB 는 클래스 를 대상 으로 이 루어 집 니 다.
CGLIB 는 프 록 시 클래스 의 하위 클래스 를 동적 으로 만들어 기능 을 확장 한 것 이다.
인용 하 다.
Hibernate 는 주로 cglib 를 이용 하여 pojo 의 하위 클래스 를 생 성하 고 override get 방법 으로 lazy loading 체 제 를 실현 하 며, Spring 은 cglib 를 이용 하여 동적 대 리 를 실현 합 니 다.
----------------------------------------------------------------------
CGLIB 의 간단 한 사용 과 강력 한 기능, 관건 은 ASM. ASM 이 클 라 스 파일 을 직접 조작 하 는 데 있다.
Java 클래스 파일
java.lang.OutOfMemoryError引来的一系列之Java字节码操控
ASM 에 서 는 PUSH 모델 (Vistor 모드), 어댑터 및 Chain - of - responsibility 모드 를 사용 합 니 다.
인용 하 다.
바이트 코드 구 조 를 처리 해 야 하기 때문에 Vistable 인 터 페 이 스 를 추상 화 할 필요 가 없고 Visitor 인터페이스 만 제공 해 야 합 니 다.이른바 Visitor 모드 는 Iterator 모드 와 약간 유사 한데, 그것들 은 모두 복잡 한 데이터 구 조 를 옮 겨 다 니 는 데 쓰 인 다.Visitor 는 사용자 가 파견 한 대표 에 해당 하 며 알고리즘 내부 에 깊이 들 어가 알고리즘 에 의 해 방문 일정 을 배정 합 니 다.Visitor 대 표 는 바 꿀 수 있 지만 알고리즘 절차 에 간섭 할 수 없 기 때문에 수 동적 입 니 다. 이것 은 Iterator 모델 이 사용자 가 주동 적 으로 알고리즘 을 파견 하 는 방식 과 가장 큰 차이 점 입 니 다.
다른 바이트 코드 조작 라 이브 러 리 와 비교 할 수도 있 습 니 다.
BCEL
http://www-128.ibm.com/developerworks/cn/java/j-dyn0414/index.html

좋은 웹페이지 즐겨찾기