[java] 셸에서 가비지 수집을 어떻게 강제합니까?

그래서 원격 상자에 jmap이있는 힙을보고 있으며 가비지 수집을 강제하고 싶습니다. jvisualvm 또는 jconsole 및 친구에 들어 가지 않고 어떻게 할 수 있습니까?

나는 당신이 가비지 콜렉션을 강요해서는 안된다는 것을 안다. 힙이 왜 커지거나 커지는 지 알아 내야한다.

또한 System.GC ()가 실제로 가비지 수집을 강제하지 않는다는 것을 알고 있습니다. 단지 GC에 발생하기를 원한다는 것을 알려줍니다.

이것을 쉽게 할 수있는 방법이 있다고 말했습니까? 누락 된 명령 줄 앱이 있습니까?



답변

무료 jmxterm 프로그램을 통해이 작업을 수행 할 수 있습니다 .

다음과 같이 실행하십시오.

java -jar jmxterm-1.0-alpha-4-uber.jar

여기에서 호스트에 연결하고 GC를 트리거 할 수 있습니다.

$>open host:jmxport
#Connection to host:jmxport is opened
$>bean java.lang:type=Memory
#bean is set to java.lang:type=Memory
$>run gc
#calling operation gc of mbean java.lang:type=Memory
#operation returns:
null
$>quit
#bye

bash / perl / ruby ​​/ other 스크립트에이를 포함하는 방법에 대한 정보는 jmxterm 웹 사이트의 문서를 참조하십시오. 이 작업을 수행하기 위해 Python에서 popen2를 사용하거나 Perl에서 open3을 사용했습니다.

업데이트 : 여기 jmxterm을 사용하는 한 줄짜리가 있습니다.

echo run -b java.lang:type=Memory gc | java -jar jmxterm-1.0-alpha-4-uber.jar -n -l host:port


답변

JDK 7부터 다음과 같은 JDK 명령 도구 ‘jcmd’를 사용할 수 있습니다.

jcmd <pid> GC.run


답변

를 실행 jmap -histo:live <pid>하면 아무것도 출력하기 전에 힙에 전체 GC가 강제 실행 됩니다.


답변

user3198490 의 답변에 추가 . 이 명령을 실행하면 다음 오류 메시지가 표시 될 수 있습니다.

$ jcmd 1805 GC.run
[16:08:01]
1805:
com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
...

이것은 이 stackoverflow 답변의 도움으로 해결할 수 있습니다.

sudo -u <process_owner> jcmd <pid> GC.run

<process_owner>PID로 프로세스를 실행하는 사용자는 어디에 있습니까 <pid>? 둘 다 top또는htop


답변

몇 가지 다른 솔루션이 있습니다 (이미 여기에 좋은 솔루션이 많이 있습니다).

다음 예는 cmdline-jmxclient에 대한 것입니다.

$ java -jar cmdline-jmxclient-0.10.3.jar - localhost:3812 'java.lang:type=Memory' gc

이것은 한 줄 뿐이고 스크립트에 정말 쉽게 넣을 수 있기 때문에 좋습니다.


답변

Linux의 경우 :

$ jcmd $(pgrep java) GC.run

jcmdJDK와 함께 패키지화되어 $(pgrep java)Java의 프로세스 ID를 가져옵니다.


답변

동일한 명령 줄 옵션이 없다고 생각합니다.

동일한 경우 jvisualvm / jconsole을 사용해야합니다.

이 도구를 사용하여 프로그램의 메모리가 높은 이유를 확인하는 것이 좋습니다.

어쨌든 GC를 강요해서는 안됩니다. GC 알고리즘을 방해하고 프로그램을 느리게 만들 수 있기 때문입니다.