Giter VIP home page Giter VIP logo

javasysmon's Introduction

JavaSysMon

JavaSysMon is designed to provide an OS-independent way to manage OS processes and get live system performance information such as CPU and memory usage, distributed as a single jar file. It is written in C and Java. However the native binaries are hidden away inside the jar, so you never need to worry about them.

Currently it supports Mac OS X, Linux, Windows, and Solaris. Ultimately we aim to support everything from AIX to Android.

If you’re interested in adding support for a new platform, check out the project wiki.

Download latest

The current version of JavaSysMon is 0.3.5, released May 14th 2014. You can get it here: http://continuousdelivery.com/downloads/javasysmon/javasysmon-0.3.5.jar

Run it with java -jar

Building and running

Run ant, and then:

java -jar target/javasysmon.jar

Using the library from code

Simply put the jar in your classpath, and use it like this:

import com.jezhumble.javasysmon.JavaSysMon;
   
JavaSysMon monitor =   new JavaSysMon();
String osName =        monitor.osName();
etc...

For full details of the API, consult the JavaDoc

Current support and limitations

  • Currently supports Mac OS X, Linux, Windows, and Solaris
  • Solaris binary is compiled on x86 on OpenSolaris, so it won't work on SPARC, and has not been tested on SunOS < 5.11
  • Solaris CPU usage only correctly reports usage for first CPU.
  • Supports Java 1.4 and above
  • CPU speed on Linux only reports correct values for Intel CPUs

Source code

The Java source code sits under src/main/java. The C source code is in src/main/c, with a subdirectory for each platform supported by JavaSysMon. The compiled binaries are stored in lib/native, and it is these that are used to build the jar when you run ant. So if you change the c source, you'll need to compile and copy the binary to lib/native before running ant in order to test your changes.

License

JavaSysMon uses the NetBSD (2-line) license.

Links

javasysmon's People

Contributors

eleotlecram avatar itspanzi avatar janmejay avatar jezhumble avatar jsankey avatar watsonmw avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

javasysmon's Issues

NPE when try to kill linux process running JDK8

java.lang.RuntimeException: Could not kill process id 5267
at com.jezhumble.javasysmon.LinuxMonitor.killProcess(LinuxMonitor.java:156)
at com.jezhumble.javasysmon.JavaSysMon.killProcess(JavaSysMon.java:242)
...
Caused by: java.lang.NullPointerException
at com.jezhumble.javasysmon.LinuxMonitor.killProcess(LinuxMonitor.java:154)
... 7 more

CPU usage per core

Hi, is there a way to get the CPU usage per core, I have a CPU with 4 cores, but in my aplication only 1 core is being used, I want to get the usage of that core only. thanks.

Add a function to getCurrentOsProcess()

Today to get the current OS process, we can do:

    OsProcess currentProcess = monitor.processTree().find(monitor.currentPid());
    if (currentProcess != null)

The function processTree() reads all process information, on Linux it may be a hundred of files.

As an optimization, we need to add a monitor.getCurrentOsProcess() function who reads only the necessary information.

build error on String.isEmpty() in NativeLibraryLoad.java

I replaced the call to isEmpty() to checking if the length() is equal to 0, and things compile fine:

