2016-09-24 9 views
3

의 차이점 메타 공간네이티브 메모리?Java에서 메타 공간과 기본 메모리의 차이

메타 공간은 jconsole, jvisualvm, jstat cmds를 사용하여 추적 할 수 있습니다.
jcmd를 사용하여 기본 메모리를 추적 할 수 있습니다. Link

또한 메타 데이터가 네이티브 메모리입니까?

NIO 버퍼는 어디에 저장됩니까? 메타 공간 또는 원시 메모리에 있습니까?

답변

11

또한 네이티브 메모리입니까?

예, Metaspace는 기본 메모리 (프로세스 메모리)의 일부이며 호스트 운영 체제

source http://karunsubramanian.com/websphere/one-important-change-in-memory-management-in-java-8/ 에 의해 제한 당신이 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 프로세스의 메모리 맵을 분석 할 수 있습니다. 또한 JemallocMALLOC_CONF env variables을 적절하게 설정하여 메모리 할당/스택 추적의 xGB/xkB마다 디스크에 프로파일을 쓰는 데 도움이 될 수 있습니다. 생성 된 파일이 있으시면 visualisation에 대해
Jeprof를 사용해보십시오. 예 :

jeprof --show_bytes --pdf `which w` jeprof.heap > sample.pdf 

콜 그래프 용 PDF를 생성 할 때.

+0

NIO 커넥터를 사용하는 Tomcat을 사용하고 있습니다. 'ps'의 RSS 값 unix cmd가 (heap + metaspace)와 일치하지 않습니다. 따라서 네이티브 메모리가 메타 스페이스 이상이면 어떻게 측정 할 것인가? 그리고 가능하다면 사용 된 메모리 (RSS)의 균열을 언급 할 수 있겠습니까? –

+1

많은 스레드와 같은 많은 이유가있을 수 있고, glibc 버전> 2.10 등과 같은 문제가있을 수 있습니다. 더 많은 통찰력을 얻기 위해'pmap-x'를 사용할 수 있습니다 메모리에. – sol4me

+2

답변의 큰 덩어리가 http://www.evanjones.ca/java-bytebuffer-leak.html – TheLostMind