728x90

학습(구)/Java(구) 36

자바성능튜닝 - JVM

HotSpot VM - 자바 성능을 개선하기 위해 JIT(Just In Time) 컴파일러를 만들었습니다. - JIT 컴파일러 : 프로그램의 성능에 영향을 주는 지점에 대해서 지속적으로 분석하여 분석된 지점은 부하를 최소하 하고 높은 성능을 내기 위한 최적화의 대상이 됩니다. - HotSpot VM은 VM 런타임, JIT 컴파일러, 메모리 관리자로 구성되어져 있습니다. - HotSpot VM 런타임에 GC방식과 JIT 컴파일러를 맞추어 사용할 수 있습니다. - VM 런타임은 JIT 컴파일러용 API와 GC용 API를 제공하며 JVM을 시작하는 런처와 스레드 관리, JNI 등을 제공합니다. JIT Optimizer - Client 버전과 Server 버전으로 나뉘어져 있습니다. - JIT는 각 메서드를 컴..

자바 성능 튜닝 - 서버 세팅

성능테스트를 통해서 병목 지점을 미리 파악하는 것이 좋은데 문제가 될만한 세팅 값을 먼저 진단하는 것이 효율적입니다. - 웹 서버 세팅 - WAS 서버 세팅 - DB 서버 세팅 - 장비 세팅 웹 서버 설정 - 웹 서버는 WAS 앞에 두어야 합니다. 정적인 부분은 웹 서버에서 처리해야 합니다. 그렇지 않으면 WAS 에서 웹 서버 역할까지 수행해야 하므로 많은 리소스들이 낭비되게 됩니다. - 아파치 웹 서버는 MPM을 사용하는데 MPM은 Multi - Processing Module의 약자로 여러 개의 프로세싱 모듈 기반의 서비스를 제공한다는 의미입니다. - 설정 파일에 ThreadsPerChild는 웹 서버가 사용하는 스레드의 개수를 지정하며 아파치 프로세스 하나당 지정한 수만큼 스레드가 생성됩니다. - ..

자바 성능 튜닝 - xml/json

xml과 json 을 사용할 경우 시스템의 성능이 안 좋아질 수 있기 때문에 상황에 맞게 사용해야 합니다. xml의 큰 장점은 누구나 데이터의 구조를 정의하고 그 구조를 공유함으로써 일관된 데이터 전송 및 처리가 가능하다는 것입니다. 이러한 특성 때문에 파싱 작업이 필요합니다. SAX는 순차적으로 XML을 처리합니다. XML의 노드를 읽는대로 처리하기 때문에 메뢰에 부담이 DOM에 비해서 많지 않습니다. 읽은 데이터의 구조를 수정하거나 삭제하기 어렵습니다. DOM은 모든 XML을 읽어서 트리를 만든 후 XML을 처리하는 방식입니다. 모든 XML을 메모리에 올려서 작업하기 때문에 메모리 부담이 가게 됩니다. 추가, 수정,삭제하기 쉬운 구조로 되어져 있습니다. XSTL은 SAX, DOM, InputStrea..

자바 성능 튜닝 - DB사용

JDBC 관련 API는 인터페이스 입니다. 1. 드라이버 로드 2. DB서버의 DriverManager 클래스의 getConnection 메서드를 사용해 Connection 객체 생성 3. Connection으로 부터 PreparedStatement 객체 받음 4. executeQuery를 수행해 결과로 ResultSet 객체를 받아 데이터 처리 5. 모든 데이터 처리후 finally 구문을 사용해 ResultSet, PreparedStatement, Connection 객체를 예외처리하며 close 주로 Connection을 생성하는 부분에서 성능이 저하됩니다. 그러므로 Connection Pool을 이용합니다. DataSource를 이용해 Connection Pool을 생성합니다. Statement와..

자바 성능 튜닝 - 웹 개발(JSP/서블릿/스프링)

WAS 에서 병목 현상이 발생할 수 있는 부분은 서버쪽의 UI부분과 비즈니스 로직 부분으로 나눌 수 있습니다. JSP와 서블릿으로 서버단의 UI를 구성합니다. JSP는 가장 처음에 호출되는 경우에만 시간이 소요되고 그 이후에는 컴파일된 서블릿 클래스가 수행됩니다. JSP 라이프 사이클 1. JSP URL 호출 2. 페이지 번역 3. JSP 컴파일 4. 클래스 로드 5. 인스턴스 생성 6. jspInit 메서드 호출 7. _jspService 메서드 호출 8. jspDestory 메서드 호출 => JSP 페이지가 이미 컴파일 및 클래스 로드가 되어져 있고 JSP 파일이 변경되지 않았다면 2~4 프로세스는 생략됩니다. Pre- compile : 서버 종류에 따라 서버가 기동될 때 컴파일을 미리 수행하는 옵션..