diff --git a/src/main/java/com/jezhumble/javasysmon/NativeLibraryLoader.java b/src/main/java/com/jezhumble/javasysmon/NativeLibraryLoader.java
index 6a658cd..602b9a2 100644
--- a/src/main/java/com/jezhumble/javasysmon/NativeLibraryLoader.java
+++ b/src/main/java/com/jezhumble/javasysmon/NativeLibraryLoader.java
@@ -45,7 +45,7 @@ class NativeLibraryLoader {

 private File createTempFile(String suffix, String prefix) throws IOException {
     String tempDirProp = System.getProperty(JAVA_SYS_MON_TEMP_DIR);
  •    if (tempDirProp == null || tempDirProp.isEmpty()) {
    
  •    if (tempDirProp == null || tempDirProp.length() == 0) {
         return File.createTempFile(prefix, suffix);
     }
     return File.createTempFile(prefix, suffix, new File(tempDirProp));
    

x86 Version

Hi Jez,

thx for the new javasysmon-0.3.5. It works fine under windows 7 x64 and OpenSuse for my purposes (identifying and killing processes).

Unfortunately the javasysmon.dll seems to be compiled for the x64 platform too (instead of x86).

I allready cloned your repo and rebuild the windows c code for the x86 platform (using Visual Studio 2013 which converted the project to an .vcxproj) and javasysmon now also works fine within a x86 platform (windows 7).

Should I push these changes to your repo, or have you allready fixed this by yourself?

Greetz
c

p.s.: btw I just run into a similiar problem running javasysmon under windows vista x64. with a javasysmon64.dll compiled for the Platform Toolset - v120_xp, build with a x64 configuration javasysmon works.

Access violation in call to processTable() - (Win7 64bit)

I'm getting an access violation when calling processTable() using the 0.3.4 version. Never had the issue in 0.3.3 and it occurs ~80% of the time now. I've tried to debug as best as possible and it appears the problem is happening in the native library as it's building up the list. It usually calls back into the Java realm, creating about 50 entries in the process array and then blows up. Nothing appears to be special about the process entry that it hits.

I modified the 0.3.4 jar file and replaced the native libraries with those from 0.3.3 and the problem goes away, so it appears that there is something different there. I'm not sure if it's changes in the source or something to do with how it was built. I don't have the environment setup to build 64 bit c apps, so I can't test anything in the native code.

I'm running on an Intel I5 with 64bit Windows 7.
The following is the contents of one of the PID logs.

A fatal error has been detected by the Java Runtime Environment:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000007fefb9a20f5, pid=7096, tid=7160

JRE version: 6.0_30-b12

Java VM: Java HotSpot(TM) 64-Bit Server VM (20.5-b03 mixed mode windows-amd64 compressed oops)

Problematic frame:

C [javasysmon67460144577357833730.dll+0x20f5]

If you would like to submit a bug report, please visit:

http://java.sun.com/webapps/bugreport/crash.jsp

The crash happened outside the Java Virtual Machine in native code.

See problematic frame for where to report the bug.

--------------- T H R E A D ---------------

Current thread (0x000000000a018000): JavaThread "<...removed...>" [_thread_in_native, id=7160, stack(0x000000000f2d0000,0x000000000f3d0000)]

siginfo: ExceptionCode=0xc0000005, reading address 0x00000000002e8070

Registers:
RAX=0x0000000000000001, RBX=0x0000000000000998, RCX=0x000000000f3cf4c0, RDX=0xfffffffff0f18bb0
RSP=0x000000000f3ce028, RBP=0x000000000f3ce130, RSI=0x00000000002e7f70, RDI=0x0000000000000000
R8 =0x0000000000000104, R9 =0x000000000000002e, R10=0x0000000000000017, R11=0x000000000f3cf3c0
R12=0x0000000000000000, R13=0x0000000000000000, R14=0x000000000a0181d0, R15=0x0000000000000030
RIP=0x000007fefb9a20f5, EFLAGS=0x0000000000010206

Top of Stack: (sp=0x000000000f3ce028)
0x000000000f3ce028: 000007fefb9a1833 0000000000000998
0x000000000f3ce038: 000000000f3ce130 00000000002e1ed0
0x000000000f3ce048: 0000000000000000 0000000000000ae0
0x000000000f3ce058: 000000000b656a68 000000000b656a60
0x000000000f3ce068: 000000000b656a58 0000000000021f23
0x000000000f3ce078: 000000000004a1ba 0000000006c61000
0x000000000f3ce088: 000000000c52b000 0000043800000250
0x000000000f3ce098: 0000000000000030 000000000a0181d0
0x000000000f3ce0a8: 0000000700000061 000000000000099c
0x000000000f3ce0b8: 000000000b656a50 0000000000000994
0x000000000f3ce0c8: 0000000000000000 00000000b4ed8ec2
0x000000000f3ce0d8: 000000000f3ce370 0000000052e06231
0x000000000f3ce0e8: 000000000b656030 00000000b4ed8ec2
0x000000000f3ce0f8: 0000000052e06231 00000000002e7f70
0x000000000f3ce108: 0000000140000000 00000000002e1ed0
0x000000000f3ce118: 0000000700000001 0000000000000000

Instructions: (pc=0x000007fefb9a20f5)
0x000007fefb9a20d5: c8 88 01 f6 c1 02 74 0f 48 83 e9 02 66 8b 04 0a
0x000007fefb9a20e5: 49 83 e8 02 66 89 01 f6 c1 04 74 0d 48 83 e9 04
0x000007fefb9a20f5: 8b 04 0a 49 83 e8 04 89 01 4d 8b c8 49 c1 e9 05
0x000007fefb9a2105: 75 50 4d 8b c8 49 c1 e9 03 74 14 48 83 e9 08 48

Register to memory mapping:

RAX=0x0000000000000001 is an unknown value
RBX=0x0000000000000998 is an unknown value
RCX=0x000000000f3cf4c0 is pointing into the stack for thread: 0x000000000a018000
RDX=0xfffffffff0f18bb0 is an unknown value
RSP=0x000000000f3ce028 is pointing into the stack for thread: 0x000000000a018000
RBP=0x000000000f3ce130 is pointing into the stack for thread: 0x000000000a018000
RSI=0x00000000002e7f70 is an unknown value
RDI=0x0000000000000000 is an unknown value
R8 =0x0000000000000104 is an unknown value
R9 =0x000000000000002e is an unknown value
R10=0x0000000000000017 is an unknown value
R11=0x000000000f3cf3c0 is pointing into the stack for thread: 0x000000000a018000
R12=0x0000000000000000 is an unknown value
R13=0x0000000000000000 is an unknown value
R14=0x000000000a0181d0 is an unknown value
R15=0x0000000000000030 is an unknown value

Stack: [0x000000000f2d0000,0x000000000f3d0000], sp=0x000000000f3ce028, free space=1016k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [javasysmon67460144577357833730.dll+0x20f5] Java_com_jezhumble_javasysmon_WindowsMonitor_killProcess+0x575

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j com.jezhumble.javasysmon.WindowsMonitor.processTable()[Lcom/jezhumble/javasysmon/ProcessInfo;+0
j com.jezhumble.javasysmon.JavaSysMon.processTable()[Lcom/jezhumble/javasysmon/ProcessInfo;+3
<...removed...>
j java.lang.Thread.run()V+11
v ~StubRoutines::call_stub

--------------- P R O C E S S ---------------

Java Threads: ( => current thread )
0x000000000a019000 JavaThread "Thread-24" [_thread_blocked, id=472, stack(0x000000000f4e0000,0x000000000f5e0000)]
=>0x000000000a018000 JavaThread "<...removed...>" [_thread_in_native, id=7160, stack(0x000000000f2d0000,0x000000000f3d0000)]
0x000000000a017800 JavaThread "imqConsumerReader-0-7212301625736077312-0" [_thread_blocked, id=492, stack(0x000000000f1d0000,0x000000000f2d0000)]
0x000000000a016800 JavaThread "connector-timer-proxy" daemon [_thread_blocked, id=6224, stack(0x000000000f0d0000,0x000000000f1d0000)]
0x000000000a016000 JavaThread "Timer-0" daemon [_thread_blocked, id=5188, stack(0x000000000efd0000,0x000000000f0d0000)]
0x000000000a015000 JavaThread "iMQReadChannel-7" [_thread_in_native, id=7348, stack(0x000000000ec00000,0x000000000ed00000)]
0x000000000a014800 JavaThread "imqConnectionFlowControl-7" [_thread_blocked, id=2448, stack(0x000000000eb00000,0x000000000ec00000)]
0x000000000a013800 JavaThread "iMQReadChannel-6" [_thread_in_native, id=6024, stack(0x000000000ea00000,0x000000000eb00000)]
0x000000000a013000 JavaThread "imqConnectionFlowControl-6" [_thread_blocked, id=7552, stack(0x000000000e900000,0x000000000ea00000)]
0x000000000a012800 JavaThread "iMQReadChannel-5" [_thread_in_native, id=6040, stack(0x000000000e800000,0x000000000e900000)]
0x000000000a011800 JavaThread "imqConnectionFlowControl-5" [_thread_blocked, id=1148, stack(0x000000000e4e0000,0x000000000e5e0000)]
0x00000000067a2000 JavaThread "iMQReadChannel-4" [_thread_in_native, id=6356, stack(0x000000000e3e0000,0x000000000e4e0000)]
0x00000000067a1800 JavaThread "imqConnectionFlowControl-4" [_thread_blocked, id=7720, stack(0x000000000e2e0000,0x000000000e3e0000)]
0x00000000067a1000 JavaThread "iMQReadChannel-3" [_thread_in_native, id=7708, stack(0x000000000de80000,0x000000000df80000)]
0x00000000067a0000 JavaThread "imqConnectionFlowControl-3" [_thread_blocked, id=6212, stack(0x000000000dd80000,0x000000000de80000)]
0x000000000679f800 JavaThread "iMQReadChannel-2" [_thread_in_native, id=5852, stack(0x000000000e5e0000,0x000000000e6e0000)]
0x000000000679e800 JavaThread "imqConnectionFlowControl-2" [_thread_blocked, id=7572, stack(0x000000000dc80000,0x000000000dd80000)]
0x000000000679e000 JavaThread "iMQReadChannel-1" [_thread_in_native, id=7900, stack(0x000000000e700000,0x000000000e800000)]
0x000000000679d000 JavaThread "imqConnectionFlowControl-1" [_thread_blocked, id=6276, stack(0x000000000dfd0000,0x000000000e0d0000)]
0x000000000679c800 JavaThread "iMQReadChannel-0" [_thread_in_native, id=7628, stack(0x000000000e1e0000,0x000000000e2e0000)]
0x000000000679b800 JavaThread "imqConnectionFlowControl-0" [_thread_blocked, id=7360, stack(0x000000000e0e0000,0x000000000e1e0000)]
0x000000000679b000 JavaThread "p: default-threadpool; w: 7" daemon [_thread_blocked, id=4416, stack(0x000000000cbb0000,0x000000000ccb0000)]
0x000000000679a800 JavaThread "p: default-threadpool; w: 6" daemon [_thread_blocked, id=8156, stack(0x000000000cab0000,0x000000000cbb0000)]
0x0000000006799800 JavaThread "p: default-threadpool; w: 5" daemon [_thread_blocked, id=7600, stack(0x000000000c9b0000,0x000000000cab0000)]
0x0000000006799000 JavaThread "p: default-threadpool; w: 4" daemon [_thread_blocked, id=7024, stack(0x000000000c710000,0x000000000c810000)]
0x0000000006798000 JavaThread "p: default-threadpool; w: 3" daemon [_thread_blocked, id=6360, stack(0x000000000c4e0000,0x000000000c5e0000)]
0x0000000006797800 JavaThread "p: default-threadpool; w: 2" daemon [_thread_in_native, id=6076, stack(0x000000000c8b0000,0x000000000c9b0000)]
0x0000000006796800 JavaThread "p: default-threadpool; w: 1" daemon [_thread_in_native, id=8032, stack(0x000000000b330000,0x000000000b430000)]
0x0000000006796000 JavaThread "transaction-manager" daemon [_thread_blocked, id=5432, stack(0x0000000009160000,0x0000000009260000)]
0x0000000006795000 JavaThread "SelectorThread" daemon [_thread_in_native, id=5848, stack(0x000000000c610000,0x000000000c710000)]
0x0000000006794800 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=6464, stack(0x0000000006e40000,0x0000000006f40000)]
0x00000000067af000 JavaThread "C2 CompilerThread1" daemon [_thread_in_native, id=7508, stack(0x0000000006d40000,0x0000000006e40000)]
0x00000000067aa000 JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=7904, stack(0x0000000006c40000,0x0000000006d40000)]
0x0000000006794000 JavaThread "Attach Listener" daemon [_thread_blocked, id=7740, stack(0x0000000006b40000,0x0000000006c40000)]
0x0000000006793000 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=7124, stack(0x0000000006a40000,0x0000000006b40000)]
0x000000000052a800 JavaThread "Finalizer" daemon [_thread_blocked, id=4064, stack(0x0000000006940000,0x0000000006a40000)]
0x0000000000529000 JavaThread "Reference Handler" daemon [_thread_blocked, id=1420, stack(0x0000000006640000,0x0000000006740000)]
0x00000000005fe800 JavaThread "main" [_thread_blocked, id=3944, stack(0x0000000002420000,0x0000000002520000)]

Other Threads:
0x0000000000522800 VMThread [stack: 0x0000000006540000,0x0000000006640000] [id=6460]
0x00000000067c4000 WatcherThread [stack: 0x0000000006f40000,0x0000000007040000] [id=784]

VM state:not at safepoint (normal execution)

VM Mutex/Monitor currently owned by a thread: None

Heap
PSYoungGen total 266304K, used 83504K [0x00000007d5e00000, 0x00000007f0aa0000, 0x0000000800000000)
eden space 258560K, 29% used [0x00000007d5e00000,0x00000007da7fef50,0x00000007e5a80000)
from space 7744K, 99% used [0x00000007e5a80000,0x00000007e620d160,0x00000007e6210000)
to space 12608K, 0% used [0x00000007efe50000,0x00000007efe50000,0x00000007f0aa0000)
PSOldGen total 86272K, used 15310K [0x0000000781a00000, 0x0000000786e40000, 0x00000007d5e00000)
object space 86272K, 17% used [0x0000000781a00000,0x00000007828f39b8,0x0000000786e40000)
PSPermGen total 39488K, used 39387K [0x000000077c800000, 0x000000077ee90000, 0x0000000781a00000)
object space 39488K, 99% used [0x000000077c800000,0x000000077ee76e08,0x000000077ee90000)

Code Cache [0x0000000002520000, 0x0000000002820000, 0x0000000005520000)
total_blobs=849 nmethods=411 adapters=391 free_code_cache=47523136 largest_free_block=208064

Dynamic libraries:
0x0000000000400000 - 0x000000000042f000 C:\Java\jdk1.6.0_30\bin\java.exe
0x00000000778e0000 - 0x0000000077a89000 C:\WINDOWS\SYSTEM32\ntdll.dll
0x0000000077640000 - 0x000000007775f000 C:\WINDOWS\system32\kernel32.dll
0x000007fefd9a0000 - 0x000007fefda0b000 C:\WINDOWS\system32\KERNELBASE.dll
0x000007fefdea0000 - 0x000007fefdf7b000 C:\WINDOWS\system32\ADVAPI32.dll
0x000007fefe7d0000 - 0x000007fefe86f000 C:\WINDOWS\system32\msvcrt.dll
0x000007fefe230000 - 0x000007fefe24f000 C:\WINDOWS\SYSTEM32\sechost.dll
0x000007fefe060000 - 0x000007fefe18d000 C:\WINDOWS\system32\RPCRT4.dll
0x000007fefd7f0000 - 0x000007fefd847000 C:\WINDOWS\system32\apphelp.dll
0x0000000069a30000 - 0x0000000069a4a000 C:\WINDOWS\AppPatch\AppPatch64\EMET64.dll
0x0000000077760000 - 0x000000007785a000 C:\WINDOWS\system32\USER32.dll
0x000007fefde30000 - 0x000007fefde97000 C:\WINDOWS\system32\GDI32.dll
0x000007fefdf80000 - 0x000007fefdf8e000 C:\WINDOWS\system32\LPK.dll
0x000007fefdf90000 - 0x000007fefe059000 C:\WINDOWS\system32\USP10.dll
0x000007fefe200000 - 0x000007fefe22e000 C:\WINDOWS\system32\IMM32.DLL
0x000007fefe870000 - 0x000007fefe979000 C:\WINDOWS\system32\MSCTF.dll
0x000000006d8b0000 - 0x000000006e068000 C:\Java\jdk1.6.0_30\jre\bin\server\jvm.dll
0x000007fefb1c0000 - 0x000007fefb1fb000 C:\WINDOWS\system32\WINMM.dll
0x000000006d820000 - 0x000000006d82e000 C:\Java\jdk1.6.0_30\jre\bin\verify.dll
0x000000006d450000 - 0x000000006d477000 C:\Java\jdk1.6.0_30\jre\bin\java.dll
0x000000006d870000 - 0x000000006d882000 C:\Java\jdk1.6.0_30\jre\bin\zip.dll
0x000000006d6b0000 - 0x000000006d6c7000 C:\Java\jdk1.6.0_30\jre\bin\net.dll
0x000007fefe4d0000 - 0x000007fefe51d000 C:\WINDOWS\system32\WS2_32.dll
0x000007fefe190000 - 0x000007fefe198000 C:\WINDOWS\system32\NSI.dll
0x000007fefd030000 - 0x000007fefd085000 C:\WINDOWS\system32\mswsock.dll
0x000007fefd020000 - 0x000007fefd027000 C:\WINDOWS\System32\wship6.dll
0x000007fefc3d0000 - 0x000007fefc3e5000 C:\WINDOWS\system32\NLAapi.dll
0x000007fef94b0000 - 0x000007fef94c5000 C:\WINDOWS\system32\napinsp.dll
0x000007fef9500000 - 0x000007fef9519000 C:\WINDOWS\system32\pnrpnsp.dll
0x000007fefcf60000 - 0x000007fefcfbb000 C:\WINDOWS\system32\DNSAPI.dll
0x000007fef94a0000 - 0x000007fef94ab000 C:\WINDOWS\System32\winrnr.dll
0x000007fefcad0000 - 0x000007fefcad7000 C:\WINDOWS\System32\wshtcpip.dll
0x000007fefaa70000 - 0x000007fefaa97000 C:\WINDOWS\system32\IPHLPAPI.DLL
0x000007fefaa60000 - 0x000007fefaa6b000 C:\WINDOWS\system32\WINNSI.DLL
0x000007fef9540000 - 0x000007fef9548000 C:\WINDOWS\system32\rasadhlp.dll
0x000007fefa0e0000 - 0x000007fefa133000 C:\WINDOWS\System32\fwpuclnt.dll
0x000007fefd090000 - 0x000007fefd0a7000 C:\WINDOWS\system32\CRYPTSP.dll
0x000007fefce40000 - 0x000007fefce87000 C:\WINDOWS\system32\rsaenh.dll
0x000007fefcbf0000 - 0x000007fefcc0e000 C:\WINDOWS\system32\USERENV.dll
0x000007fefd8b0000 - 0x000007fefd8bf000 C:\WINDOWS\system32\profapi.dll
0x000007fefd740000 - 0x000007fefd74f000 C:\WINDOWS\system32\CRYPTBASE.dll
0x000000006d5f0000 - 0x000000006d5fa000 C:\Java\jdk1.6.0_30\jre\bin\management.dll
0x000000006d6d0000 - 0x000000006d6db000 C:\Java\jdk1.6.0_30\jre\bin\nio.dll
0x000007fefb9a0000 - 0x000007fefb9b0000 C:<...removed...>\Temp\javasysmon67460144577357833730.dll
0x0000000077aa0000 - 0x0000000077aa7000 C:\WINDOWS\system32\PSAPI.DLL

VM Arguments:
jvm_args: -DBASE_DIR=<...removed...>
java_command: <...removed...>
Launcher Type: SUN_STANDARD

Environment Variables:
JAVA_HOME=C:\Java\jdk1.6.0_30
PATH=c:\minGW\bin;C:\Java\jdk1.6.0_30\bin;C:\ghc\threadscope-0.2.2\bin;C:\WinAVR-20100110\bin;C:\WinAVR-20100110\utils\bin;C:\Perl\site\bin;C:\Perl\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\apache-ant-1.8.3\bin;C:\Program Files (x86)\MySQL\MySQL Server 5.1\bin;c:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn;C:\Program Files\doxygen\bin;C:\Program Files (x86)\CMake 2.8\bin
USERNAME=<...removed...>
OS=Windows_NT
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 42 Stepping 7, GenuineIntel

--------------- S Y S T E M ---------------

OS: Windows 7 , 64 bit Build 7601 Service Pack 1

CPU:total 4 (4 cores per cpu, 1 threads per core) family 6 model 42 stepping 7, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt

Memory: 4k page, physical 8273936k(3247828k free), swap 16546012k(11470452k free)

vm_info: Java HotSpot(TM) 64-Bit Server VM (20.5-b03) for windows-amd64 JRE (1.6.0_30-b12), built on Nov 10 2011 01:49:46 by "java_re" with MS VC++ 8.0 (VS2005)

time: Thu Apr 18 10:24:15 2013
elapsed time: 4 seconds

ProcessInfo.html#getCommand() returns wrong information on Windows

According to [1] ProcessInfo#getCommand() should return:

"The command that was originally used to start this process."

This means that for a process started like: "java -jar javasysmon.jar"
The returned string should be, well, just that: "java -jar javasysmon.jar"

Currently this only works as advertised on Linux. The docs state that it shouldn't work for MacOSX and Solaris, but I can confirm it doesn't work for Windows either. On windows the returned string is retrieved using "GetProcessImageFileName", this does not return the command line string that was used to start the process, it returns rather a string like:

"\Device\HarddiskVolume1\WINDOWS\system32\java.exe"

Which is not what you want.

[1] - http://jezhumble.github.com/javasysmon/com/jezhumble/javasysmon/ProcessInfo.html#getCommand()

Process handle leak when killing a process on Windows

There's a leaked file handle for every process you kill on windows.

You can see this by running the following:

    JavaSysMon sysMon = new JavaSysMon();
    for (int j = 0; j < 100000; ++j) {
        ProcessInfo[] processes = sysMon.processTable();
        for (int i = 0; i < processes.length; ++i) {
            ProcessInfo p = processes[i];
            if (p.getName().equalsIgnoreCase("notepad.exe")) {
                sysMon.killProcess(p.getPid());
            }
        }
    }

Then watching the process handles creep up in the Task Manager everytime you launch notepad.

There's a fix included in:

#22

Can make a separate pull request if needed (whichever is preferred).

Sometimes throws java.lang.NumberFormatException

Description

JVM works on Ubuntu

Scheduled task inside JVM periodically ask system statistics and catch following exceptions:

  • java.lang.NumberFormatException: null
    at java.lang.Long.parseLong(Unknown Source)
    at java.lang.Long.parseLong(Unknown Source)
    at com.jezhumble.javasysmon.LinuxMonitor.uptimeInSeconds(LinuxMonitor.java:105)
    at com.jezhumble.javasysmon.JavaSysMon.uptimeInSeconds(JavaSysMon.java:156)
  • java.lang.NumberFormatException: null
    at java.lang.Long.parseLong(Unknown Source)
    at java.lang.Long.parseLong(Unknown Source)
    at com.jezhumble.javasysmon.LinuxMonitor.physical(LinuxMonitor.java:66)
    at com.jezhumble.javasysmon.JavaSysMon.physical(JavaSysMon.java:192)

I can't detect some preconditions of specified errors. Time between exceptions aren't fixed.
Files in /proc are exists and contains required values.

Various system info

uname -a
Linux xxxxx-Ubuntu SMP Tue Aug 30 19:33:19 UTC 2011 x86_64 GNU/Linux

cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.10
DISTRIB_CODENAME=maverick
DISTRIB_DESCRIPTION="Ubuntu 10.10"

cat /proc/meminfo
MemTotal: 1697024 kB
MemFree: 864440 kB
... etc

cat /proc/uptime
80084.28 149307.49

Clean way to exec a new sub process and get its PID to be able to kill it?

Hi

First, I am not sure if this is the right place for this issue. Is there a forum for such a question?

I want to create a new sub process with

Runtime.getRuntime().exec( ...

Then later I want to be able to kill that process and its childs.
The java Process.destroyForcibly() did not work, but JavaSysMon.killProcessTree() does.
So I need the PID of the newly created process.

My current approach is to do it this way:

  1. Create a lock around the start procedure
  2. get list of all child PIDs
  3. create the sub process
  4. get list of all child PIDs
  5. find the PID that did not existed before

Here is my code:

// locking
synchronized(ExternCmd.class){
    int[] childsBefore = getChildPids();
    Process process = Runtime.getRuntime().exec( cmdLine.toArray( new String[ cmdLine.size() ]), null, workdir );
    int[] childsAfter = getChildPids();
    int subPid = -1;
    for( int i = 0; i < childsAfter.length; i++ ){
        if( Arrays.binarySearch( childsBefore, childsAfter[i] ) < 0 ){
            Assert.isTrue( subPid < 0, "A PID was already found. The result is ambiguous." );
            subPid = childsAfter[i];
            Assert.isTrue( subPid > 0 );
        }
    }
    Assert.isTrue( subPid > 0, "The PID was not found" );
} // end of locking, now use the subPid

private int[] getChildPids(){
    JavaSysMon sysMon = new com.jezhumble.javasysmon.JavaSysMon();
    List<?> childs = sysMon.processTree().find(sysMon.currentPid()).children();
    int[] res = new int[childs.size()];
    int idx = 0;
    for( Object c : childs ){
        res[idx] = ((OsProcess)c).processInfo().getPid();
    }
    Arrays.sort( res );
    return res;
}

But this seems to have drawbacks and be fragile. Isn't it?

  • It would be good if starting synchronized is not needed
  • If somewhere in the same application another process is started independantly this would result in a ambiguous PID.

My question:

  1. Is there a better way to it?
  2. If not, could JavaSysMon implement support for this use case?

thx
Frank

windows 32bit dll was incorrectly compiled as 64bit

Latest javasysmon release has incorrectly compiled dll:

D:\APPS>"C:\Program Files\Java\jdk1.6.0_24\bin\java" -jar ./lib/javasysmon-0.3.5.jar
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Documents and Settings\romikk\Local Settings\Temp\2\javasysmo5686058043554074094.dll: Can't l
oad AMD 64-bit .dll on a IA 32-bit platform
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1803)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1699)
at java.lang.Runtime.load0(Runtime.java:770)
at java.lang.System.load(System.java:1003)
at com.jezhumble.javasysmon.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:16)
at com.jezhumble.javasysmon.WindowsMonitor.(WindowsMonitor.java:11)
at com.jezhumble.javasysmon.JavaSysMon.(JavaSysMon.java:53)
Could not find the main class: com.jezhumble.javasysmon.JavaSysMon. Program will exit.

