공부 7

java의 field 초기화와 동시성

다음 코드의 출력을 예상해보자. class A{ A() { f(); } public void f(){ System.out.println("3"); } } class B extends A{ int x = 4; public void f() { System.out.println(x); } } public class Main { public static void main(String[] args) { A a = new B(); } } 답은 뭘까? 3 혹은 4중에 고민하고 있다면, 그렇지 않다. 답은 0이다. java는 C++와 다르게 생성자에서도 virtual하고 순서상 A가 초기화된 후에 B가 초기화되기 때문에, x가 초기화되지 않은 상태로 출력되어 0이 출력된다. 그렇다면 생성자에서 필드를 초기화하는 클래스..

공부 2023.06.15

Garbage Collection(4) - Weak Reference

Garbage Collector가 존재하는 언어중 몇몇은 약한 참조(Weak Reference)라는 것을 제공합니다. java js python lua 일반적으로, 참조당하고 있는 객체는 Garbage Collection 대상이 아닙니다. 하지만 캐시와 같이 속도 면에서는 중요하지만 제거해도 괜찮은 객체는 어떻게 할까요? 이를 위해 Reference Object를 제공합니다. Reference Object를 통해 객체를 간접적으로만 참조하는 방식으로 사용하며, GC는 메모리가 부족하면 Reference Object으로만 참조중인 객체를 제거할 수 있습니다. 따라서 일반적으로는 다음과 같이 접근합니다. var weakRef = new WeaKReference(new T()); ... // 객체는 언제든 제..

공부 2023.01.16

Garbage Collection(3) - Java GC Tuning

이전 포스팅에서는 자바의 Garbage Collector에 대해 다뤘습니다. 이번 포스팅에서는 Garbage Collector를 애플리케이션에 맞게 튜닝하는 방법에 대해 알아봅시다. Garbage Collectors * 이 포스팅에서 다루는 java의 버전은 18입니다. Serial GC -XX:+UseSerialGC Parallel GC -XX:+UseSerialGC Concurrent Mark Sweep(CMS) GC(Removed) Garbage-First(G1) GC -XX:+UseG1GC Z GC -XX:UseZGC Shenandoah GC -XX:+UseShenandoahGC Epsilon GC(Experimental) -XX:+UnlockExperimentalVMOptions -XX:+Use..

공부 2023.01.16

Garbage Collection(2) - Java GC

이전 포스팅에서 Garbage Collection에 대한 전략 세가지를 다뤘습니다. 이번 포스팅에서는 추적 전략을 사용하는 java의 Garbage Collector에 대해 다룹니다. Java GC(Garbage Collector) * 이 포스팅에서 다루는 java의 버전은 18입니다. 이전 포스팅에서 모든 스레드에서 변수 혹은 그 변수의 멤버 등으로 참조하지 않는 객체를 garbage라고 하고 이를 찾는 것을 Garbage Collection이라 했습니다. java에서는 garbage를 도달할 수 없다(Unreachable)고 하고, 반대로 하나 이상의 스레드에서 직/간접적으로 참조되는 객체를 도달할 수 있다(Reachable)고 표현합니다. garbage를 런타임에 찾는 알고리즘이나, 이를 수행하는 ..

공부 2023.01.16

Garbage Collection(1) - 탈출 분석과 참조 카운팅, 추적

우리는 프로그래밍을 하면서 다양한 한정적인 자원을 다룹니다. 네트워크 소켓이나, 메모리와 같이 사용한 후 돌려줘야할 것들이죠. 그 중에서, 메모리에 대한 이야기를 하려고 합니다. var a = new Integer(10); var b = a; System.out.println(a); a = null; // 아직 객체는 참조되는중 b = null; // 더 이상 해당 객체는 참조되지 않음 코드를 읽어보면, new Integer(10)은 더 이상 사용되지 않는 객체겠죠? 좀 더 일반화하자면, 모든 스레드에서 변수 혹은 그 변수의 멤버 등으로 참조하지 않는 객체는 제거해도 될겁니다. 이런 객체를 garbage라고 하고, 이를 찾는 것을 Garbage Collection이라고 합니다. garbage인지 어떻게 ..

공부 2023.01.16

JS - Tag Function

Mozilla Dev - tagged_templates 보고 신기해서 몇개 만들어봤다. 각 원소를 퍼센트로 나타내기 function persent(strings, ...values){ let result = strings[0]; let sum = values.reduce((a,b) => a+b); for(let i=0; i!=values.length; ++i) result += `${Math.floor(values[i]/sum*1000)/10}%` + strings[i+1]; return result; } // a 50% b 33.3% c 16.6% d 0% console.log(persent`a ${3} b ${2} c ${1} d ${0}`) 첫 인자로 오는 strings에 ${}로 split된 문자..

공부 2022.11.02

도커 - 배경

배경 개발을 하다보면 다양한 환경이 있고, 이에 맞춰 여러 라이브러리들을 설치합니다. 하지만 로컬에서 잘 돌아가던 프로그램도 배포 환경이 개발 환경과 다르면 예상치 못한 동작을 할수도, 배포가 실패하기도 합니다. only my machine VM 가상머신을 이용하면 라이브러리가 설치된 상태를 추출할 수 있고, 이를 이미지라고 합니다. 이걸 배포하면 됩니다! 환경이 완전히 일치하니 별로 해줄것도 없고요. 다만 이미지 파일의 용량이 너무 큽니다. 즉, 공유하기도 어렵습니다 예를 들어, 우분투에 파이썬을 설치하고, pillow 라이브러리를 설치하고 싶습니다. 하지만 pillow 까진 아니더라도, 이미 무수히 많은 사람들이 우분투에 파이썬을 설치해뒀을텐데, 이걸 재활용하는게 편하지 않을까요? 하지만 가볍게 공유..

공부 2022.08.08