2. JVM 뜯어보기 - Java Runtime Data Area
·
Java
Java Runtime Data Area프로세스 전역 공유 영역1. Heap area (프로세스 전역)로드 후, JVM이 클래스 형식의 객체를 생성한다. 객체는 힙 영역의 메모리 할당메서드 호출 시 지역 변수, 파라미터 중 Reference Type이 존재하는 경우, 힙 영역에 메모리가 할당된다.Stack > Stack Frame > Local Variables 배열 에서 힙 영역 메모리 참조Primitive Type의 경우 힙 영역이 할당 되지 않으며, 값이 그대로 들어간다.Static Object, String Constant Pool(Interned String) 역시 힙 영역에 존재한다.HotSpotJVM에서 JAVA 7 이전에는 PermGen에 존재JAVA 8 이후에는 힙 영역에 존재한다.GC의..
1. JVM 뜯어보기 - Class Loader
·
Java
JVM (Java Virtual Machine)JVM은 크게 세 가지 subsystem으로 나뉜다.Class LoaderRuntime Data AreasExecution Engine1. Class Loader동적 로딩 (Dynamic Loading) : 필요한 바이트 코드만을 로딩한다.컴파일시점이 아닌 실행 시점에 클래스를 로딩할 수 있게 해주는 기술이다.자바에서 동적 로딩이 가능한 이유가 바로 Class Loader 덕분이다.바이트 코드(.class 파일)을 JVM에 적재Loading → Linking → Initialization 을 차례대로 수행함2. Runtime Data AreasJVM이 프로그램 실행을 위해 OS로부터 할당 받은 메모리 영역모든 스레드 공유(프로그램 전역) : Heap, Met..
0. JVM 기초와 자바의 컴파일러 및 인터프리터에 관하여
·
Java
JDK, JRE, JVMJDK(Java Development Kit)는 Java 환경에서 돌아가는 프로그램을 개발하기 위해 필요한 툴을 모아놓은 소프트웨어 개발 키트(SDK)이다. JRE(Java Runtime Environment)는 Java가 실행되기 위한 환경을 제공한다. JVM과 프로덕션 환경에서 제공되는 모든 클래스 라이브러리 및 국제화나 IDL 라이브러리와 같이 개발자들에게 도움이 되는 라이브러리로 구성된다. JVM(Java Virtual Machine)은 Java 애플리케이션이 구동되기 위한 기반이 되는 가상 머신이다. Java는 OS 위에서 구동되지 않으며, JVM이라는 가상 머신 위에서 실행된다.https://www.edureka.co/blog/java-architecture/ 플랫폼 ..
프로그래머스 - 섬 연결하기 (Java, 최소 신장 트리(MST), 크루스칼)
·
알고리즘
아이디어최소 신장 트리 (MST, Minimum Spanning Tree)크루스칼 알고리즘 최소 신장 트리의 경우 대표적으로 크루스칼 알고리즘과 프림 알고리즘이 존재한다.크루스칼 알고리즘 (Kruskal Algorithm) : 간선 수가 적은 경우(희소 그래프, Sparse Graph)에 적합.프림 알고리즘 (Prim Algorithm) : 간선 수가 많은 경우(밀집 그래프, Dense Graph)에 적합. 크루스칼 알고리즘으로 문제를 풀었다. 크루스칼 알고리즘1. 간선 가중치 기준 오름차순 정렬2. 가중치 작은 간선부터 사이클을 만들지 않는 간선 선택 (= 그리디)3. 간선을 최소 신장 트리 집합에 추가 (트리 간 병합)사이클이 발생하는 경우= 특정 간선에 대한 양쪽 노드가 이미 같은 트리에 포함되어 ..
프로그래머스 - 구명보트 (Java, 투포인터)
·
알고리즘
아이디어투포인터 풀이어차피 2명씩밖에 못 타니,가장 무거운 사람과 가장 가벼운 사람을 함께 태울 수 있다면 함께 태워버리고아니라면 무거운 사람만 태우도록 했다. 먼저 정렬을 한다.가장 가벼운 사람에 대한 인덱스는 태울 때마다 증가하게 되고, 방문 처리를 해야 한다.방문 배열을 따로 만들거나 2중 반복문을 사용하는 대신 투포인터로 퉁쳤다.무조건 보트 수는 증가하게 되므로, 둘을 함께 태울 수 있을 때만 offset(가장 가벼운 사람 인덱스)을 증가시킨다. (근데 이게 그리디가 맞나...? 그리디 쥐약이라 그냥 투포인터로 풀었다)코드import java.util.*;class Solution { public int solution(int[] people, int limit) { int an..
프로그래머스 - 큰 수 만들기 (Java, 그리디)
·
알고리즘
아이디어그리디 풀이먼저, 큰 수를 유지하려면 앞쪽에 나오는 수가 뒤쪽에 나오는 수보다 커야한다. 현재 수를 기준으로 현재 수가 다음 수보다 큰 지는 알 수 없으므로 현재 수는 answer에 무조건 추가한다.(현재 수와 answer의 수들만 비교할 것이다.) 처음에는 현재 수가 answer의 마지막 수보다 큰 경우 마지막 수를 제거하는 방식으로 접근했다.그러나 이 방식에서는 answer의 제거된 수 앞에 현재 수보다 작은 수가 여전히 남아있을 경우 최적해를 가질 수 없게 된다.그래서 answer의 마지막 인덱스부터 순회하여 현재 수보다 작은 수가 존재한다면 이를 모두 제거하도록 하였다. 만약 제거된 수가 k보다 작다면, 이는 추가된 수 앞에 이보다 작은 수가 없어서 제거 없이 계속 추가된 경우이다. 그러므..
프로그래머스 - 조이스틱 (Java, 그리디)
·
알고리즘
아이디어먼저 이 문제는알파벳을 업데이트 하는 것과이동하는 것두 가지로 쪼갤 수 있다.알파벳 업데이트알파벳을 업데이트 하는 것은 단순히 A로부터 현재 알파벳에 도달하는 격차와,Z로부터 현재 알파벳에 도달하는 격차 + 1 중 더 작은 것을 선택하면 된다. 이동틀린 풀이이동하는 것이 문제인데, 처음에는 잘못 생각해서 다음과 같이 풀이를 했었다.현재 위치를 0으로 잡고 왼쪽, 오른쪽 거리를 매긴다왼쪽에서 가장 가까운 Not A, 오른쪽에서 가장 가까운 Not A 간의 거리를 비교한다더 가까운 쪽을 선택하여 현재 위치를 업데이트하고, Not A인 알파벳의 갯수를 감소시킨다.만약 Not A인 알파벳 갯수가 0이라면 종료. 종료 전까지 1 ~ 3 반복나머지 예제는 전부 맞았지만, 예제 3번에서 오답이 나왔다."BBB..
프로그래머스 - 전력망을 둘로 나누기 (Java, 완전 탐색, bfs)
·
알고리즘
아이디어1. 연결된 노드 리스트 생성2. 간선 제거3. bfs 탐색연결된 노드 리스트 생성양방향 연결임에 주의하며, 특정 노드에 연결된 모든 노드들에 대한 리스트를 생성하여 map에 담아주었다.간선 제거wire들을 순차적으로 탐색하며, 현재 인덱스에 대한 wire를 제거한다.이는 곧 연결된 두 노드의 각각의 리스트로부터 반대쪽 노드를 제거하는 것과 같다.유의remove(index) : 리스트에서 특정 index에 해당하는 값 제거remove(Integer.valueOf(value) : 리스트에서 특정 value 제거bfs 탐색트리에서 하나의 간선을 끊게 되면, 반드시 2개의 트리로 분리된다.한 쪽 트리에 대해서만 탐색을 하면 나머지 트리에 속한 노드 수도 자연스럽게 알 수 있다.먼저 시작 노드를 정해주었..