Frequent processTable() usage causes "Too many open files" exception

As the passwdFile hanlder from (passwdFile = new FileInputStream("/etc/passwd") is not closed anywhere, and rather waiting for the GC, each call to this functions opens hundreds of held descriptors to "/etc/passwd".

Running this command more often the once per 5 min, quickly depletes the available amount of descriptors and causes "Too many open files" error.

The typical descriptors list looks like this:
java 22309 evgeni 1017r REG 9,2 2565 4426422 /etc/passwd
java 22309 evgeni 1018r REG 9,2 2565 4426422 /etc/passwd
java 22309 evgeni 1019r REG 9,2 2565 4426422 /etc/passwd
java 22309 evgeni 1020r REG 9,2 2565 4426422 /etc/passwd
java 22309 evgeni 1021r REG 9,2 2565 4426422 /etc/passwd
java 22309 evgeni 1022r REG 9,2 2565 4426422 /etc/passwd
java 22309 evgeni 1023r REG 9,2 2565 4426422 /etc/passwd

This issue is easily solved by closing the handler as following (quick fix, better solution most welcome):

public HashMap parse() {
    FileInputStream passwdFile = null;

    try {
        passwdFile = new FileInputStream("/etc/passwd");
        BufferedReader reader = new BufferedReader(new InputStreamReader(passwdFile, "UTF-8"));

        HashMap map = parse(reader);
        passwdFile.close();

        return map;
    } catch (IOException e) {
        System.err.println("Error reading password file: " + e.getMessage());

        try
        {
        if(passwdFile != null)
            passwdFile.close();
        }
        catch (Exception e2) {
            // TODO: handle exception
        }

        return new HashMap();
    }
}

mismatched data in process list, in Windows 7

As reported in the google group. This is with Windows 7, Oracle JDK 1.7.0_25, javasysmon-0.3.3.jar.

In the output below, notice that the process name and process command string don't always match up; for some records it does, and for some records it doesn't. As just one example, notice that the record containing "calc.exe" as a command string, says that the process name is "bash.exe".

Code:

Monitor monitor = new JavaSysMon();
for (ProcessInfo process : monitor.processTable()) {
  int pid = process.getPid();
  String name = process.getName();
  String command = process.getCommand();
  System.out.println(String.format("%7s %20s \"%s\"", pid, name, command));
}

Output:

  0            <unknown> "<unknown>"
  4            <unknown> "<unknown>"
328            <unknown> "<unknown>"
420            <unknown> "<unknown>"
488            <unknown> "<unknown>"
496            <unknown> "<unknown>"
548            <unknown> "<unknown>"
556            <unknown> "<unknown>"
568            <unknown> "<unknown>"
628            <unknown> "<unknown>"
712            <unknown> "<unknown>"
784            <unknown> "<unknown>"
824            <unknown> "<unknown>"
932            <unknown> "<unknown>"
964            <unknown> "<unknown>"

1004 ""
808 ""
1112 ""
1136 ""
1240 ""
1312 ""
1544 ""
1572 ""
1740 ""
1764 ""
1828 ""
1948 ""
1204 ""
2024 ""
1144 ""
1092 ""
2764 ""
2848 ""
996 "\Device\HarddiskVolume2\Windows\System32\taskhost.exe"
2172 "\Device\HarddiskVolume2\Windows\System32\dwm.exe"
484 "\Device\HarddiskVolume2\Windows\explorer.exe"
2728 "\Device\HarddiskVolume2\Windows\explorer.exe"
728 msnmsgr.exe "\Device\HarddiskVolume2\Program Files (x86)\Windows Live\Messenger\msnmsgr.exe"
2448 trillian.exe "\Device\HarddiskVolume2\Program Files (x86)\Trillian\trillian.exe"
2200 smax4pnp.exe "\Device\HarddiskVolume2\Program Files (x86)\Analog Devices\Core\smax4pnp.exe"
2428 smax4pnp.exe "\Device\HarddiskVolume2\Program Files (x86)\Analog Devices\Core\smax4pnp.exe"
2032 ccApp.exe "\Device\HarddiskVolume2\Program Files (x86)\Common Files\Symantec Shared\ccApp.exe"
3328 hqtray.exe "\Device\HarddiskVolume2\Program Files (x86)\VMware\VMware Player\hqtray.exe"
4048 hqtray.exe "\Device\HarddiskVolume2\Program Files (x86)\VMware\VMware Player\hqtray.exe"
3928 wlcomm.exe "\Device\HarddiskVolume2\Program Files (x86)\Windows Live\Contacts\wlcomm.exe"
4952 wlcomm.exe "\Device\HarddiskVolume2\Program Files (x86)\Windows Live\Contacts\wlcomm.exe"
6020 wlcomm.exe "\Device\HarddiskVolume2\Program Files (x86)\Windows Live\Contacts\wlcomm.exe"
7152 wlcomm.exe "\Device\HarddiskVolume2\Program Files\Eclipse\eclipse.exe"
6008 wlcomm.exe "\Device\HarddiskVolume2\Windows\System32\javaw.exe"
6844 thunderbird.exe "\Device\HarddiskVolume2\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe"
4148 firefox.exe "\Device\HarddiskVolume2\Program Files (x86)\Mozilla Firefox\firefox.exe"
2368 plugin-container.exe "\Device\HarddiskVolume2\Program Files (x86)\Mozilla Firefox\plugin-container.exe"
3184 plugin-container.exe "\Device\HarddiskVolume2\Windows\System32\cmd.exe"
640 plugin-container.exe "\Device\HarddiskVolume2\Windows\System32\conhost.exe"
7024 TextPad.exe "\Device\HarddiskVolume2\Program Files (x86)\TextPad 5\TextPad.exe"
4772 wish.exe "\Device\HarddiskVolume2\Program Files (x86)\Git\bin\wish.exe"
4512 wish.exe "\Device\HarddiskVolume2\Program Files\Eclipse\eclipse.exe"
6964 wish.exe "\Device\HarddiskVolume2\Windows\System32\javaw.exe"
4164 plugin-container.exe "\Device\HarddiskVolume2\Program Files (x86)\Mozilla Firefox\plugin-container.exe"
5912 plugin-container.exe "\Device\HarddiskVolume2\Windows\splwow64.exe"
4396 plugin-container.exe "\Device\HarddiskVolume2\Windows\System32\cmd.exe"
2484 plugin-container.exe "\Device\HarddiskVolume2\Windows\System32\conhost.exe"
3288 bash.exe "\Device\HarddiskVolume2\programs\cygwin\bin\bash.exe"
6956 bash.exe "\Device\HarddiskVolume2\Windows\System32\cmd.exe"
4812 bash.exe "\Device\HarddiskVolume2\Windows\System32\conhost.exe"
6104 bash.exe "\Device\HarddiskVolume2\Program Files\Java\jdk1.6.0_21\bin\java.exe"
1152 javaw.exe "\Device\HarddiskVolume2\dev\sdf\tools\jdk1.6.0_25\win32\bin\javaw.exe"
644 javaw.exe "\Device\HarddiskVolume2\dev\sdf\tools\jdk1.6.0_25\win32\bin\javaw.exe"
6992 javaw.exe "\Device\HarddiskVolume2\dev\sdf\tools\jdk1.6.0_25\win32\bin\javaw.exe"
5192 javaw.exe "\Device\HarddiskVolume2\Windows\System32\cmd.exe"
1776 javaw.exe "\Device\HarddiskVolume2\Windows\System32\conhost.exe"
5928 bash.exe "\Device\HarddiskVolume2\programs\cygwin\bin\bash.exe"
8468 bash.exe "\Device\HarddiskVolume2\programs\cygwin\bin\bash.exe"
7392 bash.exe "\Device\HarddiskVolume2\Windows\System32\calc.exe"

NullPointerException in ProcessInfo.stringFormat

Got below exception when running on Linux:

$ uname -a
Linux lonsl1100576 2.6.32-573.12.1.el6.x86_64 #1 SMP Mon Nov 23 12:55:32 EST 2015 x86_64 x86_64 x86_64 GNU/Linux
$ /apps/java/64/jdk1.8.0_45/bin/java -cp "lib/javasysmon-0.3.5.jar" com.jezhumble.javasysmon.JavaSysMon
..skipped output...
Exception in thread "main" java.lang.NullPointerException
        at com.jezhumble.javasysmon.ProcessInfo.stringFormat(ProcessInfo.java:184)
        at com.jezhumble.javasysmon.ProcessInfo.stringFormat(ProcessInfo.java:179)
        at com.jezhumble.javasysmon.ProcessInfo.toString(ProcessInfo.java:160)
        at com.jezhumble.javasysmon.JavaSysMon.main(JavaSysMon.java:98)

JavaSysMon returns wrong result for free swap on Windows

new JavaSysMon.swap().getFreeBytes()

works incorrectly under Windows, it returns the amount of used virtual memory, not free. It's very easy to test - just load or unload some applications and check the result.

http://github.com/jezhumble/javasysmon/blob/master/src/main/c/windows/javasysmon.c

JNIEXPORT jobject JNICALL Java_com_jezhumble_javasysmon_WindowsMonitor_swap (JNIEnv *env, jobject obj)
{...
(jlong) (pagesize * perfinfo.CommitTotal), // should be (perfinfo.CommitLimit - perfinfo.CommitTotal)
(jlong) (pagesize * perfinfo.CommitLimit));...
}
CommitTotal
The number of pages currently committed by the system. Note that committing pages (using VirtualAlloc with MEM_COMMIT) changes this value immediately; however, the physical memory is not charged until the pages are accessed.
CommitLimit
The current maximum number of pages that can be committed by the system without extending the paging file(s). This number can change if memory is added or deleted, or if pagefiles have grown, shrunk, or been added. If the paging file can be extended, this is a soft limit.

