- How to find a Java thread running on Linux with ps -axl?
- 8 Answers 8
- Find all the Java processes running on your machine
- Troubleshooting a Java Application with jps
- jps command
- Java program we will be debugging in this post
- Print Java process ids
- Print process id along with the class name
- Print Java process ids along with full package name
- Print process ids along with class name and arguments passed to the main method.
- Print JVM arguments passed to Java process
- jcmd to list Java processes
- Conclusion
- Список процессов Java
- 16 ответов
How to find a Java thread running on Linux with ps -axl?
I have a running JVM with two threads. Is it possible to see these running threads on my Linux OS with ps -axl ? I am trying to find out what priority the OS is giving to my threads. More info about this other issue here.
8 Answers 8
for finding your java process. Sample Output:
3825 RemoteMavenServer -Djava.awt.headless=true -Xmx512m -Dfile.encoding=MacRoman 6172 AppMain -Didea.launcher.port=7533 -Didea.launcher.bin.path=/Applications/IntelliJ IDEA 10.app/bin -Dfile.encoding=UTF-8 6175 Jps -Dapplication.home=/Library/Java/JavaVirtualMachines/1.6.0_31-b04-411.jdk/Contents/Home -Xms8m
(6172 is id of your process) to get stack of threads inside jvm. Thread priority could be found from it. Sample output:
. "main" **prio=5** tid=7ff255800800 nid=0x104bec000 waiting on condition [104beb000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at au.com.byr.Sample.main(Sample.java:11) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) .
EDIT: If application running under different user than yourself (typical case on production and other non-local environments) then jps/jstack should be run via sudo. Examples:
sudo jps -v sudo jstack 6172
Find all the Java processes running on your machine
When your application has some problem, the first thing to check is running processes on the machine. For Linux OS we generally use ps -ef . ps is one of the most used Linux troubleshooting commands. JDK provides similar functionality for Java processes through jps . The jps command-line utility provides a list of all running Java processes on a machine for which the user has access rights. The access rights are determined by access-control mechanisms specific to the operating system. jps utility can also provide information on arguments passed to the main method, arguments passed to JVM, etc. In this post, we will see the functionalities provided by jps .
Troubleshooting a Java Application with jps
In this section, we will see how to use jps with a running Java process.
jps command
jps [options] pid options: This represents the jps command-line options. pid: The process ID for which the information specified by the options is to be printed.
Java program we will be debugging in this post
Following is the sample class we are going to debug and try to understand the different features available.
public class Test public static void main(String[] args) while(true) > > >
For all our examples we will be using Java 17, as of writing this post it is built using JDK master branch. This post explains how to build JDK from the source.
java -version openjdk version "17-internal" 2021-09-14 OpenJDK Runtime Environment (build 17-internal+0-adhoc.vipin.jdk) OpenJDK 64-Bit Server VM (build 17-internal+0-adhoc.vipin.jdk, mixed mode)
We are running the Java process using the following command. For rest of the blog post we will use jps on this process.
java -XX:ConcGCThreads=6 -Xmx256m -Xms8m -Xss256k Test argument1 argument2
Print Java process ids
Following command shows process ids.
2468 10660 7067 7470 10366
Print process id along with the class name
This is the command to list Java processes with main class names, it is same as command jps -V .
2468 10694 Jps 7067 Main 7470 Launcher 10366 Test
Print Java process ids along with full package name
jps -l displays the full package name for the application’s main class or the full pathname to the application’s JAR file.
2468 10554 jdk.jcmd/sun.tools.jps.Jps 7067 com.intellij.idea.Main 7470 org.jetbrains.jps.cmdline.Launcher 10366 Test
Print process ids along with class name and arguments passed to the main method.
jps -m displays the arguments passed to the main method
2468 10726 Jps -m 7067 Main 7470 Launcher /home/vipin/.local/share/JetBrains/Toolbox/apps/IDEA-C/ch-0/203.7148.57/lib/commons-lang3-3.10.jar:/home/vipin/.local/share/JetBrains/Toolbox/apps/IDEA-C/ch-0/203.7148.57/lib/httpclient-4.5.12.jar:/home/vipin/.local/share/JetBrains/Toolbox/apps/IDEA-C/ch-0/203.7148.57/lib/annotations.jar:/home/vipin/.local/share/JetBrains/Toolbox/apps/IDEA-C/ch-0/203.7148.57/lib/netty-buffer-4.1.52.Final.jar:/home/vipin/.local/share/JetBrains/Toolbox/apps/IDEA-C/ch-0/203.7148.57/plugins/java/lib/jps-javac-extension-1.jar:/home/vipin/.local/share/JetBrains/Toolbox/apps/IDEA-C/ch-0/203.7148.57/lib/jdom.jar:/home/vipin/.local/share/JetBrains/Toolbox/apps/IDEA-C/ch-0/203.7148.57/lib/netty-resolver-4.1.52.Final.jar:/home/vipin/.local/share/JetBrains/Toolbox/apps/IDEA-C/ch-0/203.7148.57/lib/maven-resolver-api-1.3.3.jar:/home/vipin/.local/share/JetBrains/Toolbox/apps/IDEA-C/ch-0/203.7148.57/plugins/java/lib/maven-resolver-connector-basic-1.3.3.jar:/home/vipin/.local/share/JetBrains/Toolbox/apps/IDE 10366 Test argument1 argument2
Print JVM arguments passed to Java process
jps -v displays the arguments passed to the JVM.
2468 -Djava.library.path=/tmp/.mount_jetbraH5N0hQ -Xmx256m -Xms8m -Xss256k -XX:+UseStringDeduplication -XX:+UseCompressedOops -XX:+UseSerialGC -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Djdk.lang.processReaperUseDefaultStackSize=true vfprintf exit abort -DTOOLBOX_VERSION=1.20.7940 10501 Jps -Dapplication.home=/home/vipin/githubprojects/jdk/build/linux-x86_64-server-release/jdk -Xms8m -Djdk.module.main=jdk.jcmd 7067 Main -Xms128m -Xmx2048m -XX:ReservedCodeCacheSize=512m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -XX:CICompilerCount=2 -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -ea -Dsun.io.useCanonCaches=false -Djdk.http.auth.tunneling.disabledSchemes="" -Djdk.attach.allowAttachSelf=true -Djdk.module.illegalAccess.silent=true -Dkotlinx.coroutines.debug=off -Dsun.tools.attach.tmp.only=true -Dide.no.platform.update=true -XX:ErrorFile=/home/vipin/java_error_in_idea_%p.log -XX:HeapDumpPath=/home/vipin/java_error_in_idea_.hprof -Didea.vendor.name=JetBrains -Didea.paths.selector=IdeaIC2020.3 -Djb.vmOptionsFile=/home/vipin/.local/share/JetBrains/Toolbox/apps/IDEA-C/ch-0/203.7148.57.vmoptions -Didea.platform.prefix=Idea -Didea.jre.check=true 7470 Launcher -Xmx700m -Djava.awt.headless=true -Djdt.compiler.useSingleThread=true -Dpreload.project.path=/home/vipin/githubprojects/jdk -Dpreload.config.path=/home/vipin/.config/JetBrains/IdeaIC2020.3/options -Dcompile.parallel=false -Drebuild.on.dependency.change=true -Dio.netty.initialSeedUniquifier=4046065713679813272 -Dfile.encoding=UTF-8 -Duser.language=en -Duser.country=IN -Didea.paths.selector=IdeaIC2020.3 -Didea.home.path=/home/vipin/.local/share/JetBrains/Toolbox/apps/IDEA-C/ch-0/203.7148.57 -Didea.config.path=/home/vipin/.config/JetBrains/IdeaIC2020.3 -Didea.plugins.path=/home/vipin/.local/share/JetBrains/IdeaIC2020.3 -Djps.log.dir=/home/vipin/.cache/JetBrains/IdeaIC2020.3/log/build-log -Djps.fallback.jdk.home=/home/vipin/.local/share/JetBrains/Toolbox/apps/IDEA-C/ch-0/203.7148.57/jbr -Djps.fallback.jdk.version=11.0.9.1 -Dio.netty.noUnsafe=true -Djava.io.tmpdir=/home/vipin/.cache/JetBrains/IdeaIC2020.3/compile-server/jdk_5c2ba8e3/_temp_ -Djps.backward.ref.index.builder=true -Dkotlin.incremental.compilation=true 10366 Test -XX:ConcGCThreads=6 -Xmx256m -Xms8m -Xss256k
jcmd to list Java processes
jcmd or jcmd -l both provides similar information as jps -l . You can read more about jcmd on post.
Conclusion
jps is a simple tool with few options that make it easy to master, and when in need it can be a quick and great help you wanted. Utilities like this are very useful in a situation when we need to analyze and resolve problems in production Java application quickly. jps is part of OpenJDK, no need to install any third party software.
If you want to get amazing Java jobs, I wrote an ebook 5 steps to Best Java Jobs. You can download this step-by-step guide for free!
Список процессов Java
Как я могу перечислить все процессы Java в bash? Мне нужна командная строка. Я знаю, что есть команда ps , но я не знаю, какие параметры мне нужно использовать.
пожалуйста, приложите больше усилий для изучения этой проблемы и описания вашей проблемы, есть много возможностей в зависимости от того, что именно вы ищете.
16 ответов
и посмотрите, как вы попадаете на
Недавняя Java-версия оснащена инструментом «jps» для процесса обработки виртуальной машины Java
[[email protected] support]$ jps -m 2120 Main --userdir /home/nsushkin/.netbeans/7.0 --branding nb 26546 charles.jar 17600 Jps -m
Только примечание: jps поставляется только с JDK, а не с JRE. Машины с простой средой выполнения Java на них не будут иметь этого инструмента.
является наиболее полезным. Печатает только pid и квалифицированное имя основного класса:
2472 com.intellij.idea.Main 11111 sun.tools.jps.Jps 9030 play.server.Server 2752 org.jetbrains.idea.maven.server.RemoteMavenServer
Вы можете использовать одиночную команду pgrep (не требует использования труб и нескольких команд):
Начиная с Java 7, самый простой способ и меньше подверженности ошибкам — просто использовать команду jcmd , которая является частью JDK, чтобы она работала так же на всех ОС.
> jcmd 5485 sun.tools.jcmd.JCmd 2125 MyProgram
jcmd позволяет отправлять запросы диагностической команды на запущенную Java Виртуальная машина (JVM).
Это приведет к возврату всех запущенных java-процессов в среде linux. Затем вы можете убить процесс, используя идентификатор процесса.
Если я хочу просто перечислить java-процессы, используйте:
ps axuwww | grep java | grep -v grep
- показать вам все процессы с длинными строками (arg: www)
- filter (grep) только строки, содержащие слово java, и
- отфильтруйте строку «grep java»:)
(Кстати, этот пример не эффективен, но просто запоминается);)
вы можете передать вышеуказанные команды другим командам, например:
ps axuwww | grep java | grep -v grep | sed '. ' | while read something do something_another $something done
Когда я хочу узнать, выполняется ли какой-либо Java-класс, я использую следующую командную строку:
ps ww -f -C java | grep "fully.qualified.name.of.class"
С точки зрения операционной системы имя команды процесса «java». Опция «ww» расширяет максимальные символы colum, поэтому можно grep FQN связанного класса.
jps и jcmd не показывали мне никаких результатов, когда я пробовал это, используя openjdk-1.8 на redhat linux. Но даже если бы это было сделано, это показывает только процессы под текущим пользователем, которые не работают в моем случае. Использование ps | grep — это то, что я закончил, но путь класса для некоторых приложений Java может быть чрезвычайно длинным, что делает результаты неразборчивыми, поэтому я использовал sed для его удаления. Это немного грубо, но удаляет все, кроме: PID, User, java-class/jar, args.
ps -o pid,user,cmd -C java | sed -e 's/\(4\+ *[^ ]*\) *[^ ]* *\([^$]*\)/\1 \2/' -e 's/-c[^ ]* [^ ]* \|-[^ ]* //g'
Результаты выглядят примерно так:
PID USER CMD 11251 userb org.apache.zookeeper.server.quorum.QuorumPeerMain ../config/zookeeper.properties 19574 userb com.intellij.idea.Main 28807 root org.apache.nifi.bootstrap.RunNiFi run 28829 root org.apache.nifi.NiFi
Альтернативой для окон для отображения всех процессов является:
WMIC path win32_process where "Caption='java.exe'" get ProcessId,Commandline
Но для этого потребуется разбор, чтобы сделать его более понятным.
Там много способов сделать это. Вы можете использовать java.lang.ProcessBuilder и «pgrep», чтобы получить идентификатор процесса (PID) с чем-то вроде: pgrep -fl java | awk . Или, если вы работаете под Linux, вы можете запросить каталог /proc .
Я знаю, это кажется ужасным, и не переносимым, и даже плохо реализованным, я согласен. Но поскольку Java фактически работает в VM, по какой-то абсурдной причине, которую я не могу понять после более чем 15 лет работы JDK, почему невозможно увидеть вещи вне пространства JVM, это действительно смешно с вами думаю об этом. Вы можете делать все остальное, даже fork и join дочерние процессы (это был ужасный способ многозадачности, когда мир не знал о потоках или pthreads, что, черт возьми, что происходит с Java. ).