그래서 원격 상자에 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
답변
몇 가지 다른 솔루션이 있습니다 (이미 여기에 좋은 솔루션이 많이 있습니다).
- MemoryMBean 에 액세스 하고을 호출 하는 코드를 작성 하십시오
gc()
. - 명령 줄 JMX 클라이언트 (예 : cmdline-jmxclient , jxmterm )를 사용하고 MemoryMBean 에서
gc()
작업을 실행합니다.
다음 예는 cmdline-jmxclient에 대한 것입니다.
$ java -jar cmdline-jmxclient-0.10.3.jar - localhost:3812 'java.lang:type=Memory' gc
이것은 한 줄 뿐이고 스크립트에 정말 쉽게 넣을 수 있기 때문에 좋습니다.
답변
Linux의 경우 :
$ jcmd $(pgrep java) GC.run
jcmd
JDK와 함께 패키지화되어 $(pgrep java)
Java의 프로세스 ID를 가져옵니다.
답변
동일한 명령 줄 옵션이 없다고 생각합니다.
동일한 경우 jvisualvm / jconsole을 사용해야합니다.
이 도구를 사용하여 프로그램의 메모리가 높은 이유를 확인하는 것이 좋습니다.
어쨌든 GC를 강요해서는 안됩니다. GC 알고리즘을 방해하고 프로그램을 느리게 만들 수 있기 때문입니다.