java 코딩 테스트를 준비하시다 보면, 간혹 가다가 메모리 초과를 보는 일이 있습니다. 메모리 제한이 보정되지 않았다면요. 저는 이럴 때, 조금이나마 메모리를 덜 먹는 구조로 바꾸곤 하는데요. 예를 들자면 LinkedList를 ArrayDeque로 바꾼다던지 하는 식입니다. 오늘 설명할 내용은 그것은 아니고, visual VM으로 메모리 사용량을 어떻게 확인하는지 간단하게 알려드리려고 합니다. 당연하게도, 예시는 코테에 치중해서 다루도록 하겠습니다. 먼저, bfs를 구현할 때 많이 쓰는 Queue가 있습니다. 자바에는 Queue는 interface이고요. 그것을 구현한 것이 LinkedList, 즉 리스트 구조와, ArrayDeque, 즉 배열 구조가 있습니다. 사실, 전자보다 후자가 메모리를 조금 덜..
코딩/Java 검색 결과
어느 분하고, LinkedList 문제에 대해서 이야기를 나누다가, jvm 관련 이야기까지 나왔던 기억이 납니다. 그에 대해서, 어딘가에 정리한다 해 놓고, 깜빡 잊었는데요. 이제서야 정리해 봅니다. 저는 jdk8에서 프로그램을 실행하였습니다. jvm의 gc 로그를 출력하기 위해서는 option을 만져야 합니다. Run에서 Edit Configurations에 들어가 보겠습니다. 창이 하나 뜨는데요. 여기서 add Run Option을 눌러 보겠습니다. add VM options에 체크해 주겠습니다. 그리고 -verbose:gc를 옵션으로 주겠습니다. 해당 옵션은 gc event를 출력하는 옵션입니다. 이 옵션을 주고 실행시킬 프로그램은, 해시맵 hm에 Dog 객체 30만개를 넣고, 새롭게 생성되는 Do..
java 강의에서 == 연산자에 대해, 이 글에서 언급을 했었습니다. 그런데, 질문을 받고 답변을 하다 보니, 헷갈리는 점이 있었습니다. 객체에서 다른 객체를 참조하는데 a == b인 경우가 있을까? 사실, 이에 대한 답은 문서에 있습니다. Object 클래스에 있는 equals 메서드에 나와 있는데요. 다른 부분은 없고, 초록색 부분과 노란색 부분만 읽어보시면 됩니다. x와 y가 같은 오브젝트를 참조한다를 명제 Q, Object 클래스의 equals 메소드가 true를 리턴한다를 명제 P라 합시다. if and only if는 필요 충분 조건을 나타냅니다. 즉, 저 메소드가 참 값을 리턴했다는 것은, x와 y가 같은 객체를 참조했다는 것입니다. 이런 경우에만 참이 된다는 소리입니다. x == y인데 다..
java에서 예외와 에러의 차이가 무엇일까요? 공식 문서는 단 2개의 키워드로 답을 주고 있습니다. abnormal, serious, shouldn't not try catch. 각각, 비정상, 심각한, catch를 하지 말아야 하는을 의미합니다. 여기에 속한 대표적인 것들 중에서는, OOME와 stackoverflowError가 있습니다. 왜 이 둘이 예외가 아닌 에러인 건지 문득 궁금해 졌습니다. 위 프로그램을 보면, f라는 메서드가 계속 재귀 호출이 되고 있음을 알 수 있습니다. 실제로 이 프로그램은 아래와 같은 에러를 떨굽니다. StackOverflowError. 이것은 재귀 함수가 종료 조건 없이 계속 타고 들어갈 때 발생할 수 있습니다. 이 예외를 타고 들어가면, VirtualMachineEr..
백준 1325번은 c,c++로 풀면 쉽게 풀리는 dfs, bfs 문제 중 하나입니다. 그런데 Java로 풀면 시간이 빡빡한데요. 그 이유 중 하나는 박싱, 언박싱에 의한 객체 생성 때문입니다. 이에 대해서 아직 익숙하지 않으시다면, 이 포스트를 보고 오시는 것도 좋습니다. 통과를 하시고 나서, java로 통과한 코드 중에서 1등과 2등 코드의 차이를 보면 대충 3초 가량이 나는 것을 볼 수 있습니다. 이 두 코드를 보시면, 하나는 primitive type 배열을 썼고, 다른 하나는 그렇지 않았음을 볼 수 있는데요. 3초 차이라니. O(nm) 복잡도에서, 아슬아슬하게 통과할 복잡도에서, 3초면 상당히 큽니다. 그 원인 중 하나가 필요 없는 객체 생성이라 했으니, trace를 해 보겠습니다. jdk 8 기..
최근댓글