2010-04-30 3 views
1

가비지 콜렉션이 해제 된 Java 프로그램을 실행하고 싶습니다. 내 자신의 코드로 메모리를 관리하는 것은 그렇게 어렵지 않습니다. 그러나 프로그램에는 꽤 많은 I/O가 필요합니다. 순수 I/O를 사용하여이 작업을 수행 할 수있는 방법이 있습니까? (모든 I/O 작업에 대해 JNI 사용이 부족합니다)?gc -io가없는 Java

감사 다니엘

+4

가비지 수집기를 비활성화 할 수 없습니다. 다른 뜻이 아니라면 요? –

+3

자신의 메모리를 관리하려면 응용 프로그램에 다른 언어와 플랫폼을 사용하십시오. – Yishai

+0

GC를 비활성화 할 수 있다면 내 자신의 캐시를 사용하여 Java로 할 수 있습니다. 왜 어떤 종류의 플래그로 GC를 비활성화 할 수 없습니까? – Dan

답변

8

메모리 관리를 비활성화 할 수 없습니다 java.So 메모리 관리를 자동화 그렇게 어려운 없습니다.

어렵지 않습니다. - 불가능합니다.입니다. 예를 들어 : 어떻게 메모리가 o에 의해 소비 할 수있는 가비지 컬렉터의 도움없이

public void foo() { 
    Object o = new Object(); 

    // free(o); // Doh! No "free" keyword in Java. 
} 

을 확보 할 수?

귀하의 질문에 귀하의 응용 프로그램에 의해 수행되는 높은 수준의 I/O로 인해 가비지 수집으로 인한 산발적 인 일시 중지를 피하기를 원할 것입니다. 이 경우, 생성 된 객체의 수를 최소화하는 기술 (예 : 풀에서 객체를 재사용)이 있습니다. Concurrent Mark Sweep Collector을 사용 설정하는 것도 고려해 볼 수 있습니다.

동시 마크 스윕 수집기, 또한 동시 콜렉터 또는 CMS라고도 는 가비지 컬렉션 일시에 민감한 애플리케이션 대상으로한다.

+1

아니요 항상 개체를 다시 사용하기 위해 캐시를 사용합니다. – Dan

+0

보거나 제어 할 수없는 임시 개체는 어떻게됩니까? 메모리 스키마에 대한 웅크리는 것을 알지 못하는 다양한 라이브러리 내부에는 많은 부분이 있습니다. – Joe

+0

그럴 수도 있지만 입출력을 위해 사용할 라이브러리 코드는 아마도 어딘가에서 객체를 생성 할 것입니다. 또한 실제로 이것이 문제가 있음을 입증 했습니까? 속도를 위해 객체 생성을 피하는 것은 "코드 냄새"IMO입니다. 대부분의 경우 앱은 CPU 경계가 아닌 I/O 경계가됩니다. – Adamski

0

GarbageCollection 당신이 내 자신의 코드에 GC

+0

아무 것도 쓰레기 수거가되지 않도록 설정할 수있는 플래그 전략이 있다고 생각했습니다. 아마도 틀 렸습니다. – Dan

+6

@ Dan - 너 * * 틀렸어. –

1

가비지 수집을 해제 할 수있는 유일한 방법은 JVM을 수정하는 것입니다. 이것은 OpenJDK 6 코드베이스에서 가능해야합니다.

그러나 마지막에 얻게 될 것은 누출을 수정하기위한 합리적인 희망없이 미친 듯이 메모리를 누출시키는 JVM입니다. Java 클래스 라이브러리 API는 메모리 관리를 담당하는 GC가 있다고 가정하여 설계되고 구현됩니다. 이것은 매우 근본적이어서 "수정"하려는 심각한 시도는 Java로 인식 할 수없는 언어/라이브러리로 이어질 것입니다.

가비지 수집되지 않은 언어를 사용하려면 C 또는 C++을 사용하십시오.

1

최신 JVM은 수명이 짧은 객체를 처리 할 때 매우 뛰어납니다. 스키마를 직접 작성하는 것이 더 느립니다.

당신이 처리하는 객체가 오랫동안 지속되고 주변을 돌아 다니는 등의 관점에서 JVM에서 추가 고급 처리를 받기 때문입니다. 물론 이것은 가비지 컬렉터가 해제하려는 것이므로, 하지만 gc 없이는 거의 할 수 없습니다.

따라서 어떤 최적화를 고려하기 전에 최적화되지 않은 큰 프로그램과 프로필이있는 기준선을 설정하십시오. 그 다음를 조정하면 도움이되는지 알 수 있지만 기준점이 없는지 결코 알 수 없습니다.

4

JVM에서 GC를 사용 중지하는 것은 매우 어렵지 만 불가능하지는 않습니다.

힌트를위한 JNI "중요한"기능을보십시오.

더 많은 객체를 할당하지 않아도 GC를 수행하지 않도록 할 수 있습니다 (수행 할 경우 당신을 매료시키고 코드를 계측하는 JVMTI 에이전트 작성).

마지막으로, 할당 한 모든 객체가 해제되지 않도록하여 치명적인 OutOfMemoryError를 강제로 실행할 수 있습니다. 따라서 -Xmx 메모리를 사용하면 GC가 아무 것도 회수 할 수 없으므로 넘어집니다. , 힙에 넘어지기 전에이 시점에서 GC를 한 번 이상 수행 할 것입니다.

진짜 질문은 당신이 원하는 이유입니까? 그것을 할 때 어떤 윗면이 보입니까? 그것은 실시간? 그렇다면 시장에서 구할 수있는 몇 가지 실시간 JVM (Oracle, IBM, & 다른 모든 사람들이 모두 판매하고 있음) 중 하나를 살펴 보겠습니다. 솔직히 자바를 사용하면서 이것을 할 또 다른 이유를 생각할 수 없습니다.

1

결정 성 가비지 수집을 사용하는 realtime Java 시스템을 사용하여 "직선 속도가 아닌 예측 가능성에 관한 모든 것"이라고 말했기 때문에,

7

달성하고자하는 것은 낮은 대기 시간의 실시간 시스템을 개발하기 위해 투자 은행에서 자주 수행됩니다.

GC를 피하려면 응용 프로그램의 시작 및 준비 단계 후에 메모리를 할당하면됩니다. Java NIO가 내부적으로 원하지 않는 메모리 할당을한다는 것을 눈치 챘을 것 같습니다. 불행히도 문제가되는 호출에 대해 JNI를 대체 할 수 밖에 없습니다. 적어도 NIO Selector의 대체품을 작성해야합니다.

비슷한 원치 않는 메모리 할당으로 인해 대부분의 Java 라이브러리를 사용하지 않아야합니다. 예를 들어, String과 같은 불변 개체를 사용하지 말고, 복싱을 피하고, 프로그램의 전체 수명 동안 충분한 항목을 미리 할당하는 컬렉션을 다시 구현해야합니다.

이 방법으로 Java 코드를 작성하는 것은 쉽지 않지만 확실히 가능합니다. 나는 그렇게하기위한 플랫폼을 개발 중이다.

+0

+1, 짧고 명확한 인수 –