programing

Java에서 메모리를 해방하는 방법

goodcopy 2022. 8. 8. 15:49
반응형

Java에서 메모리를 해방하는 방법

C와 ?free()능하하??? ???아니면 오브젝트를 null로 설정하고 GC에 의존하는 것만이 유일한 옵션입니까?

는 관리 사용하기 를 할당할 수 있는 은 Java를 입니다.new메모리 할당을 해제할 수 있는 유일한 방법은 가비지 컬렉터에 의존하는 것입니다.

이 메모리 관리 화이트 페이퍼(PDF)를 참조해 주세요.

해서 '어울리지 않다'라고 부를 도 있어요.System.gc()가비지 컬렉터가 즉시 실행되도록 제안합니다. Runtime이 이 코드는 Java Runtime이 아닙니다.드가아아 아아아다다

자바 문서에 따르면

gc 메서드를 호출하는 것은 Java Virtual Machine이 현재 점유하고 있는 메모리를 신속하게 재사용할 수 있도록 하기 위해 사용되지 않는 개체를 재활용하는 데 많은 노력을 기울인다는 것을 의미합니다.메서드 호출에서 제어가 반환되면 Java Virtual Machine은 폐기된 모든 개체에서 공간을 회수하려고 합니다.

를 명시적으로 하는 것에 하지 않은 것 .null이것은, 검토할 필요가 있는 메모리를 「확장」하는 적법한 기술입니다.

를 들어, 여러분이했다고 칩시다.List<String>크기가 매우 커졌지만 방법의 절반까지만 필요했습니다. 때 으로 설정할 수 .null가비지 컬렉터가 메서드가 완료되기 전에 잠재적으로 이 개체를 회수할 수 있도록 합니다(어차피 참조는 범위를 벗어납니다).

실제로 이 기술을 사용하는 경우는 거의 없지만 매우 큰 데이터 구조를 다룰 때는 고려할 가치가 있습니다.

System.gc(); 

이치노

gc 메서드를 호출하는 것은 Java Virtual Machine이 현재 점유하고 있는 메모리를 신속하게 재사용할 수 있도록 하기 위해 사용되지 않는 개체를 재활용하는 데 많은 노력을 기울인다는 것을 의미합니다.메서드 호출에서 제어가 반환되면 Java Virtual Machine은 폐기된 모든 개체에서 공간을 회수하려고 합니다.

권장하지 않습니다.

편집: 저는 2009년에 원래의 답변을 썼습니다.이제 2015년이다.

자바가 존재한 지 20년이 넘도록 쓰레기 수집기는 꾸준히 발전해 왔습니다.이 시점에서 수동으로 가비지 콜렉터를 호출하는 경우는, 다른 어프로치를 고려해 주세요.

  • 제한된 수의 머신에 GC를 강제 적용하는 경우 로드 밸런서가 현재 머신에서 떨어져 연결된 클라이언트에 대한 서비스가 완료될 때까지 기다린 후 일정 기간 동안 연결을 끊은 후 JVM을 하드 재시작하는 것이 좋습니다.이는 끔찍한 해결책이지만 System.gc()를 참조할 경우 강제 재시작은 임시방편일 수 있습니다.
  • 다른 가비지 컬렉터의 사용을 검토해 주세요.예를 들어 (지난 6년간 새로워진) G1 컬렉터는 저일시 정지 모델입니다.전체적으로 CPU 사용량은 증가하지만 하드스톱을 강제 실행하지 않는 것이 가장 좋습니다.현재 서버 CPU는 거의 모두 여러 코어를 탑재하고 있기 때문에, 이것은 매우 좋은 트레이드오프입니다.
  • 이치노Java" "newgen" "newgen" "(young)" 은 새로운 오브젝트되는 곳입니다.웹 서버의 경우 요청에 대해 작성된 모든 것이 여기에 저장되며, 이 공간이 너무 작으면 Java는 개체를 더 오래 지속되는 메모리로 업그레이드하는데 많은 시간이 소요됩니다(신규가 너무 작으면 비용을 지불해야 합니다).「G1」:
    • XX:G1NewSizePercent(기본값은 5입니다.상관없습니다)
    • XX:G1MaxNewSizePercent(기본값은 60입니다.아마도 이 값을 올릴 수 있습니다.
  • 가비지 콜렉터에게 더 이상 일시정지해도 괜찮다고 말하는 것을 고려해보세요.이로 인해 GC 실행 빈도가 높아져 시스템이 나머지 제약을 유지할 수 있게 됩니다.G1 경 g :
    • XX: MaxGCPauseMillis(기본값은 200)

*"저는 개인적으로 향후 적절한 삭제를 위해 플레이스 홀더로서 null 변수를 사용합니다.예를 들어 어레이 자체를 실제로 삭제(null화)하기 전에 어레이의 모든 요소를 무효화하는 데 시간이 걸립니다.

이것은 불필요합니다.Java GC가 작동하는 방식은 참조가 없는 개체를 찾는 것입니다. 따라서 참조가 있는 개체 x가 있으면 해당 개체에 대한 참조가 있기 때문에 GC는 해당 개체를 삭제하지 않습니다.

a -> x

a를 null로 하면 다음과 같이 됩니다.

a -> null
     x

따라서 x는 그것을 가리키는 참조가 없으므로 삭제됩니다.x가 아닌 다른 오브젝트를 참조하도록 를 설정해도 같은 일이 발생합니다.

따라서 객체 x, y 및 z를 참조하는 배열 arr과 어레이를 참조하는 변수 a가 있는 경우 다음과 같습니다.

a -> arr -> x
         -> y
         -> z

a를 null로 하면 다음과 같이 됩니다.

a -> null
     arr -> x
         -> y
         -> z

따라서 GC는 arr에 대해 설정된 참조가 없는 것으로 검출되어 arr을 삭제합니다.그러면 다음과 같은 구조를 얻을 수 있습니다.

a -> null
     x
     y
     z

이제 GC는 x, y 및 z를 찾아 삭제합니다.어레이내의 각 참조를 무효로 해도, 아무것도 개선되지 않고, 코드의 CPU 의 시간과 공간만을 소비합니다(즉, 그 이상은 문제가 되지 않습니다).GC는 계속 정상적으로 동작할 수 있습니다).