Network and Disk stats

It will be awesome to have network and disk usage and speed statistics at lease in Windows and Linux thanks to javasysmon2

object.swap() returns not free memory, but occupied memory

Hi, I got the following results :
object = com.jezhumble.javasysmon.JavaSysMon;
physicalStr = char(object.physical()); % total: 8096Mb free: 2032Mb
swapStr = char(object.swap()); %total: 16343Mb free: 12052Mb

The swap free space was shown 12052Mb, but infact the swap used was 12052Mb. So there shoud be somewhere wrong.

My computer has 8GB RAM, and 2032 was free.
Swap was assigned another ~8Gb, and total memory used = physical 6Gb + swap 6Gb = 12 Gb.

Can't find process by PID

This happens in Windows 7 Home Premium (64bit).
I'm using the following code snippet:

import com.jezhumble.javasysmon.JavaSysMon;
import java.io.*;

public class Test {
    public static void main(String[] argv) {
        JavaSysMon monitor =   new JavaSysMon();
        System.out.println(monitor.processTree().find(Integer.parseInt(argv[0])));
    }
}

When running the compiled program, I get:

C:\Users\Qa\Downloads>java -cp javasysmon-0.3.3.jar;. Test 9592
null

While the process PID=9592 exists:

C:\Users\Qa\Downloads>tasklist /FI "PID eq 9592"

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
StepwellS.exe                 9592 Console                    1     15,500 K

