2011-09-06 2 views
3

Java에 런타임에 GC.AddMemoryPressure method in .NET과 같은 관리되지 않는 메모리 할당에 대해 알려주는 기능이 있습니까?java 메모리 압력

+2

"품질 기준"에 대한이 항목은 무엇입니까? –

+0

그 stackoverflow 품질 표준 검사기를 전달하는 자리 표시 자 텍스트입니다. –

+0

@misha nesterernko 장소 소유자 텍스트? 질문의 일부가 아니라면 거기에있을 필요가 없습니다. – berry120

답변

2

자바에서는 필요하지 않습니다. '작은 관리 객체가 대량의 관리되지 않는 메모리를 할당하는 경우'은 Java에서 간단히 발생하지 않을 수 있습니다. JNI를 통해 네이티브 (관리되지 않는) 함수를 호출하면 메모리가 JVM의 관리되는 메모리 테이블에 할당되지 않습니다. 참고로

:

직접 메모리가 자바에서 별도로 관리하고, "관리되지 않는"으로 간주 될 수
+3

엄밀히 말하자면, 두 런타임 시스템은 메모리 관리에 대해 다른 가정을합니다. Java/JRE는 그다지 중요하지 않다고 가정합니다. –

+2

관리되는 개체는 많은 양의 기본 메모리와 약간의 관리되는 메모리를 가질 수 있으므로 gc에서는 괜찮아 보이고 해당 개체는 수집하지 않습니다. 잠시 후 기본 힙이 가득 차서 OutOfMemoryException이 발생합니다. 그것은 Deflater 클래스의 문제점과 같습니다. 이 문제는 http://www.devguli.com/blog/eng/java-deflater-and-outofmemoryerror/에서 발견되었습니다. end() 메서드를 수동으로 호출하는 것이 좋습니다. 가비지 컬렉터를 사용하지 않아야하는 일종의 tradeof라고 생각합니다 (gc 사용시 메모리 할당 해제에 대해 신경 쓸 필요가 없습니다). –

+0

@Donal Fellows : 일부 수치를 지적 해 주시겠습니까? 나는 그 성명서에 도전하고 싶지 않고 관심이 있습니다! – home

2

. Sun/Oracle JVM에서는 자체 메모리 사용 제한이 있으며 힙 크기와 직접 메모리 크기의 한도에 도달 할 수 있습니다.

Sun/Oracle JVM에서 내부 API를 사용하여 직접 메모리 블록을 명시 적으로 해제 할 수 있습니다. 비록 그렇게해야하는 경우는 드물지만 여기에 있습니다.

ByteBuffer bb = ByteBuffer.allocateDirect(1024*1024); 

((DirectBuffer) bb).cleaner().clean(); 

GC를 트리거하지 않고이 작업을 1 만 번 수행 할 수 있습니다.

BTW : 메모리 매핑 된 파일은 소량의 힙을 사용하며 직접 메모리 제한에 포함되지 않습니다. 지도에 표시 할 수있는 양은 사실상 무제한입니다. (하나의 MappedByteBuffer에서 2GB로 제한됨)

+1

이것은 GC.AddMemoryPressure와 직접적인 관련이 없습니다. 이것은 Java를 통해 모든 원시 메모리 할당을 수행하기 위해 응용 프로그램을 다시 작성하는 것을 의미합니다. 많은 네이티브 라이브러리에서 이것은 받아 들일 수 없을 것이다. – yano

+0

@yano 대부분의 코드를 Java (또는 C#과 같은 다른 고급 언어)로 작성하고 네이티브 코드로 작성하는 것이 좋습니다. –