본문 바로가기

전체 글

(227)
[A Java bytecode engineering library] 1. Introduction 1.1. Motivations 프로그램 분석, 생성 및 변환은 다양한 상황에서 유용하게 사용될 수 있는 기술이다. • 프로그램 분석은 간단한 구문 분석부터 전체 의미 분석에 이르기까지 다양하며, 응용 프로그램에서 잠재적인 버그를 찾거나 사용되지 않는 코드를 탐지하고, 코드를 역공학하는 데 사용될 수 있다. • 프로그램 생성은 컴파일러에서 사용되며, 이는 전통적인 컴파일러뿐만 아니라 분산 프로그래밍을 위한 스텁 또는 스켈레톤 컴파일러, 실시간 컴파일러 등을 포함한다. • 프로그램 변환은 프로그램을 최적화하거나 난독화하고, 응용 프로그램에 디버깅 또는 성능 모니터링 코드를 삽입하며, 관점 지향 프로그래밍 등에 사용될 수 있다. 이러한 기술들은 모든 프로그래밍 언어에 사용될 수 있지만, 언어에 따라 수행하기가..
[tomcat] catalina.sh (difference between java_opts and catalina_opts) [Backup 240124] 톰캣 내부에 agent 모델을 심을 일이 있었는데, catalina.sh(envset.sh) 안에 코드에서 궁금한 점이 있었다. 1. CATALINA_OPTS 사용 CATALINA_OPTS="$CATALINA_OPTS -javaagent:[scouter agent 경로]/scouter.agent.jar" export CATALINA_OPTS 2. JAVA_OPTS 사용 #Scouter Agent Setting SCOUTER_AGENT_DIR="" COLLECTOR_SERVER_IP="192.168.56.1" export JAVA_OPTS="$JAVA_OPTS -javaagent:${SCOUTER_AGENT_DIR}/scouter.agent.jar" export JAVA_OPT..
[Linux] nohup shell script 실행 불가 [240123 백업] centos nohup 스크립트 실행 불가 문제가 발생했다. 'nohup failed to run command 'java' no such file or directory' 문제. 즉, 자바를 읽지 못하는 문제이다. 문제 상황 1. /etc/progfile에 JAVA_HOME PATH 저장 후 root 계정과 chshin 계정 전부 적용됨을 확인한 상태이다. 두 계정 전부 echo $JAVA_HOME이나, java -version 등을 통해 성공적으로 경로가 등록되었다. 2. root 계정은 ./startup.sh 스크립트가 정상적으로 실행된다 (Scouter). 하지만 chshin의 경우 'nohup: redirecting stderr to stdout nohup: failed t..
[ASM][TreeAPI]Tree API에서 주로 사용하는 클래스 및 메서드 개요 Tree API에서 주로 사용하는 클래스 및 메서드에는 여러 가지가 있다. 기본적으로 ClassNode, MethodNode, InsnList가 중요한 역할을 하지만, 이 외에도 여러 유용한 클래스와 인터페이스가 있다. 여기에는 다음과 같은 것들이 포함된다. ClassNode : 클래스 노드. 트리 노드의 최상단 부모라고 생각하자. MethodNode : 클래스의 메서드를 나타낸다. 메서드의 접근 지정자, 이름, 설명 등을 포함할 수 있다. FieldNode: 클래스의 필드를 나타낸다. 필드의 접근 지정자, 이름, 설명, 초기값 등을 포함할 수 있다. AnnotationNode: 어노테이션을 나타낸다. 어노테이션의 설명자와 값들을 포함한다. VarInsnNode: 메서드의 지역 변수를 나타낸다. 변..
[JVM] 실행 엔진(Execution Engine)과 JIT, 인터프리터 참조 : https://inpa.tistory.com/entry/JAVA-%E2%98%95-JVM-%EB%82%B4%EB%B6%80-%EA%B5%AC%EC%A1%B0-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD-%EC%8B%AC%ED%99%94%ED%8E%B8 ☕ JVM 내부 구조 & 메모리 영역 💯 총정리 저번 포스팅에서는 JRE / JDK / JVM에 대해서 간략하게 알아보는 시간을 가졌다면, 이번 포스팅에서는 JVM의 내부 구조에 대해 좀 더 자세하게 알아보도록 할 예정이다. JVM(자바 가상 머신)은 자바 언 inpa.tistory.com https://coding-factory.tistory.com/828 [Java] 자바 JVM 내부 구조와 메모리 구조에..
[troubleshooting][ClassLoader]동적 클래스로더와 계층 관계 개요와 문제 상황 Instrument API를 사용한 개발 도중, 기본 클래스로더가 아닌, 내가 만든 ClassLoader를 사용하여 동적 클래스를 로드하려고 시도하였다. 이 과정에서 확인차 ForName 등으로 Class 정보를 가져왔는데, 새롭게 얻은 지식을 정리하고자 한다. premain public static void premain(String agentArgs, Instrumentation instrumentation) { Banner.send(agentArgs); //로그 찍기 ConfigRead configRead = new ConfigRead(); //Config Read //CallThread.run(); JMX 쓰레드 생성 및 호출 //새로운 클래스를 생성하는 로직 try { Make..
[JVM]JVM과 ClassLoader 그리고 JIT의 관계 개요 JVM에서 컴파일러에 의해 번역된 Class 바이트코드들은 jar이 빌드되면 '부트스트랩 클래스로더' - '확장 클래스로더' - '시스템 클래스로더'를 읽어가면서 Runtime Area에 메타데이터와 Class 정보들을 저장한다. 이 방식만 보면 Java는 인터프리터라고 할 수 있을 것 같은데 왜 컴파일 방식을 혼합하여 사용한다고 하나? 라는 질문을 보았다. 이에 대해 조사하고, 답변하고자 한다. Java가 인터프리터가 아닌 이유 Java는 "컴파일된 인터프리터 언어"로 종종 설명된다. 이는 Java 프로그램이 바이트코드로 컴파일된 후, Java Virtual Machine(JVM)에서 실행되기 때문이다. Java Virtual Machine(JVM)에서 바이트코드를 처리하는 방식은 실제로 컴파일러..
[A Java bytecode engineering library] - [Tree API] 7. Method 개인 학습 정리 MethodNode public class MethodNode extends MethodVisitor { public int access; // 메서드의 접근 제어자. 예: ACC_PUBLIC, ACC_PRIVATE 등 public String name; // 메서드 이름 public String desc; // 메서드 서술자(descriptor). 매개변수와 반환 타입 포함 public String signature; // 메서드 시그니처. 제네릭 정보 포함 public List exceptions; // 메서드가 던질 수 있는 예외 타입 목록 public List parameters; // 메서드 매개변수 목록 public List visibleAnnotations; // 런타임에서 ..