자바 성능 모니터링 도구

  • profiling
  • APM
    • scouter (LG) : 제니퍼와 유사함 , 리얼타임
    • pinpointer (Naver) : 사후 분석

서버의 성능은 ? - TPS

서버의 성능을 늘리려면 ? -> 서버를 늘린다!  단, 병목을 잡아줘야함 병목현상 -> 주로 CPU에서 발생함.

잘 설계된 서비스라면 DB에서 부하가 일어남

BCI - Byte Code Instrument

함수 전/후에 원하는 코드를 삽입하여 실행 시킬 수 있다 앞뒤로 성능 측정하는 코드를 넣고, 상태를 확인하는 식으로 구현한다. 프로파일 같은 경우 JVM을 변경하여 사용하기도 한다.


로그 - log

로그파일 (log file)

피크때는 몇기가씩 쌓이기도함. 서비스에 따라서 10분단위 / 시간단위 / 날짜단위로 파일을 저장한다 로그가 쌓이면 -> 디스크 풀 -> 망함!! (터미널도 접속못함) 디스크를 수시로 확인해야 한다 -> du / df 명령어를 통해서 디스크를 확인 로그는 요청이 나갈때 찍힌다

메모리/cpu등 어떤 문제가 생긴다!! -> L4 끊고 로그를 확인해봐야됨. ( 요청이 나갈때 처리되기 때문 ) 도저히 못찾으면? -> 밤마다 껏다키는 스크립트라도??

성능측정 - (각종 지표)

일반적인 데이터는 평균이나 중간값이나 비슷함. WAS응답속도의 경우 중간값이 더 크다.

분산, 표준편차가 크다 -> 응답 속도가 들쭉날쭉하다 95th, 99th  -> 95%, 99%의 사용자는 어떤 성능을 보장한다는 의미로 사용함



Abstract ? Interfae?

Abstract (extends) 확장!

중간역할. 비슷한 코드가 여러번 나올때 그것을 모아서 구현해 놓고 사용

Interface (implements) 구현!

다중상속 불가능 함수를 반드시 구현해야한다. 내부를 모르더라도 그 기능을 하는 함수를 밖에서 사용 할 수 있게 . (User Interface처럼)

  
Abstract classInterface
1) Abstract class can have abstract and non-abstract methods.Interface can have only abstract methods. Since Java 8, it can have default and static methods also.
2) Abstract class doesn’t support multiple inheritance.Interface supports multiple inheritance.
3) Abstract class can have final, non-final, static and non-static variables.Interface has only static and final variables.
4) Abstract class can provide the implementation of interface.Interface can’t provide the implementation of abstract class.
5) The abstract keyword is used to declare abstract class.The interface keyword is used to declare interface.
6) Example:
public abstract class Shape{
    public abstract void draw();
}
Example:
public interface Drawable{
   void draw();
}

Static

static 으로 선언된 변수는 Class에 하나다, WAS에 올릴 경우 이 데이터는 계속 쌓이게 되고 메모리 릭의 원인이 된다 - 조심해서쓰자

static block - 값을 초기화 할때 ( Map 같이 초기화할때 new 하고나서 값넣기 등 더해야 하는 경우)

public class StaticImportSample
{
    static String rookie;
    static Map\\<String,String\\> map
    static {
        rookie = "test"
        map = new HashMap\\<String,String\\>();
        map.put("key", "value");
    }
}

Lambda

오라클 - **lambda Quick Start - **http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html#section1

 package java.awt.event;
 import java.util.EventListener;

 public interface ActionListener extends EventListener {
    public void actionPerformed(ActionEvent e){
        system.out.println(e.getSources());
    {
}

인터페이스안에 메소드가 하나밖에 없는경우! 이렇게 Lambda 쓸 수 있음.

ActionListioner listener2 = e-\\>  System.out.println(e.getSourcesI();
ActionListioner listener2 = e-\\> {
    //여러줄 가능
    System.out.println(e.getSourcesI());
};

Stream

public class Sample { public static void main(String[] argv) { List multiplesOf3 = new ArrayList<>(); for (long loop = 1; loop < 10; loop++) { multiplesOf3.add(loop); }

	multiplesOf3.stream()
	.filter(i-\> i%3==0 && i!=0)
	.forEach(System.out::println);		
} }

stream 으로 각종 다양한 일을 할 수 있다 .filter() .sort() .map() …

자세한건 여기,,,. http://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams-2177646.html

GC - garbage

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

필요없는것은 지워줘야함.

과정

  1. Marking
  2. Normal Deletion 2a : Deletion with Compacting

Generation Garbage Collection Process

hotspot Heap Structure

1. 처음에는 무조건 Eden 으로감 2. Eden 꽉차면 - 필요없는거 지우고 servivor copy - 한쪽으로만 모음 3. Eden 꽉차면 -\> 옮기고\, servivor 은 count 가 1씩 증가됨 .. 6, 늙은 애들(count > threshold) Tenured로 이동한다

young 쪽이 빠름! old쪽이 느림! young 쪽에서 쓸모없는거 지우고, 오래 살아 남은건 오래 살아남을 가능성이 높으니 더 보관하다

OOP


+ Recent posts