- 浏览: 3059346 次
- 性别:
- 来自: 海外
-
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
Java标准库里常见的公有API确实是没有获取当前进程的ID的方法,有时候挺郁闷的,就是需要自己的PID。
于是有各种workaround,其中有很靠谱的通过JNI调用外部的C/C++扩展,然后调用操作系统提供的相应API去获取PID;也有些不怎么靠谱的hack。这里要介绍的就是后者之一,只在Sun JDK或兼容的JDK上有效的方法。
代码例子如下:
使用Sun JDK里RuntimeMXBean.getName()方法的实现,可以很轻松的拿到自身的PID。
运行这个程序可以看到类似以下的输出:
这个时候再跑一个jps来看看当前都有哪些Java进程的话,可以看到:
嗯……这PID没错。
这PID是哪儿来的呢?先看RuntimeMXBean实例的来源,java.lang.management.ManagementFactory:
可以看到它依赖了sun.management.ManagementFactory,于是看看对应的实现:
这里可以发现实现RuntimeMXBean接口的是sun.management.RuntimeImpl。它的实现是:
OK,看到getName()返回的是VMManagement.getVmId()的返回值,再跟过去看:
OK,这里可以看到getVmId()返回过来的字符串确实是"pid@hostname"形式的。再追下去,看看native一侧是如何获取PID的话:
j2se/src/share/native/sun/management/VMManagementImpl.c
于是继续跟,
hotspot/src/share/vm/services/management.cpp
接下来os::current_process_id()的实现就是每个操作系统不同的了。
在Linux上是:
hotspot/src/os/linux/vm/os_linux.cpp
在Windows上是:
=================================================================
好吧其实我是在HotSpot的源码里搜pid然后慢慢找出JMM代码里有调用过os::current_process_id(),然后才一步步向上找到对应的Java API。刚才问毕玄老大有没有见过在Java代码里获取PID的办法,才得知原来以前有人总结过几种办法,其中第一个就是本文提到的这个。嘛,需求是一直有的,这种功能自然是早该有人捣腾过了。
请先看这帖了解下OpenJDK与Oracle/Sun JDK之间的关系:http://rednaxelafx.iteye.com/blog/1549577
然后看这帖了解如何查看OpenJDK里库的C代码怎么找到:http://hllvm.group.iteye.com/group/topic/35385#post-236056
这个我也不知道了…至少从原理和JDK公有API的过往习惯看,不像是有跨平台的解决方案
诶·~我现在被逼的用vbe脚本+win命令去解决了~~完全不考虑跨平台什么的了~~囧
所有外部的启动的程序,调用时拷贝唯一命名的"cmd-标识.exe",然后根据这个子进程的名字获取进程id,保存映射关系;
退出时用taskkill /pid pid /t /f 强制删除所有子进程。囧啊~~~~
这个我也不知道了…至少从原理和JDK公有API的过往习惯看,不像是有跨平台的解决方案
唔。那您是想知道了子进程ID之后从外部杀掉它么。那样的话进程ID也从外部获取好了,可以用ProcessExplorer来看进程树,只要知道父进程的ID就可以找到它在进程树的什么地方,然后就知道子进程有哪些了。
谢谢FX大推荐的工具·~让我明白我程序到底出了什么问题·~我的java主程序A启动了一个bat文件,bat中又启动了一个java程序B,根据进程树发现,java程序A的子进程是cmd,cmd的子进程是java程序B,我销毁子进程时可以正常销毁cmd进程,销毁后,java程序B的父进程就委托给了系统空闲进程,因此从进程管理中发现Java程序B一直无法被销毁。
那么我又有疑问请教您咯~java有办法销毁其子进程树么?
唔。那您是想知道了子进程ID之后从外部杀掉它么。那样的话进程ID也从外部获取好了,可以用ProcessExplorer来看进程树,只要知道父进程的ID就可以找到它在进程树的什么地方,然后就知道子进程有哪些了。
出现的问题就是 destroy不掉啊~~~我获取的process的引用,在关闭io的处理线程后,强制destroy后·~主程序能够退出,但是从进程管理器看到该子进程并未结束。
上面描述有些偏差,在myeclipse里面运行时会发现 主程序能够正常执行到退出,但是子进程未结束,myeclipse的控制台也没有退出,也无法强制结束,当我手动关闭子进程后,myeclipse的控制台自动退出。——基于以上现象,不知道具体原因是什么,所以我只好想辙去干掉子进程咯~~
java.lang.Process上有destroy()方法,如果你在主进程开了子进程的话,最初是可以获取到这个Process对象的,一直持有它的引用就好了,没必要知道它的ID是多少。
出现的问题就是 destroy不掉啊~~~我获取的process的引用,在关闭io的处理线程后,强制destroy后·~主程序能够退出,但是从进程管理器看到该子进程并未结束。
java.lang.Process上有destroy()方法,如果你在主进程开了子进程的话,最初是可以获取到这个Process对象的,一直持有它的引用就好了,没必要知道它的ID是多少。
请问这段代码是在什么版本的JDK的哪里找出来的?需要更详细的信息才能帮忙~
公有API没提供,能怎么办 T T
于是有各种workaround,其中有很靠谱的通过JNI调用外部的C/C++扩展,然后调用操作系统提供的相应API去获取PID;也有些不怎么靠谱的hack。这里要介绍的就是后者之一,只在Sun JDK或兼容的JDK上有效的方法。
代码例子如下:
import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; public class ShowOwnPID { public static void main(String[] args) throws Exception { int pid = getPid(); System.out.println("pid: " + pid); System.in.read(); // block the program so that we can do some probing on it } private static int getPid() { RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean(); String name = runtime.getName(); // format: "pid@hostname" try { return Integer.parseInt(name.substring(0, name.indexOf('@'))); } catch (Exception e) { return -1; } } }
使用Sun JDK里RuntimeMXBean.getName()方法的实现,可以很轻松的拿到自身的PID。
运行这个程序可以看到类似以下的输出:
D:\experiment>java ShowOwnPID pid: 11704
这个时候再跑一个jps来看看当前都有哪些Java进程的话,可以看到:
D:\experiment>jps 7888 Jps 11704 ShowOwnPID
嗯……这PID没错。
这PID是哪儿来的呢?先看RuntimeMXBean实例的来源,java.lang.management.ManagementFactory:
package java.lang.management; // ... public class ManagementFactory { // ... /** * Returns the managed bean for the runtime system of * the Java virtual machine. * * @return a {@link RuntimeMXBean} object for the Java virtual machine. */ public static RuntimeMXBean getRuntimeMXBean() { return sun.management.ManagementFactory.getRuntimeMXBean(); } // ... }
可以看到它依赖了sun.management.ManagementFactory,于是看看对应的实现:
package sun.management; import java.lang.management.*; // ... import static java.lang.management.ManagementFactory.*; public class ManagementFactory { private ManagementFactory() {}; private static VMManagement jvm; private static RuntimeImpl runtimeMBean = null; public static synchronized RuntimeMXBean getRuntimeMXBean() { if (runtimeMBean == null) { runtimeMBean = new RuntimeImpl(jvm); } return runtimeMBean; } static { AccessController.doPrivileged(new LoadLibraryAction("management")); jvm = new VMManagementImpl(); } // ... }
这里可以发现实现RuntimeMXBean接口的是sun.management.RuntimeImpl。它的实现是:
package sun.management; import java.lang.management.RuntimeMXBean; // ... /** * Implementation class for the runtime subsystem. * Standard and committed hotspot-specific metrics if any. * * ManagementFactory.getRuntimeMXBean() returns an instance * of this class. */ class RuntimeImpl implements RuntimeMXBean { private final VMManagement jvm; private final long vmStartupTime; /** * Constructor of RuntimeImpl class. */ RuntimeImpl(VMManagement vm) { this.jvm = vm; this.vmStartupTime = jvm.getStartupTime(); } public String getName() { return jvm.getVmId(); } // ... }
OK,看到getName()返回的是VMManagement.getVmId()的返回值,再跟过去看:
package sun.management; import java.net.InetAddress; import java.net.UnknownHostException; // ... class VMManagementImpl implements VMManagement { // ... public String getVmId() { int pid = getProcessId(); String hostname = "localhost"; try { hostname = InetAddress.getLocalHost().getHostName(); } catch (UnknownHostException e) { // ignore } return pid + "@" + hostname; } private native int getProcessId(); // ... }
OK,这里可以看到getVmId()返回过来的字符串确实是"pid@hostname"形式的。再追下去,看看native一侧是如何获取PID的话:
j2se/src/share/native/sun/management/VMManagementImpl.c
JNIEXPORT jint JNICALL Java_sun_management_VMManagementImpl_getProcessId (JNIEnv *env, jobject dummy) { jlong pid = jmm_interface->GetLongAttribute(env, NULL, JMM_OS_PROCESS_ID); return (jint) pid; }
于是继续跟,
hotspot/src/share/vm/services/management.cpp
static jlong get_long_attribute(jmmLongAttribute att) { switch (att) { // ... case JMM_OS_PROCESS_ID: return os::current_process_id(); // ... default: return -1; } } JVM_ENTRY(jlong, jmm_GetLongAttribute(JNIEnv *env, jobject obj, jmmLongAttribute att)) if (obj == NULL) { return get_long_attribute(att); } else { // ... } return -1; JVM_END
接下来os::current_process_id()的实现就是每个操作系统不同的了。
在Linux上是:
hotspot/src/os/linux/vm/os_linux.cpp
static pid_t _initial_pid = 0; int os::current_process_id() { // Under the old linux thread library, linux gives each thread // its own process id. Because of this each thread will return // a different pid if this method were to return the result // of getpid(2). Linux provides no api that returns the pid // of the launcher thread for the vm. This implementation // returns a unique pid, the pid of the launcher thread // that starts the vm 'process'. // Under the NPTL, getpid() returns the same pid as the // launcher thread rather than a unique pid per thread. // Use gettid() if you want the old pre NPTL behaviour. // if you are looking for the result of a call to getpid() that // returns a unique pid for the calling thread, then look at the // OSThread::thread_id() method in osThread_linux.hpp file return (int)(_initial_pid ? _initial_pid : getpid()); } // this is called _before_ the most of global arguments have been parsed void os::init(void) { // With LinuxThreads the JavaMain thread pid (primordial thread) // is different than the pid of the java launcher thread. // So, on Linux, the launcher thread pid is passed to the VM // via the sun.java.launcher.pid property. // Use this property instead of getpid() if it was correctly passed. // See bug 6351349. pid_t java_launcher_pid = (pid_t) Arguments::sun_java_launcher_pid(); _initial_pid = (java_launcher_pid > 0) ? java_launcher_pid : getpid(); // ... }
在Windows上是:
static int _initial_pid = 0; int os::current_process_id() { return (_initial_pid ? _initial_pid : _getpid()); } // this is called _before_ the global arguments have been parsed void os::init(void) { _initial_pid = _getpid(); // ... }
=================================================================
好吧其实我是在HotSpot的源码里搜pid然后慢慢找出JMM代码里有调用过os::current_process_id(),然后才一步步向上找到对应的Java API。刚才问毕玄老大有没有见过在Java代码里获取PID的办法,才得知原来以前有人总结过几种办法,其中第一个就是本文提到的这个。嘛,需求是一直有的,这种功能自然是早该有人捣腾过了。
评论
16 楼
RednaxelaFX
2013-04-04
MyTiny 写道
想问下您是怎么看到c的源码呢?俺的邮箱是lvzhitao123@gmail.com,能否给些关于读java源码的建议?
请先看这帖了解下OpenJDK与Oracle/Sun JDK之间的关系:http://rednaxelafx.iteye.com/blog/1549577
然后看这帖了解如何查看OpenJDK里库的C代码怎么找到:http://hllvm.group.iteye.com/group/topic/35385#post-236056
15 楼
MyTiny
2013-04-03
想问下您是怎么看到c的源码呢?俺的邮箱是lvzhitao123@gmail.com,能否给些关于读java源码的建议?
14 楼
shangyue1110
2013-01-15
RednaxelaFX 写道
shangyue1110 写道
那么我又有疑问请教您咯~java有办法销毁其子进程树么?
这个我也不知道了…至少从原理和JDK公有API的过往习惯看,不像是有跨平台的解决方案

诶·~我现在被逼的用vbe脚本+win命令去解决了~~完全不考虑跨平台什么的了~~囧
所有外部的启动的程序,调用时拷贝唯一命名的"cmd-标识.exe",然后根据这个子进程的名字获取进程id,保存映射关系;
退出时用taskkill /pid pid /t /f 强制删除所有子进程。囧啊~~~~
13 楼
RednaxelaFX
2013-01-15
shangyue1110 写道
那么我又有疑问请教您咯~java有办法销毁其子进程树么?
这个我也不知道了…至少从原理和JDK公有API的过往习惯看,不像是有跨平台的解决方案

12 楼
shangyue1110
2013-01-15
RednaxelaFX 写道
shangyue1110 写道
所以我只好想辙去干掉子进程咯~~
唔。那您是想知道了子进程ID之后从外部杀掉它么。那样的话进程ID也从外部获取好了,可以用ProcessExplorer来看进程树,只要知道父进程的ID就可以找到它在进程树的什么地方,然后就知道子进程有哪些了。
谢谢FX大推荐的工具·~让我明白我程序到底出了什么问题·~我的java主程序A启动了一个bat文件,bat中又启动了一个java程序B,根据进程树发现,java程序A的子进程是cmd,cmd的子进程是java程序B,我销毁子进程时可以正常销毁cmd进程,销毁后,java程序B的父进程就委托给了系统空闲进程,因此从进程管理中发现Java程序B一直无法被销毁。
那么我又有疑问请教您咯~java有办法销毁其子进程树么?
11 楼
RednaxelaFX
2013-01-15
shangyue1110 写道
所以我只好想辙去干掉子进程咯~~
唔。那您是想知道了子进程ID之后从外部杀掉它么。那样的话进程ID也从外部获取好了,可以用ProcessExplorer来看进程树,只要知道父进程的ID就可以找到它在进程树的什么地方,然后就知道子进程有哪些了。
10 楼
shangyue1110
2013-01-15
shangyue1110 写道
出现的问题就是 destroy不掉啊~~~我获取的process的引用,在关闭io的处理线程后,强制destroy后·~主程序能够退出,但是从进程管理器看到该子进程并未结束。
上面描述有些偏差,在myeclipse里面运行时会发现 主程序能够正常执行到退出,但是子进程未结束,myeclipse的控制台也没有退出,也无法强制结束,当我手动关闭子进程后,myeclipse的控制台自动退出。——基于以上现象,不知道具体原因是什么,所以我只好想辙去干掉子进程咯~~
9 楼
shangyue1110
2013-01-15
RednaxelaFX 写道
shangyue1110 写道
能否在主程序中获取开启的子进程的进程id呢?
java.lang.Process上有destroy()方法,如果你在主进程开了子进程的话,最初是可以获取到这个Process对象的,一直持有它的引用就好了,没必要知道它的ID是多少。
出现的问题就是 destroy不掉啊~~~我获取的process的引用,在关闭io的处理线程后,强制destroy后·~主程序能够退出,但是从进程管理器看到该子进程并未结束。
8 楼
RednaxelaFX
2013-01-15
shangyue1110 写道
能否在主程序中获取开启的子进程的进程id呢?
java.lang.Process上有destroy()方法,如果你在主进程开了子进程的话,最初是可以获取到这个Process对象的,一直持有它的引用就好了,没必要知道它的ID是多少。
7 楼
shangyue1110
2013-01-14
最近开发了个通用托盘程序~~碰到有些java开启的子进程无法关闭,各种查资料啊·~都已经崩溃到准备用jni来实现pid的获取和杀进程了·~不过万幸发现了你的帖子,随之而来的有些疑问,在此向您请教一二:
我的程序通过commons-exec启动外部进程,但是发现个问题,我的这个子程序是一直监听某目录,自动处理文件的,因此开启后不会主动退出,因此使用commons-exec启动后,通过其watchdog销毁进程,会出现进程卡死在process的io流的关闭上,如果我不管子进程直接退出主进程,子程序仍然无法关闭,仍可能造成资源死锁,想请教您,能否在主程序中获取开启的子进程的进程id呢?(除了使用进程名过滤的方式,因为我好多jar是用bat启动的,因此都是java.exe)
我的程序通过commons-exec启动外部进程,但是发现个问题,我的这个子程序是一直监听某目录,自动处理文件的,因此开启后不会主动退出,因此使用commons-exec启动后,通过其watchdog销毁进程,会出现进程卡死在process的io流的关闭上,如果我不管子进程直接退出主进程,子程序仍然无法关闭,仍可能造成资源死锁,想请教您,能否在主程序中获取开启的子进程的进程id呢?(除了使用进程名过滤的方式,因为我好多jar是用bat启动的,因此都是java.exe)
6 楼
religiose
2012-03-28
刚刚也遇到这个东东。。。嘿嘿。

5 楼
RednaxelaFX
2010-12-04
googya 写道
怎么找不到呢
在sun.management包中只有:
真是奇怪了
在sun.management包中只有:
public static synchronized RuntimeMXBean getRuntimeMXBean() { //compiled code throw new RuntimeException("Compiled Code"); }
真是奇怪了
请问这段代码是在什么版本的JDK的哪里找出来的?需要更详细的信息才能帮忙~
4 楼
googya
2010-12-04
怎么找不到呢
在sun.management包中只有:
真是奇怪了
在sun.management包中只有:
public static synchronized RuntimeMXBean getRuntimeMXBean() { //compiled code throw new RuntimeException("Compiled Code"); }
真是奇怪了
3 楼
lwwin
2010-08-03
水水其实只知道微软藏了很多很实用的API~
自己以前也被挖过一回,写的某个日志打印API,……
自己以前也被挖过一回,写的某个日志打印API,……
2 楼
RednaxelaFX
2010-07-23
lwwin 写道
这方法难不成也是挖出隐藏的API吗^-^
公有API没提供,能怎么办 T T
1 楼
lwwin
2010-07-23
这方法难不成也是挖出隐藏的API吗^-^
不愧是FX大~~~
不愧是FX大~~~
发表评论
-
The Prehistory of Java, HotSpot and Train
2014-06-02 08:18 0http://cs.gmu.edu/cne/itcore/vi ... -
MSJVM and Sun 1.0.x/1.1.x
2014-05-20 18:50 0当年的survey paper: http://www.sym ... -
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
class data sharing by Apple
2014-03-28 05:17 0class data sharing is implement ... -
Java 8与静态工具类
2014-03-19 08:43 16331以前要在Java里实现所谓“静态工具类”(static uti ... -
Java 8的default method与method resolution
2014-03-19 02:23 10489先看看下面这个代码例子, interface IFoo { ... -
HotSpot Server VM与Server Class Machine
2014-02-18 13:21 0HotSpot VM历来有Client VM与Server V ... -
Java 8的lambda表达式在OpenJDK8中的实现
2014-02-04 12:08 0三月份JDK8就要发布首发了,现在JDK8 release c ... -
GC stack map与deopt stack map的异同
2014-01-08 09:56 0两者之间不并存在包含关系。它们有交集,但也各自有特别的地方。 ... -
HotSpot Server Compiler与data-flow analysis
2014-01-07 17:41 0http://en.wikipedia.org/wiki/Da ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22431(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
对C语义的for循环的基本代码生成模式
2013-10-19 23:12 21901之前有同学在做龙书(第二版)题目,做到8.4的练习,跟我对答案 ... -
Java的instanceof是如何实现的
2013-09-22 16:57 0Java语言规范,Java SE 7版 http://docs ... -
oop、klass、handle的关系
2013-07-30 17:34 0oopDesc及其子类的实例 oop : oopDesc* ... -
Nashorn各种笔记
2013-07-15 17:03 0http://bits.netbeans.org/netbea ... -
《深入理解Java虚拟机(第二版)》书评
2013-07-08 19:19 0值得推荐的中文Java虚拟机入门书 感谢作者赠与的样书,以下 ... -
豆列:从表到里学习JVM实现
2013-06-13 14:13 48442刚写了个学习JVM用的豆列跟大家分享。 豆列地址:http: ...
相关推荐
最新版 32位 windows sun jdk7 开发必备
### Java通过Sigar库获取进程相关信息 在Java开发过程中,有时候我们需要监控系统资源或特定进程的状态,例如CPU使用率、内存占用情况等。这在服务器性能监控、问题排查等方面尤为重要。本文将详细介绍如何使用...
在JDK 1.8版本中,虽然已经包含了大部分核心类库的源代码,但某些特定的Sun Microsystems(后被Oracle收购)实现的内部类或模块,如JNI(Java Native Interface)和一些性能优化的代码,通常并不公开。这些内部实现...
### 关于Sun Java JDK的知识点 #### 一、Sun Java JDK简介 Sun Java JDK(Java Development Kit)是由Sun Microsystems公司提供的官方Java开发工具包。它包含了编写、编译和调试Java应用程序所需的所有软件和文档...
### 卸载OpenJDK并安装Sun JDK #### 一、卸载OpenJDK 在进行Sun JDK的安装之前,确保系统中没有已存在的JDK版本是非常重要的,尤其是OpenJDK,因为它可能会与新安装的Sun JDK冲突。下面将详细介绍如何在Linux环境...
带sun的jdk 1.8.0_65带sun的jdk 1.8.0_65带sun的jdk 1.8.0_65带sun的jdk 1.8.0_65带sun的jdk 1.8.0_65带sun的jdk 1.8.0_65带sun的jdk 1.8.0_65带sun的jdk 1.8.0_65带sun的jdk 1.8.0_65带sun的jdk 1.8.0_65带sun的jdk...
《深入解析JDK1.7源码:补全sun包下的源码》 在Java开发过程中,理解JDK源码是提升技术深度的关键步骤。JDK1.7版本的源码提供了对Java语言核心库的深入洞察,而sun包下的源码更是其中的重要组成部分,因为它们包含...
JDK的种类:最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM(Java Virtual ...
/jdk文件夹下生成一个src.zip,此文件夹对应rt.jar中的java源码,但细心研究后发现rt.jar中sun包下的文件不存在,也就是说sun包下的java源码并没有打包到src.zip中,可以到http://download.java.net/openjdk/jdk7/该...
功能:获取java进程pid 进程可根据该pid调用exec自杀 注意事项:不能改变PidTool.java所在的包,否则需要重行生成dll。 编译命令中 "-PidTool.dll" 改为 "-FePidTool.dll",我整漏了! 使用方法: 1.javac PidTool...
SAX解析器在两个JDK中同样提供`org.xml.sax.helpers.DefaultHandler`作为基础事件处理器,通过实现回调方法如`startElement()`、`endElement()`来处理XML事件。例如: ```java SAXParserFactory factory = ...
Sun JDK 1.6的内存模型将内存分为几个不同的区域,包括堆(Heap)、方法区(Method Area)、永久代(Permanent Generation)、栈(Stack)以及本地方法栈(Native Method Stack)。其中,堆是最主要的内存区域,用于...
jdk源码(包含sun包)jdk源码(包含sun包)jdk源码(包含sun包)jdk源码(包含sun包)jdk源码(包含sun包)jdk源码(包含sun包)jdk源码(包含sun包)jdk源码(包含sun包)
SUN JDK1.6,也称为Java SE 6,是Java平台标准版的一个重要版本,它包含了编译器、JVM(Java虚拟机)、调试器以及其他开发工具。"免安装版本"意味着这个JDK不需要通过传统的安装程序来设置,而是可以直接解压到指定...
5. 管理PermGen空间:在Sun JDK 1.6中,方法区(Method Area)也被称为 PermGen,需关注-XX:MaxPermSize以避免Class定义过多导致的Full GC。 6. 监控和诊断:使用JVisualVM、jconsole等工具监控JVM内存状态,通过-...
### CentOS卸载OpenJDK并安装Sun JDK:深入解析与操作指南 #### 一、理解OpenJDK与Sun JDK **OpenJDK**是开源Java平台的实现,它基于Sun Microsystems发布的HotSpot虚拟机和Java类库。OpenJDK自Java SE 7开始成为...
在这个压缩包“jdk8u65+openjdk的sun包”中,我们主要关注的是两个版本的Java JDK:JDK 8 Update 65 和 OpenJDK。 **JDK 8 Update 65** JDK 8 Update 65 是Oracle公司发布的Java 8的一个更新版本。这个版本修复了...
《深入解析JDK1.8源码中的"sun"包》 在Java开发领域,对JDK源码的深入理解是提升技术能力的关键步骤。JDK1.8作为广泛使用的版本,其源码包含了丰富的实现细节,特别是"sun"包,它承载了许多核心功能和内部实现。...
在使用intellj IDEA查看源代码时,调试进入到sun.nio.ch.FileChannelImpl 类时,发现需要反编译才能查看源代码,在IDEA中已经导入了jdk8的源码,后排查发现sun的源代码实际上不在jdk源码中,后找到一份sun源码包,...
在JDK中,"sun"开头的源码包是Oracle(原Sun Microsystems)公司提供的核心API,它们包含了Java平台的许多底层实现,这些源码对于深入理解Java的内部机制至关重要。 "sun"前缀的源码主要涉及以下几个关键领域: 1....