기본 콘텐츠로 건너뛰기

개발 공부 - GC (추가)

* 공부하기 위해 크롤링 후 공부

GC의 동작 방식

1. 힙 메모리 영역에서 다음 메모리 할당을 위한 포인터가 존재한다.

2. 힙에 무언가를 할당하면 그 크기만큼 포인터가 이동한다.

3. GC의 특정 조건이 만족되면 모든 스레드를 중단하고, GC 쓰레드를 활성화한다.

4. 레퍼런스가 존재하지 않는 메모리들을 삭제하고, 사용 중인 메모리들의 위치를 재조정한다.



장점

 - 자동으로 메모리가 관리되기 때문에 프로그래머가 관리할 필요가 없다.

 - 메모리 누수가 없어진다.

 - 유효하지 않은 포인터에 접근하지 않는다.

 - 이중해제 문제에서 자유롭다. (이미 해제된 메모리를 다시 해제하는 오류)



단점

 - 해제할 메모리를 조사하는데 비용이 든다.

 - 할당된 메모리가 해제되는 시점을 알 수 없다.

 - 실시간 시스템에서 프로그램 동작 중 GC가 원하지 않는 순간 발생하면 프로그램 동작에 문제가 생길 수 있다. 



세대별 GC

GC를 최적화하는 기법은 세대별 GC라는 것이 존재한다.

 

3가지 세대(0세대, 1세대, 2세대)로 구분되어

최초 GC를 실행한 뒤, 살아남은 객체는 1세대로 옮겨진다.

이후 새롭게 할당된 메모리들에 대해서만 레퍼런스를 검사하고 GC를 수행하다가

0세대가 용량 한계가 되면, 1세대에 대해서도 레퍼런스 검사를 하고 살아남은 1세대는 2세대로 옮긴다.

 

메모리에 남아있었던 객체의 메모리들은 2세대에 계속 남아있게 되며,

모든 메모리의 레퍼런스를 검사하는 것보다는 없어질 가능성이 높은 메모리들에 대해서만 먼저 검사를 하는 것.


잠깐 쓰고 사라져도 되는 객체를 상대적으로 크기가 작은 New 영역에 할당하고, New 영역에서 기준 시간 이상으로 오래 살아남은 객체가 있다면 Old 영역으로 이동시켜 "세대" 구분을 하는 방법이 사용되고 있다.


0세대 : GC가 아직 적용되지 않은 것
1세대 : 0세대와 2세대 사이
        * 1세대는 GC 후 남은 것을 옮긴 객체임
2세대 : GC를 2번 이상 겪고도 힙에 저장되어 있는 객체임

GC가 실행되면 0->1->2 순으로 세대 변경이 되거나, 삭제됨.
0세대 -> GC를 시키면 1세대로 이동 -> 또 GC를 해서 살아남은 것은 2세대로 이동




* JAVA 8 과 JAVA 11의 GC 변경점
(추가) 없애는 날 전체 이해한 것으로...









출처 : https://mentum.tistory.com/482
https://namu.wiki/w/%EC%93%B0%EB%A0%88%EA%B8%B0%20%EC%88%98%EC%A7%91
https://cyk0825.tistory.com/88?category=1124085











댓글

이 블로그의 인기 게시물

Ebook - 전자책 drm 상관 없이 pdf로 만들기

yes24와 교보문고에서 ebook을 구매 해야 했는데 너무 불편하고, 필기가 매우 화날 정도로 안 좋아서 원시적으로 사용하기로 했다. 1. 목적 : ebook에서 필기 및 사용이 불편하여 pdf로 변환  2. 용도 : 개인 사용 목적이며 화질이 다소 저하되어도 필기만 용이하면 상관 없음 3. 방법 1) 휴대폰 및 카메라로 동영상을 촬영했다. DRM 때문에 프로그램으로는 촬영이 안 되는 것을 확인했다. (사실 개인 사용 목적이면 기본 화면 캡쳐를 사용해도 된다...) 2) 마우스 클릭 해주는 매크로를 사용했다. (1) key_macro.exe > https://blog.daum.net/pg365/250 듀얼 모니터에서 위치 이탈 현상이 있긴 해도 괜찮았다. (2) AutoClick.exe > http://bestsoftwarecenter.blogspot.com/2011/02/autoclick-22.html 이 걸로 잘 사용했다. 3초마다 한 번 클릭하도록 사용했다. 3) 동영상을 이미지로 변경해주는 프로그램을 사용했다. Free Video to JPG Converter > https://www.dvdvideosoft.com/products/dvd/Free-Video-to-JPG-Converter.htm (240826: 다운로드 시 정상적으로 되지 않아서 URL 수정) 일 하면서 듀얼 모니터에 켜 놨는데 속도가 괜찮았다. * Every frame 으로 사용해야 한다. 4) 중복 사진 제거해주는 프로그램을 사용했다. VlsiPics  > http://www.visipics.info/index.php?title=Main_Page 생각보다 느리니 퇴근시에 걸어놓고 가면 된다. 한번 play가 끝나면 Auto-select 하고 Delete 하면 된다. 5) 이미지를 일괄 Crop 작업 해주는 프로그램을 사용했다. JPEGCrops > https://jpegcrops.softonic.kr/ *...

개발 공부 - json JSONObject 사용 시 백슬래시(\), 원화 표시(\) 제거 및 치환

import org.json.simple.JSONObject; String dataString = new String(authData.toJSONString()); dataString = dataString.replaceAll("\\\\", ""); String 으로 안 바뀌는 가 싶어서 String 으로 변환 해 주고 작업 하였다. 사실 toJSONString 해도 정상 동작 해야 하는데 이유를 잘 모르겠음. 그리고 나서 다시 이클립스 구동 하니 toString 도 먹은 걸로 봐서 이상하다고 생각! String dataString = authData.toString(); dataString = dataString.replaceAll("\\\\", ""); 어쨌든 백 슬래시 제거를 해줘야 하는데 \\ 도 아니고 \\\\를 해야 변환이 가능했다는 결말이었습니다. 참고 : https://stackoverflow.com/questions/15450519/why-does-string-replace-not-work/15450539 test =test.replace("KP", "");  replace 후에 담아 주지 않으면 적용이 안 됩니다!

개발 공부 - OracleXETNSListener 서비스가 로컬 컴퓨터에서 시작했다가 중지되었습니다.

여러 가지 요인이 있지만 PC 이름 변경시 OracleXETNSListener 서비스 시작이 불가능합니다. 고치는 법은 C:\oraclexe\app\oracle\product\11.2.0\server\network\ADMIN 와 같은 설치 경로에서 listener.ora와 tnsnames.ora 의 pc명을 바꾼 PC명으로 바꿔주면 됩니다. 그래도 안 된다면 cmd 창에서 services.msc 를 입력 후 OracleXETNSListener 서비스를 시작 시키면 됩니다. 오류명: OracleXETNSListener 서비스가 로컬 컴퓨터에서 시작했다가 중지되었습니다. 일부 서비스는 다른 서비스 또는 프로그램에서 사용되지 않으면 자동으로 중지됩니다. 참고한 사이트들 1. http://blog.naver.com/visioner7/120165951652 2. http://database.sarang.net/?inc=read&aid=6819&criteria=oracle&subcrit=&id=&limit=20&keyword=ora-12560&page=5 이런 걸 보면 오라클은 앙칼진 시골 아가씨야