java 코딩 테스트를 준비하시다 보면, 간혹 가다가 메모리 초과를 보는 일이 있습니다. 메모리 제한이 보정되지 않았다면요. 저는 이럴 때, 조금이나마 메모리를 덜 먹는 구조로 바꾸곤 하는데요. 예를 들자면 LinkedList를 ArrayDeque로 바꾼다던지 하는 식입니다. 오늘 설명할 내용은 그것은 아니고, visual VM으로 메모리 사용량을 어떻게 확인하는지 간단하게 알려드리려고 합니다. 당연하게도, 예시는 코테에 치중해서 다루도록 하겠습니다. 먼저, bfs를 구현할 때 많이 쓰는 Queue가 있습니다. 자바에는 Queue는 interface이고요. 그것을 구현한 것이 LinkedList, 즉 리스트 구조와, ArrayDeque, 즉 배열 구조가 있습니다. 사실, 전자보다 후자가 메모리를 조금 덜..
Java 검색 결과
시간 복잡도를 어떻게 대강 분석할까요? 실행 시간을 보고, 추정을 하시면 됩니다. 정말 괴랄한 복잡도가 아니라면, O(n), O(n^2), ... 등은 어느 정도 맞아 떨어집니다. 저는 java에서 메서드를 실행하는 데 걸린 시간을 측정할 때, System.nanoTime()을 이용하는 편입니다. 이것은 정밀한 시간 측정을 해 주지는 못합니다만, 어느 부분에서 시간 초과가 날 수 있는지 후보해를 추릴 수 있습니다. 질문이 하나 들어왔습니다. M자리 수와 N자리 수를 BigInteger로 곱하였습니다. M, N은 30만 자리 정도 되었다고 합니다. 10진수로 M자리 수라면, 32bit 2진수가 10진수 9자리와 대응이 됩니다. 그래서, bit 연산을 잘 이용하면 M과 N이 최대 30만자리까지 나오니까, (..
저번 시간에는 ArrayBlockingQueue에 대해서 잠깐 다룬 적이 있었습니다. 이번에는 Future에 대해서 다뤄 보도록 하겠습니다. Future에 대한 설명을 보면 위와 같습니다. Future는, 비동기적인 계산에 대한 result를 표현합니다. 그리고, 작업이 완료되어야, 결과를 가져올 수 있습니다. 이 말이 이해가 잘 가지 않네요. 비동기는 나중에 보기로 하고, 작업이 완료 되어야 가져 온다는 말을 이해해 보겠습니다. Future에서 쓸 수 있는 것 중 하나는 get입니다. 이것은, 계산이 완료될 때 까지 기다린 다음에, 그것의 result를 찍는 역할을 합니다. 그런데, 여기서 complete가 나옵니다. Task를 잘 생각해 보면, 진행 중인 상태가 있을 겁니다. 이를 run 상태라 하겠..
java의 arrayDeque가 어떻게 구현되었는지 간단히 알아보겠습니다. 세세하게 뜯지는 않을 거고, 중요한 변수들과 메서드만 보도록 하겠습니다. 먼저, 이 메서드를 보도록 하겠습니다. 코드를 봐도 뭔 말인지 모르겠습니다. 이럴 때는 쪼개시면 됩니다. 먼저, if문을 만족하지 않는다면, MIN_INITIAL_CAPACITY개의 원소를 저장할 수 있는 배열이 생성됩니다. 이 값은 디폴트로 8입니다. 만약에, numElements가 8보다 크거나 같으면 어떻게 될까요? 그러면 이런 알 수 없는 코드들이 수행되는데요. 어렵지 않아요. 132번째 부터 136번째 줄까지는 bit or 연산을 하고 있어요. 우항을 보면, >>> 연산자가 있는데요. 이는 쉽게 말해서 우측으로 이동한다 정도로 생각하심 됩니다. in..
어느 분하고, LinkedList 문제에 대해서 이야기를 나누다가, jvm 관련 이야기까지 나왔던 기억이 납니다. 그에 대해서, 어딘가에 정리한다 해 놓고, 깜빡 잊었는데요. 이제서야 정리해 봅니다. 저는 jdk8에서 프로그램을 실행하였습니다. jvm의 gc 로그를 출력하기 위해서는 option을 만져야 합니다. Run에서 Edit Configurations에 들어가 보겠습니다. 창이 하나 뜨는데요. 여기서 add Run Option을 눌러 보겠습니다. add VM options에 체크해 주겠습니다. 그리고 -verbose:gc를 옵션으로 주겠습니다. 해당 옵션은 gc event를 출력하는 옵션입니다. 이 옵션을 주고 실행시킬 프로그램은, 해시맵 hm에 Dog 객체 30만개를 넣고, 새롭게 생성되는 Do..
최근댓글