Yiannis Xanthopoulos 및 Hot Licks의 답변과 코멘트를 확장하려면(아직 코멘트는 할 수 없습니다) 다음과 같이 VM 옵션을 설정합니다.

-XX:+UseG1GC -XX:MinHeapFreeRatio=15 -XX:MaxHeapFreeRatio=30

jdk 7에서는 VM이 아이돌 상태일 때 GC 후에 힙의 30% 이상이 사용 가능하게 되면 사용되지 않는 VM 메모리가 해방됩니다.이러한 파라미터의 조정이 필요할 수 있습니다.

아래 링크에서는 강조되지 않았지만, 일부 가비지 컬렉터는 이러한 파라미터를 따르지 않을 수 있으며, 둘 이상의 코어가 있는 경우 기본적으로 Java가 이들 중 하나를 선택할 수 있습니다(따라서 위의 UseG1GC 인수).

VM 인수

업데이트: Java 1.8.0_73의 경우 JVM이 기본 설정으로 소량을 릴리스하는 경우가 있습니다.힙의 최대 70%가 사용되지 않은 경우에만 이 작업을 수행하는 것으로 보입니다.OS 의 물리 메모리가 부족하면, 보다 적극적으로 릴리스 할 수 있을지 어떨지 알 수 없습니다.

모든 프로그램(자바 또는 없음)에서 메모리를 해방하는 타당한 이유는 운영체제 수준의 다른 프로그램에서 더 많은 메모리를 사용할 수 있도록 하기 위해서입니다.만약 자바 어플리케이션이 250MB를 사용하고 있다면 강제로 1MB로 줄이고 다른 어플리케이션에서 249MB를 사용할 수 있도록 하고 싶습니다.

나는 이것에 대한 실험을 했다.

System.gc();에서는 가비지 콜렉터를 실행할 것을 권장합니다.

하는 건System.gc();를 「」로 후.null퍼포먼스와 메모리 점유율이 향상됩니다.

메모리 블록을 할당하고 해방하려면 직접 바이트 버퍼를 사용합니다.메모리를 떼어내는, 포터블 이외의 방법도 있습니다.

단, 제시된 바와 같이 C에서 메모리를 해방해야 한다고 해서 이 작업을 해야 하는 것은 아닙니다.

만약 당신이 정말로 무료로 좋은 사용 사례를 가지고 있다고 생각하신다면, 질문 내용에 포함시켜 주십시오.그러면 당신이 무엇을 하고 있는지 알 수 있습니다.더 좋은 방법이 있을 가능성이 높습니다.

모두 javacoffeebreak.com/faq/faq0012.html에서 제공

우선순위가 낮은 쓰레드는 사용자를 위해 가비지 수집을 자동으로 처리합니다.유휴 시간 동안 스레드가 호출되어 Java에서 개체에 이전에 할당된 메모리를 해방할 수 있습니다.하지만 걱정하지 마세요. 여러분 위에 있는 오브젝트는 삭제되지 않습니다!