Uncompatible DLL loaded on Windows 64-bit

Windows monitor tries to load DLL depending on the system architecture. But I have Java 32-bit installed on Windows 64-bit. So I get next error: Can't load AMD 64-bit .dll on a IA 32-bit platform.

LinuxProcessInfoParser.parse not handling spaces in proc name

The parse method throws NumberFormatExceptions if the process name in the /proc//stat file has spaces (for example the "MpxTestDaemon " (with 2 spaces at the end) process on EMC/StorNext metadata controllers).

Recommend changing the parse method to:

    public ProcessInfo parse() {
        int openParen = stat.indexOf("(");
        int closeParen = stat.lastIndexOf(")");  

        //Start splitting after close of proc name
        String[] statElements = stat.substring(closeParen + 2).split(" "); 
        String pidStr = stat.substring(0,openParen - 1);

        return new ProcessInfo(Integer.parseInt(pidStr),
                Integer.parseInt(statElements[1]),
                trim(cmdline), getFirstMatch(STATUS_NAME_MATCHER, status),
                (String) uids.get(getFirstMatch(STATUS_UID_MATCHER, status)),
                Long.parseLong(statElements[11]) * (1000 / userHz),
                Long.parseLong(statElements[12]) * (1000 / userHz),
                Long.parseLong(getFirstMatch(STATUS_VM_RSS_MATCHER, status)) * 1024,
                Long.parseLong(getFirstMatch(STATUS_VM_SIZE_MATCHER, status)) * 1024);
    }

