의 차이점 메타 공간과 네이티브 메모리?Java에서 메타 공간과 기본 메모리의 차이
메타 공간은 jconsole, jvisualvm, jstat cmds를 사용하여 추적 할 수 있습니다.
jcmd를 사용하여 기본 메모리를 추적 할 수 있습니다. Link
또한 메타 데이터가 네이티브 메모리입니까?
NIO 버퍼는 어디에 저장됩니까? 메타 공간 또는 원시 메모리에 있습니까?
의 차이점 메타 공간과 네이티브 메모리?Java에서 메타 공간과 기본 메모리의 차이
메타 공간은 jconsole, jvisualvm, jstat cmds를 사용하여 추적 할 수 있습니다.
jcmd를 사용하여 기본 메모리를 추적 할 수 있습니다. Link
또한 메타 데이터가 네이티브 메모리입니까?
NIO 버퍼는 어디에 저장됩니까? 메타 공간 또는 원시 메모리에 있습니까?
또한 네이티브 메모리입니까?
예, Metaspace는 기본 메모리 (프로세스 메모리)의 일부이며 호스트 운영 체제
에 의해 제한 당신이
jmap -permstat PID
를 사용하여 모니터링 할 수있다. 응용 프로그램이 metaspace의 메모리를 많이 할당 끝나는 경우 그것은 전체 시스템 영향을 미칠 것뿐만 아니라 JVM.That의 이유는 당신이 -XX:MetaspaceSize
명시 적으로 앱의 최대 metaspace 크기를 설정하는 데 사용하는 것이 좋습니다
자바 NIO API는 I/O 통화의 소스 및 대상으로 ByteBuffer의를 사용하고,이 맛에 와서 :
그래서 전용 "기본"메모리가 운영 시스템 호출에 전달 될 수 있기 때문에
- 힙 바이트 버퍼 (바이트 [] 배열, 쓰레기통에 할당 수집 Java 힙을 포장)
- CT 바이트 버퍼 (Java 힙 외부에 할당 된 랩 메모리)
, 그것은 가비지 컬렉터에 의해 이동되지 않습니다, 그것은 의미 때 I/O에 대해 힙 ByteBuffer을 사용하면 임시 직접 ByteBuffer으로 복사됩니다. JDK는 메모리 제한 (즉, 무제한 캐시)없이 스레드 당 하나의 임시 버퍼를 캐시합니다. 결과적으로 다중 스레드에서 큰 힙 ByteBuffers를 사용하는 I/O 메소드를 호출하는 경우 프로세스가 방대한 양의 추가 기본 메모리을 사용할 수 있습니다.
당신은 자세한 내용은 this & this article를 참조 할 수 있습니다. & 사용
업데이트
RSS = OffHeap (매핑 파일 JVM 내부 코드 (.bss라고 세그먼트), 스레드 스택, 직접 버퍼) + GC 내부 구조 + 힙 + 구조 (기본 라이브러리에 의해 할당 이자형.g IO 라이브러리) + JVM + CodeCache의 메타 공간 + 공유 라이브러리
리눅스에서 pmap -x을 사용하여 JVM 프로세스의 메모리 맵을 분석 할 수 있습니다. 또한 Jemalloc은 MALLOC_CONF env variables을 적절하게 설정하여 메모리 할당/스택 추적의 xGB/xkB마다 디스크에 프로파일을 쓰는 데 도움이 될 수 있습니다. 생성 된 파일이 있으시면 visualisation에 대해
Jeprof를 사용해보십시오. 예 :
jeprof --show_bytes --pdf `which w` jeprof.heap > sample.pdf
콜 그래프 용 PDF를 생성 할 때.
NIO 커넥터를 사용하는 Tomcat을 사용하고 있습니다. 'ps'의 RSS 값 unix cmd가 (heap + metaspace)와 일치하지 않습니다. 따라서 네이티브 메모리가 메타 스페이스 이상이면 어떻게 측정 할 것인가? 그리고 가능하다면 사용 된 메모리 (RSS)의 균열을 언급 할 수 있겠습니까? –
많은 스레드와 같은 많은 이유가있을 수 있고, glibc 버전> 2.10 등과 같은 문제가있을 수 있습니다. 더 많은 통찰력을 얻기 위해'pmap-x'를 사용할 수 있습니다 메모리에. – sol4me
답변의 큰 덩어리가 http://www.evanjones.ca/java-bytebuffer-leak.html – TheLostMind