참고링크 Orcal 문서 - Using Thread Dumps를 참고하여 번역한 포스팅입니다. 의역 오역이 있을 수 있습니다. 쓰레드 덤프란? 이 챕터는 Oracle JRockit JVM 쓰레드 덤프를 어떻게 얻고 사용하는지에 대해서 설명합니다. 그리고 기본적인 지식으로는 쓰레드와 쓰레드 동기화에 대해서 알고 있어야 합니다.쓰레드 덤프란 프로세스에 속한 모든 쓰레드들의 상태를 기록(snapshot)한 것입니다. 그리고 각 쓰레드들은 ‘스택 추적(stack trace)’ 형태로 보여집니다. 쓰레드들은 직접 실행시킨 Java 응용 프로그램의 쓰레드와 JVM 내부적으로 존재하는 쓰레드로 나뉘게 됩니다.쓰레드 덤프는 발생된 문제들을 분석하거나 혹은 응용 프로그램과 JVM의 성능을 최적화 하는데 도움을 주는 정보..
다이아몬드 문제 다중 상속을 지원하게 되면 하나의 클래스가 여러 상위 클래스를 상속 받을 수 있습니다. 이런 특징 때문에 발생하게 되는 문제가 있는데, 바로 '다이아몬드 문제' 입니다. 위의 클래스 다이어그램과 같은 상속 구조에서 발생되는 문제가 다이아몬드 문제입니다. 마치 모양이 다이아몬드 모양이라서 붙여진 이름 같습니다. 예를들어 GrandFather이라는 클래스가 myMethod() 라는 이름의 메소드를 가지고 있다고 가정해봅시다. 그리고 FatherA와 FatherB가 각각 오버라이딩하여 구현하였다면, FatherA와 FatherB를 모두 상속받은 Son 클래스 입장에서는 어떤 부모의 myMethod()를 사용해야 할까요? 이로 인하여 충돌이 생기게 됩니다. 코드로 나타내면 아래와 같은 모습입니다..
자바(JVM)의 메모리 사용 방식 프로그램을 실행시킬 때 CPU와 조화로운(?) 작업을 위해서 저장장치에 있던 내용들이 메모리에 올리가기 시작합니다. 메모리에 데이터들이 어떤 방식으로 올라가는지 이해하는 것은 더 나은 개발자가 되기 위한 필수 과정이라고 생각합니다. 메모리 구조를 알게 된다면, 클래스 멤버, GC(가비지 컬렉터), 쓰레드가 어떤식으로 독립적으로 운영되면서 공유하는 자원이 있는지에 대한 이해를 훨씬 더 쉽고 깊게 알 수 있습니다. 메모리는 크게 4가지 영역으로 나눌 수 있습니다. 로우레벨 개발자가 아니라면 주로 우측에 static 영역, stack 영역, heap 영역을 위주로 알고 있으면 됩니다. 이 세가지 영역을 간단히 T메모리라고 부르겠습니다. static 영역패키지나 클래스 정보가 ..
메소드(함수) 호출 방식 프로그래밍 언어에서 변수를 다른 함수의 인자로 넘겨 줄 수 있습니다. 이 때 이 변수의 '값'을 넘겨 주는 호출 방식을 Call by Value, 이 변수의 '참조값' (혹은 주소, 포인터)를 넘겨 주는 호출 방식을 Call by Reference라고 합니다. (이외에도 Call by Assignment, Call by Name 등의 개념이 있다고 들었습니다.) 자바는 Call by Value 방식으로 동작하게 되는데 이를 증명 해 볼 수 있는 대표적인 예제가 변수의 값을 바꿔보는 함수(메소드)가 있습니다. public static void main(String[] args) { int a = 1; int b = 2; swap(a, b); System.out.println(a);..
For-each vs For 자바에서 For-each 문이 전통적인 For문보다 더 빠르다는 정도만 알고 있엇는데, 특별하게 ArrayList에 경우는 오히려 For문이 더 빠르다는 얘기를 듣게 되었습니다. 실제로 얼마나 차이가 나는지 알아보고자 성능 테스트를 시도해보았습니다. 참고로, 여기서 말하는 For-each문과 For문은 아래와 같은 2가지 경우의 반복문을 말합니다. //For-each문 for (Integer integer : list) { integer++; } //For문 for (int i = 0; i < list.size(); i++) { Integer integer = list.get(i); integer++; } 테스트 코드 사이즈가 100인 List를 순차적으로 탐색해보았습니다. ..
Default Method 인터페이스는 기능에 대한 선언만 가능하기 때문에, 실제 코드를 구현한 로직은 포함될 수 없습니다. 하지만 자바8에서 이러한 룰을 깨트리는 기능이 나오게 되었는 데 그것이 Default Method(디펄트 메소드)입니다. 메소드 선언 시에 default를 명시하게 되면 인터페이스 내부에서도 로직이 포함된 메소드를 선언할 수 있습니다. (접근제어자에서 사용하는 default와 같은 키워드이지만, 접근제어자는 아무것도 명시하지 않은 접근 제어자를 default라고 하며 인터페이스의 default method는 'default'라는 키워드를 명시해야 합니다.) interface MyInterface { default void printHello() { System.out.println..
NullPointException 자바에서 Null이 들어 있는 데이터를 다룰 때, NullPointException을 발생시킬 가능성을 내포 하고 있어서 항상 주의해야 합니다. 아래 코드 처럼 null로 선언된 문자열(String) 값의 길이를 출력할 때 Exception이 발생합니다. public static void main(String[] args) { String str = null;//외부 입력값이 null로 들어 온 경우로 가정합니다. System.out.println(str.length()); } //실행결과 Exception in thread "main" java.lang.NullPointerException 만약 Exception을 발생시키지 않고 싶다면 아래와 같은 방어적 코딩을 필수..
예외 처리 방법 메소드를 만드는 개발자 입장에서 발생하는 예외를 처리하는 방법은 2가지가 있습니다. (자세한 문법적인 설명은 이 포스팅에서 하지 않습니다.) try - catch문을 사용하기메소드에 thorws 키워드로 예외 선언하기try-catch문을 이용하면 예외가 발생될 것 같은 지점에 직접 예외 처리를 할 수있고, throws를 사용하게 되면 메소드를 사용하는 쪽에서 예외에 대한 처리를 해주어야 합니다. 처음 예외 처리를 배웠을때, throws로 예외를 선언하는 것은 해당 메소드를 만든 개발자로써 무책임한 방법이라고 생각했습니다. 사용자를 편하게 하는 것이 객체지향 설계의 미덕이라고 배웠는데 번거로운 예외처리를 안하겠다는 것처럼 보였습니다. 하지만 이와 같은 생각은 '언제 어떤 방법을 사용해야 하..