Java Memory 구조와 내용에 대해서 정리한 PPT 입니다.
회사에서, 서버가 메모리 누수가 발생하여 뻗는 사건이 생겨서 팀원들이 전부 공부를 해서 발표를 했습니다.
GC는 Heap 영역에서 일어납니다.
메서드 영역 : 클래스 놀이터 입니다.
힙 영역 : 생성된 객체 및 배열 놀이터 입니다.
스택 영역 : 메서드 놀이터 입니다.
탑크리에듀(http://www.topcredu.co.kr),오라클자바커뮤니티(http://ojc.asia)에서 제공하는 초보자를 위한 닷넷, C# 기초강좌 입니다. 이번강좌에서는 쓰레드에 대해 간단히 살펴보고 C#에서 멀티 쓰레드로 프로그래밍 하는 방법을 실습하는 강좌입니다.
동영상으로 보시려면 페이스북(http://www.facebook.com/topcredu.co.kr) 또는 유튜브(https://www.youtube.com/playlist?list=PLy5poRzDk4ypnjylVgzAo8RVWgiBzvz73&disable_polymer=true)에서 확인 기능합니다.
탑크리에듀(http://www.topcredu.co.kr),오라클자바커뮤니티(http://ojc.asia)에서 제공하는 초보자를 위한 닷넷, C# 기초강좌 입니다. 이번강좌에서는 쓰레드에 대해 간단히 살펴보고 C#에서 멀티 쓰레드로 프로그래밍 하는 방법을 실습하는 강좌입니다.
동영상으로 보시려면 페이스북(http://www.facebook.com/topcredu.co.kr) 또는 유튜브(https://www.youtube.com/playlist?list=PLy5poRzDk4ypnjylVgzAo8RVWgiBzvz73&disable_polymer=true)에서 확인 기능합니다.
AWS EMR을 사용하면서 비용을 최적화하기 위해 필요한 다양한 관점의 방안을 검토하여 정리한 자료.
비용 최적화 대상은 zeppelin/jupyter notebook과 apache spark를 활용하는 서비스를 대상으로 하였으며, 해당 작업이 aws emr에서 어떻게 동작하는지 내부 구조을 파악하여 확인함.
- AWS EMR이란?
- AWS EMR의 과금 방식은?
- 어떻게 비용을 최적화 할 것인가?
- 최적의 EMR 클러스터 구성 방안
- 가성비 높은 Instance 선정 방안
- Apache Spark 성능 개선 방안
가장 중요한 것은 실행할 job의 자원사용량/성능을 모니터링하고, 이에 맞게 자원을 최적화하는 것이 필요함.
자바스크립트 스터디 하면서, 발표했던 자료.
(각자 맡은 부분에 대한 개념 정리해서 발표)
JavaScript 중요 개념인 실행컨텍스트와 클로저에 대해서 정리가 되어있다. (업로드 하면서 다시 봤는데. 여전히 어렵고 헷갈린다)
실행컨텍스트는 자바스크립트에 실행환경 등의 정보를 확인하는 도구로 이해하면 된다.
- 참조 : 인사이드 자바스크립트
REST에 대한 내용을 정리한 PPT 입니다.
많은 내용이 있지만 축약 또는 이해되는 내용만 정리를 하려고 하다보니 빠진 부분이 있을 수 있습니다.
REST는
1. URI와 HTTP Method를 이용해 객체화된 서비스에 접근하는 것.
2. HTTP URI로 잘 표현된, 리소스에 대한 행위를 HTTP Method에 정의 리소스에 내용은 json, xml, yaml 등의 다양한 언어로 정의.
3. 하나의 URI는 하나의 고유한 리소스를 대표하도록 설계된다는 개념.* REST는 표준이 아님 + REST는 프로토콜이 아님.
결론적으로 REST API를 사용하는 궁극적인 목적은
서로 다른 플랫폼(OS, 개발언어)에서 데이터를 주고받기 위해서와 범용 인터페이스(HTTP/URI)를 만들어서 각 API를 독립적으로 배포하기 위함이다.
객체지향에 관련해서, 가볍게 내용을 정리하였습니다.
참고서적 : 스프링 입문을 위한, 자바 객체 지향의 원리와 이해 김종민 지음
객체지향.
말은 참 어려운데. 프로그래밍 하면서 사람이 인식하는 사물 또는 실체를 하나하나 조합해서 프로그래밍 하자는 패러다임입니다.
쉽게, 객체를 가지고 놀자 이겁니다.
객체지향언어에서는
클래스(Class) 객체(Object)가 존재합니다.
클래스는 추상화 및 분류
객체는 실제를 의미합니다.
예) 사람클래스 -> 원빈 객체 / 동물 클래스 -> 고양이 객체
4대 특징
- 캡슐화
- 상속
- 추상화
- 다형성
객체지향 개념을 완벽히 이해하려면. 많이 공부해야 할거같습니다..ㅠㅠ
TDD 테스트 주도 개발이며, 하나의 개발 방법론 입니다.
- TDD는 반복 테스트을 이용한 소프트웨어 개발법이다. 작은 단위의 테스트 케이스를 작성하고 이를 통과하는 코드를 추가하는 단계를 반복하여 소프트웨어를 구현한다.
- TDD의 목표는 작동하는 깔끔한 코드 “Clean code that works”
- TDD는 아래 단계의 반복으로 진행된다.
빨강 : 실패하는 작은 테스트 케이스를 작성한다. 처음에는 컴파일조차 안될 수 있다.
초록 : 테스트를 통과하는 코드를 작성한다.
리펙터링 : 테스트를 통과하기 위해 만든 코드의 모든 중복을 제거하고, 불명확한 것을 명확히 한다.
이러한 단계로 인해 TDD는 “업무 코드 작성 전에 테스트 코드를 먼저 만드는 것”으로 정의되기도 한다
Spring Framework 에서 중요한 개념인 DI(의존성 주입)에 대해서, 정리하였습니다.
DI(Dependency Injection) 란?
- 스프링 IoC 컨테이너 핵심 개념 중 하나
- 다양한 프레임워크에 이미 적용되어 있는 기능
- 객체 간의 의존 관계를 외부의 조립기가 관리
- 불필요한 의존 관계를 없애거나 줄일 수 있음
- 단위테스트 수행 수월
- 설정파일과 애노테이션을 이용하여 객체 간의 의존 관계를 설정
- 각 객체를 빈(bean)으로 관리
4. 01
Method (Static) Area : JVM이 읽어들인 클래스와 인터페이스 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static 변수),
생성자와 메소드를 저장하는 공간이다.
(*.class들을 클래스 로더로 읽어 클래스별로 런타임 상수풀, 필드 데이터, 메소드 데이터, 메소드 코드, 메소드 생성자 코드 등을
분류해서 저장. 메소드 영역은 JVM이 시작할 때 생성되고, 모든 스레드가 공유하는 영역)
Runtime Constant Pool : 메소드 영역에 포함되지만 독자적 중요성이 있다, 클래스 파일 constant_pool 테이블에 해당하는 영
역이다, 클래스와 인터페이스 상수, 메소드와 필드에 대한 모든 레퍼런스를 저장한다, JVM은 런타임 상수 풀을 통해 해당 메소
드나 필드의 실제 메모리 상 주소를 찾아 참조한다
* 메소드 영역/런타임 상수 풀의 사용기간 및 스레드 공유 범위
- JVM 시작시 생성
- 프로그램 종료 시까지
- 명시적으로 null 선언 시
- GC(Garbage Collection) 대상
- 구성 방식이나 GC 방법은 JVM 벤더마다 다를 수 있다.
- 모든 스레드에서 공유한다.
5. 01
Heap Area : JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다.
- New 연산자로 생성된 객체 또는 객체(인스턴스)와 배열을 저장한다.
- 힙 영역에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
- 참조하는 변수나 필드가 없다면 의미 없는 객체가 되어 GC의 대상이 된다.
(Heap Area는 Object와 Array가 생성되는 영역, 힙 영역에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에
서 참조, 참조하는 변수나 필드가 없다면 의미없는 객체가 되기 때문에 이것을 쓰레기로 취급하고 JVM GC를 실행시켜 쓰레기
객체를 힙 영역에서 자동으로 제거)
* 힙 영역의 사용기간 및 스레드 공유 범위
- 객체가 더 이상 사용되지 않거나 명시적으로 null 선언 시
- GC(Garbage Collection) 대상
- 구성 방식이나 GC 방법은 JVM 벤더마다 다를 수 있다.
- 모든 스레드에서 공유한다.
6. 01
Stack Area : 각 스레드마다 하나씩 존재하며, 스레드가 시작될 때 할당된다.
- 메소드를 호출할 때마다 프레임(Frame)을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행한다.
- 선입후출(FILO, First In Last Out) 구조로 push와 pop 기능 사용
- 메소드 호출 시 생성되는 스레드 수행정보를 기록하는 Frame을 저장
- 메소드 정보, 지역변수, 매개변수, 연산 중 발생하는 임시 데이터 저장
- 기본(원시)타입 변수는 스택 영역에 직접 값을 가진다.
- 참조타임 변수는 힙 영역이나 메소드 영역의 객체 주소를 가진다.
7. 01
PC Register :
- 현재 수행 중인 JVM 명령 주소를 갖는다.
- 프로그램 실행은 CPU에서 인스트럭션(Instruction)을 수행.
- CPU는 인스트럭션을 수행하는 동안 필요한 정보를 CPU 내 기억장치인 레지스터에 저장한다.
- 연산 결곽값을 메모리에 전달하기 전 저장하는 CPU 내의 기억장치
(보통 CPU가 명령어를 처리 하는 과정에서 수행하는 동안 필요한 정보를 Register라는 CPU내의 기억장치에 저장해 둔다. 이는
CPU에 종속적 일 수 밖에 없다. 그렇기 때문에 자바의 철학을 실현하기 위해서는 이러한 CPU내의 Register의 역할을 JVM상에
논리적인 메모리 영역으로 구현.)
Native Method Stack Area :
- 자바 외 언어로 작성된 네이티브 코드를 위한 Stack이다.
- 즉, JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 스택이다.
- 네이티브 메소드의 매개변수, 지역변수 등을 바이트 코드로 저장한다.
8. 01
A Java method is generically a code block with a name that you can write using plain java.
public void method() {
System.out.println("I'm a java method!");
}
A native method is a method that is linked to a native library.
Native libraries are linked to a java program through JNI (Java Native Interface) or JNA (Java Native Access) and a native m
ethod looks like this:
public native void method();
9. 01
Main.java:
public class Main {
public native int intMethod(int i);
public static void main(String[] args) {
System.loadLibrary("Main");
System.out.println(new Main().intMethod(2));
}
}
Main.c:
#include <jni.h>
#include "Main.h"
JNIEXPORT jint JNICALL Java_Main_intMethod( JNIEnv *env, jobject obj, jint i) {
return i * i;
}
Compile and run:
javac Main.java
javah -jni Main
gcc -shared -fpic -o libMain.so -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux Main.c
java -Djava.library.path=. Main
Output:
4
10. 02
Young Generation: 이 영역은 자바 객체가 생성되자마자 저장되고, 생긴지 얼마 안되는 객체가 저장되는 공간이다. 시간이 지
나 우선순위가 낮아지면 Old 영역으로 옮겨진다. 이 영역에서 객체가 사라질 때 Minor GC가 발생한다.
Old(Tenured) Generation: Young Generation 영역에서 저장되었던 객체 중에 오래된 객체가 이동되어 저장되는 영역이다. 이
영역에서 객체가 사라질 때 Major GC(Full GC)가 발생한다.
Permanent Generation: 클래스 로더에 의해 로드되는 클래스, 메소드 등에 대한 메타 정보가 저장되는 영역으로 JVM에 의해
사용된다. 리플렉션을 사용하여 동적으로 클래스가 로딩되는 경우에 사용된다. 내부적으로 리플렉션 기능을 자주 사용하는
Spring Framework를 이용할 경우 이 영역에 대한 고려가 필요하다.
11. 03META SPACE And PERMANENT
PermGen은 무엇인가?
Permanent Generation은 힙 메모리 영역중에 하나로 자바 애플리케이션을 실행할때 클래스의 메타데이터를 저장하는 영역이
다.(Java 7기준)
자바 개발자라면 OutOfMemoryError: PermGen Space error이 발생했던것을 본적이 있을텐데 이는 Permanent Generation
영역이 꽉 찼을때 발생하고 메모리 누수가 발생했을때 생기게 된다. 메모리 누수의 가장 흔한 이유중에 하나로 메모리에 로딩된
클래스와 클래스 로더가 종료될때 이것들이 GC(가비지 컬렉션)이 되지 않을때 발생한다.
Permanent space :
- java class, method Code등이 저장 되는 영역.
- Class에 대한 Meta 정보를 저장하는 공간. (Permanent Space는 Java Heap의 하위 영역).
1. -X Option (모든 VM에서 동작하지 않을 수 있
는 비표준 option이며, 버젼별로 언급없이 변경
되어질 수 있음)
-Xms : 초기 Heap size 설정
-Xmx : 최대 Heap size 설정
-Xss : 각 Thread에 할당되는 Stack size 설정
-Xmn : New 영역을 위한 Heap size 설정
2. -XX Option (올바른 동작을 위해 특정한 시스
템 요구사항들이 있으며, 시스템 설정 파라미터
에 대한 접근 권한이 요구됨)
-XX:PermSize : 초기 Permanent size 설정
-XX:MaxPermSize : 최대 Permanent size 설정
12. 03META SPACE And PERMANENT
OOE 발생원인(Out Of Memory)
1. 사용량 / 데이터 양이 급증. 응용 프로그램은 일정량의 사용자 또는 특정 양의 데이터를 처리하도록 설계되었습니다. 사용자
수가 많아 지거나 갑자기 데이터 양이 급격히 늘어나서 예상되는 임계 값을 초과하면 정상적으로 작동하기 전에 작동하는 작업
이 작동을 멈추고 java.lang.OutOfMemoryError : Java 힙 공간 오류가 트리거됩니다.
2. 메모리 누수. 특정 유형의 프로그래밍 오류로 인해 응용 프로그램이 지속적으로 더 많은 메모리를 소비하는 형태. 응용 프로
그램의 유출 기능이 사용될 때마다 Java 힙 공간에 몇 가지 객체가 남습니다. 시간이 지남에 따라 누출 된 오브젝트는 사용 가능
한 모든 Java 힙 공간을 소비하고 이미 익숙한 java.lang.OutOfMemoryError : Java 힙 공간 오류를 트리거합니다.
3. Servlet 변환, Reflection을 사용하여 동적으로 로딩되는 Class가 많은 경우에 발생할 수 있으며, WAS의 Class Reloading 기
능이 자주 실행 될 경우에도 발생할 수 있음. -> HEAP 또는 PERMANET
13. 03META SPACE And PERMANENT
Permanent Generation의 약자 인 PermGen은 JVM에서 클래스 및 메소드 객체를 저장하는 데 사용되는 Heap의 메모리 영역입
니다. 응용 프로그램에 많은 클래스가로드되면 PermGen 사용률이 높아집니다.
PermGen은 또한 'interned'문자열을 보유하고 있습니다. PermGen 공간의 크기는 Java 명령 행 옵션 -XX : MaxPermSize에 의해
구성됩니다 일반적으로 256MB는 대부분의 응용 프로그램에 필요한 PermGen 공간 이상이어야합니다. 그러나 비정상적인 수의
클래스를로드하는 경우 "java.lang.OutOfMemoryError : PermGen space"오류를 보는 것은 일반적이지 않습니다. PermGen 공간
으로 인해 OutOfMemory 오류가 발생했습니다.
Java 8에는 PermGen이 없습니다. 맞습니다. PermGen으로 인한 OutOfMemory 오류가 없어졌습니다. PermGen과
Metaspace의 주요 차이점은 PermGen은 Java 힙 (-Xmx 옵션으로 구성된 최대 크기)의 일부이지만 Metaspace는 힙의 일부가
아닙니다. 오히려 Metaspace는 호스트 운영 체제에 의해서만 제한되는 기본 메모리 (프로세스 메모리)의 일부입니다.
장점
PermGen 영역이 삭제되어 heap 영역에서 사용할 수 있는 메모리가 늘어났다.
PermGen 영역을 삭제하기 위해 존재했던 여러 복잡한 코드들이 삭제 되고 PermGen영역을 스캔 하기 위해 소모되었던 시간이 감소되어 GC
성능이 향상 되었다.
단점
더 이상 PermGen 공간이 부족하지는 않지만 (PermGen이 없으므로) 과도한 네이티브 메모리를 소비하여 전체 프로세스 크기가 커질 수 있
습니다. 문제는 응용 프로그램이 많은 클래스 (및 / 또는 문자열)를 로드하는 경우 실제로 응용 프로그램뿐만 아니라 전체 서버를 다운시킬
수 있다는 것입니다. 왜? 기본 메모리는 운영 체제에 의해서만 제한되기 때문입니다. 즉, 문자 그대로 서버의 모든 메모리를 차지할 수 있습
니다.
14. 03META SPACE And PERMANENT
MetaspaceSize 및 MaxMetaspaceSize가 새롭게 사용되게 되었다. 이 두 값은 Metaspace의 기본 값을 변경하고 최대값을 제한
할 수 있다.
MetaspaceSize
이 설정은 JVM이 사용하는 네이티브 메모리양을 변경하는데 사용된다. 시스템에서 기본으로 제공되는 것보다 더 많은 메모리
를 사용할 것이라고 확신할 경우 이 옵션을 사용하면 된다.
MaxMetaspaceSize
이 설정은 metaspace의 최대 메모리 양을 변경하는데 사용된다. 애플리케이션을 서버에서 동작시킬때 메모리 영역을 조절하고
싶거나 메모리 누수가 발생해서 시스템 전체의 네이티브 메모리를 사용해 버리지 않도록 하기 위해서 사용하면 된다. 만약
native 메모리가 꽉 찾는데도 애플리케이션이 메모리를 더 요구 한다면 java.lang.OutOfMemoryError: Metadata space가 발
생한다.
참고 : https://www.slideshare.net/faizanadnan/java-8-from-perm-gen-to-metaspace