License confusion

The docs say "JavaSysMon uses the NetBSD (2-line) license." but the source code includes a license file with copyright attributed to Thoughtworks. Could you please clarify? And possibly could you change the build to include a LICENSE and NOTICE file in the jar?

No match found on RHEL 6.6

On a Red Hat Enterprise Linux 6.6 instance on EC2 (official AMI) there is a "No match found" error on line 61 of LinuxMonitor:

String totalMemory = this.fileUtils.runRegexOnFile(TOTAL_MEMORY_PATTERN, "/proc/meminfo");

Example:

# wget http://continuousdelivery.com/downloads/javasysmon/javasysmon-0.3.5.jar

# java -jar javasysmon-0.3.5.jar 
Exception in thread "main" java.lang.IllegalStateException: No match found
    at java.util.regex.Matcher.group(Matcher.java:485)
    at com.jezhumble.javasysmon.FileUtils.runRegexOnFile(FileUtils.java:102)
    at com.jezhumble.javasysmon.LinuxMonitor.osName(LinuxMonitor.java:61)
    at com.jezhumble.javasysmon.JavaSysMon.main(JavaSysMon.java:86)

# cat /proc/meminfo
MemTotal:       15297732 kB
MemFree:          296828 kB
Buffers:          383488 kB
Cached:         12165856 kB
SwapCached:            0 kB
Active:          2534768 kB
Inactive:       10721032 kB
Active(anon):     702588 kB
Inactive(anon):      396 kB
Active(file):    1832180 kB
Inactive(file): 10720636 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                40 kB
Writeback:             0 kB
AnonPages:        702436 kB
Mapped:            56456 kB
Shmem:               548 kB
Slab:            1608436 kB
SReclaimable:    1451696 kB
SUnreclaim:       156740 kB
KernelStack:        8144 kB
PageTables:        11024 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     7648864 kB
Committed_AS:    9523248 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       50292 kB
VmallocChunk:   34359628404 kB
HardwareCorrupted:     0 kB
AnonHugePages:    434176 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:        6144 kB
DirectMap2M:    15722496 kB