자바 성능 튜닝 - 로그

대부분 로그를 찍기 위해 System.out.println()메서드를 사용한 시스템 로그를 많이 사용합니다. 해당 방법은 커널 CPU의 사용량이 높아 성능에 영향을 미칩니다. 파일이나 콘솔에 로그를 남길때 내용이 완전히 프린트되거나 저장이 될때 까지 뒤에 프린트 하려는 부분은 대기가 되어지기때문에 대기시간이 발생하게 됩니다. 로그 출력은 개발할 때만 사용하므로 운영할 때 println()은 성능에 무리를 주게 됩니다. System.out.format()은 C언어 처럼 프린트 할 수 있으므로 소스를 간결하게 처리할 수 있습니다. String.format은 컴파일시 변환된 부분을 보면 새로운 Object를 생성하여 표현할 값을 배열에 포함시키게 하고 Long값의 경우에는 valueOf()메서드를 사용해 Ob..

자바 성능 튜닝 - I/O에서 발생하는 병목 현상

자바의 입출력은 스트림을 통해서 이루어 집니다. 어떠한 디바이스 혹은 네트워크를 통해 이루어지는 작업을 모두 IO에 포함되는 작업입니다. IO작업은 성능에 많은 영향을 미치는데 IO에서 발생하는 시간은 CPU를 사용하는 시간과 대기 시간중 대기시간에 속하기 때문에 IO와 관련된 다비이스가 느리면 느릴수록 성능은 느려지게 됩니다. 바이트 기반 입력 스트림 처리 클래스 ByteArrayInputStream FileInputStream FilterInputStream ObjectInputStream PipedInputStream SequenceInputStream 입력 스트림 읽기 클래스 BufferedReader CharArrayReader FilterReader FileReader InputStreamRe..

자바 성능 튜닝 - Synchronized

클래스를 한 수행하거나 WAS를 기동하면 서버에 자바 프로세스가 생성이 됩니다. 하나의 프로세스에는 여러개의 스레드가 생성이됩니다. 단일 스레드가 생성되어 종료될 수도 있고 여러 개의 스레드가 생성되어 수행될 수도 있습니다. 스레드 - Thread 클래스를 상송 받는 방법과 Runnable 인터페이스를 구현하는 방법 두 가지가 있습니다. 기본적으로 Thread클래스는 Runnable 인터페이스를 구현한 것이기 때문에 어느 것을 사용해도 차이가 없지만 Runnable 인터페이스를 구현하면 원하는 기능을 추가할 수 있습니다. 그러나 이 방법을 사용하기 위해서는 해당 클래스 사용시 별도의 스레드 객체를 생성해야 하는 점이 있습니다. 또한 자바는 다중 상속을 지원하지 않으므로 이미 상속받은 클래스가 존재하면 R..

자바 성능 튜닝 - reflection

자바에는 reflection 패키지를 이용해 JVM에 로딩되어져 있는 클래스와 메서드의 정보를 알 수 있습니다. Class 클래스 - 클래스에 대한 정보를 얻을 때 사용하기 좋고 생성자는 따로 존재하지 않습니다. - 주로 Object클래스의 getClass()를 사용해 가져옵니다. - 각 메서드를 통해 클래스, 필드, 메서드, 생성자 와 같은 정보를 가져올 수 있습니다. Method 클래스 - 메서드에 대한 정보를 얻을 수 있고 생성자가 따로 없어 Method클래스의 정보를 얻기 위해서 Class클래스의 메서드를 사용해야합니다. - Method클래스의 각 메서드를 통해 메서드의 이름, 매개변수, 리턴 타입 등에 대한 정보를 가져올 수 있습니다. Field 클래스 - 클래스에 있는 변수들의 정보를 제공하기..

자바 성능 튜닝 - static

웹 리턴 코드 200 : 정상 적인 경우 300 : 리다이렉션이 필요한 코드 400 : 클라이언트 오류 500 : 서버 오류 자바에서 static으로 변수를 생성할 경우 객체의 변수가 아닌 클래스의 변수가 됩니다. 클래스의 인스턴스를 생성하더라도 모든 객체가 static 변수에 대해서 동일한 주소의 값을 리턴하게 됩니다. 따라서 객체를 생성하지 않고 클래스를 통해서도 접근할 수 있으며 인스턴스와 클래스 모두 동일한 주소를 가리키게 됩니다. static 블록의 경우 인스턴스 생성과 별개로 클래스가 로딩될때 수행되고 위치도 상관이 없습니다. 또한 여러번 사용할 수 있고 GC 대상에 포함되지 않고 순차적으로 실행이 됩니다. 하나의 JVM이나 WAS에서는 하나의 주소만 가르키고 있기 때문에 조심해서 사용해야 합..