오브젝트에 대한 참조가 없는 경우, 가비지 콜렉터에게는 공정한 게임이 됩니다.일부 루틴을 호출하는 대신(C++의 free와 같이) 개체에 대한 모든 참조를 null로 할당하거나 참조에 새 클래스를 할당합니다.

예:

public static void main(String args[])
{
  // Instantiate a large memory using class
  MyLargeMemoryUsingClass myClass = new MyLargeMemoryUsingClass(8192);

  // Do some work
  for ( .............. )
  {
      // Do some processing on myClass
  }

  // Clear reference to myClass
  myClass = null;

  // Continue processing, safe in the knowledge
  // that the garbage collector will reclaim myClass
}

코드가 대량의 메모리를 요구하려고 하는 경우는, 우선도가 낮은 스레드로서 스페이스의 재확보를 허가하는 것이 아니라, 가비지 콜렉터에 스페이스의 재확보를 개시하도록 요구할 수 있습니다.이를 수행하려면 코드에 다음을 추가하십시오.

System.gc();

가비지 콜렉터는 빈 영역을 회수하려고 하고, 가능한 한 많은 메모리를 회수해, 애플리케이션의 실행을 속행할 수 있습니다(메모리 플래그멘테이션의 문제가 특정의 플랫폼에 적용되는 경우가 있습니다).

저의 경우 Java 코드는 가까운 장래에 다른 언어(주로 C++)로 포팅되기 때문에 적어도 나중에 포팅 처리에 도움이 될 수 있도록 메모리를 적절히 해방하기 위해 립서비스를 하고 싶습니다.

개인적으로 향후 적절한 삭제를 위해 자리 표시자로서 변수를 무효화하는 데 의존합니다.예를 들어 어레이 자체를 실제로 삭제(null로 만들기)하기 전에 어레이의 모든 요소를 무효화하는 데 시간이 걸립니다.

하지만 제 경우는 매우 까다롭고, 저는 이 작업을 할 때 성능 저하를 겪고 있다는 것을 알고 있습니다.

* "예를 들어, 크기가 매우 커졌지만 메서드 도중에만 필요했던 메서드의 시작 부분에서 목록을 선언했다고 가정해 보겠습니다.이 시점에서 List reference를 null로 설정하면 가비지 컬렉터가 메서드가 완료되기 전에 이 개체를 회수할 수 있습니다(어차피 참조는 범위를 벗어납니다)." *

이는 맞지만 이 솔루션은 일반화할 수 없을 수 있습니다.목록 개체 참조를 가비지 수집에 사용할 수 있는 null -will-memory로 설정하는 동안 기본 유형의 목록 개체에만 해당됩니다.대신 List 개체에 참조 유형이 포함된 경우 List 개체 = null을 설정해도 목록에 포함된 참조 유형이 참조 해제되지 않습니다.이 경우 List object = null을 설정하면 가비지 수집 알고리즘이 개체가 고립되었다고 판단할 수 있을 만큼 스마트하지 않으면 개체를 가비지 수집에 사용할 수 없는 포함된 참조 유형이 분리됩니다.

알스루 자바객체의 크기와 남은 양을 알고 싶을 때가 있습니다. 방식으로 메모리 import java.lang; ★★★★★★★★★★★★★★★★★」Runtime r=Runtime.getRuntime();(의) 값을 mem1=r.freeMemory();r.gc(); 및 콜 " " " "freeMemory()

JAVA에서 권장하는 것은 늘에 할당하는 것입니다.

https://docs.oracle.com/cd/E19159-01/819-3681/abebi/index.html 에서

불필요해진 변수에 null 값을 명시적으로 할당하면 가비지 컬렉터가 안전하게 회수할 수 있는 메모리 부분을 식별할 수 있습니다.Java는 메모리 관리를 제공하지만 메모리 누수나 과도한 메모리 사용을 방지하지는 않습니다.

애플리케이션은 객체 참조를 해제하지 않음으로써 메모리 리크를 유도할 수 있다.이렇게 하면 Java 가비지 컬렉터가 이러한 개체를 회수하지 못하고 사용되는 메모리 양이 증가합니다.변수 사용 후 변수에 대한 참조를 명시적으로 무효화하면 가비지 컬렉터가 메모리를 회수할 수 있습니다.

메모리 누수를 검출하는 방법 중 하나는 프로파일링 툴을 사용하여 트랜잭션 후 메모리의 스냅샷을 작성하는 것입니다.정상 상태의 리크 프리 애플리케이션은 가비지 수집 후에 안정된 액티브히프 메모리를 표시합니다.

언급URL : https://stackoverflow.com/questions/1567979/how-to-free-memory-in-java

반응형