# cat /etc/lsb-release
LSB_VERSION=base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch

# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.6 (Santiago)

# uname -a
Linux rh-fernando 2.6.32-504.8.1.el6.x86_64 #1 SMP Fri Dec 19 12:09:25 EST 2014 x86_64 x86_64 x86_64 GNU/Linux

breaks on java 1.4.2

looks like the code is using StringBuilder, which was introduced in 1.5:

$  /opt/WebSphere5/AppServer/java/bin/java SysMonTest
Exception in thread "main" java.lang.NoClassDefFoundError: java/lang/StringBuilder
        at com.jezhumble.javasysmon.FileUtils.slurpFromInputStream(FileUtils.java:69)
        at com.jezhumble.javasysmon.FileUtils.slurp(FileUtils.java:40)
        at com.jezhumble.javasysmon.FileUtils.runRegexOnFile(FileUtils.java:91)
        at com.jezhumble.javasysmon.LinuxMonitor.currentPid(LinuxMonitor.java:109)
        at com.jezhumble.javasysmon.JavaSysMon.currentPid(JavaSysMon.java:166)
        at SysMonTest.main(SysMonTest.java:7)

UnixPasswdParser dies on empty fields in passwd file

I downloaded the JavaSysMon library a few days ago. It’s great and seems to be just what I need. However, today I noticed a bug in the parse-method of class UnixPasswdParser.
There is the line “+::::::” in my /etc/passwd file (which is totally normal in Linux) which results in an ArrayIndexOutOfBoundsException when you try to access fields[2].
Maybe this can be fixed in the next release.

Markus Ewert

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.