eclispe---两个虚拟机和多个classloader的故事

翻译 2006年05月16日 20:22:00

当你开发eclipse插件或rcp应用的时候,经常可能遇到ClassNotFoundException或java命令行问题或系统参数问题,例如java.endorsed.dirs.

    这种问题多出现在开发者不了解eclipse的运行机制。eclipse运行中存在两个进程,每个包都有自己的classloader.一旦你理解了这种机制是如何协同工作,解决问题相对简单多了。

 eclispe的启动进程

为什么eclispe需要启动两个进程?最简单的答案是eclipse应用软件需要几套系统参数才能正常运行。这包括诸如osgi.configuration.areaosgi.instance.area.之类的参数。在eclipse的启动过程中,这种需求是必要的。因为eclipse需要知道,它需要知道它在哪个位置存放临时数据和持久化数据。这种数据不能直接存放在你的某个项目下(例如你的配置选项和跟踪文件修改的历史记录)

 很多其他工具使用带有定制classpath脚本(或windows下的批处理)来启动一个应用(application);不仅是一些IDE,许多服务器端(server-side)的应用(例如Maven,Ant,cruiseConstorl......)都是如此。大部分时间,这些脚本使用特定环境下的例程增加需要的Jar库到classpath.总得来说,这种途径工作起来很正常。但是有些操作系统的表达方式比较特别,除非你对它的脚本编程比较熟悉,否则,工作起来比较困难。同时也意味着,你不得不经常测试你的脚本语句,来达到你的需求。当然你的脚本在大部分的unix system上能够工作正常。

为了解决这种类型的以及其他有关的问题。eclipse不使用脚本变量也启起它自身。它使用平台依赖的可执行程序,分析命令行参数(例如-vmargs),并把这些参数传递给osgi平台。重要的是,它为一些未在命令行提供的参数提供默认参数。它把osgi平台运行在一个新的进程中(OSGI VM),并把启动过程的其余部分进行处理完成。

 你许也很奇怪,它已经启了一个新的进程了,为什么不在这个java VM中把启动需要处理的其它部分在这个VM中继续处理?有两个原因:1、osgi平台可以调用system.exit,而不会把启动它的进程中止。2、这允许osgi用另一套完全不同的系统参数,或不同版本的VM,第一个进程可以运行在许多版本的VM上,但它可以保证你的平台运行在一个特定的版本上。例如,可以使用一个你发布的时候放在jre目录下一的特定java.

启动进程可以读取配置参数文件,例如eclipse.ini文件,这是一个以换行符分隔的配置文件,其中的参数被输入到平台VM中,-vmflag用来传递一系列参数作为VM参数,而不是普通参数.

也就是说,当startup.jar启动eclipse时,参数和选项将被实际的eclipse实例忽略。你可能认为

eclipse -Xmx1024m 

将给你一个非常大的内存,事实上,你的参数被eclipse 的laucher(startup.jar)给忽略掉了。native laucher(eclipse.exe)直接处理一些参数,其余的参数,被传递给真正做实际初始化工作的org.eclipse.core.launcher.Main native launcher处理的参数为

-vmargs
跟随其后的参数直接传递给平台runtime.的java命令行中,这个参数必须是最后一个参数,因为它后面的所有参数都将传递给下一个VM,请注意你的参数一定要格式良好,否则会报"Program/Eclipse cannot be located"这类错误,这大概是因为参数中有类似C:/Program Files/Eclipse这种参数吧。 in them. 这些参数可以从 eclipse.vmargs 系统属性中取得,但VM启动后,就不能修改了
.未完待续

相关文章推荐

深入Java虚拟机_ClassLoader

  • 2017-08-22 16:16
  • 3.16MB
  • 下载

java虚拟机ClassLoader

  • 2013-06-26 00:56
  • 3.16MB
  • 下载

Java虚拟机(六):类加载器ClassLoader

“通过一个类的全限定名来获取描述此类的二进制流”这个动作放到虚拟机外部去实现,以便让应用程序决定如何去获取所需要的类。这个动作模块就是类加载器。而程序在启动的时候,并不会一次性加载程序所要用的所有cl...

Java虚拟机_ClassLoader详解

  • 2013-09-28 23:19
  • 3.16MB
  • 下载

java虚拟机类加载过程内存情况底层源码分析及ClassLoader讲解

一、虚拟机的类加载机制 二、虚拟机加载的过程 三、加载之后在内存中 类初始化详解 类加载器 附加:父类委托机制

深入Java虚拟机_ClassLoader

  • 2011-01-16 17:34
  • 2.87MB
  • 下载

虚拟机类加载机制(ClassLoader)

java中虚拟机类加载机制 (ClassLoader)1、虚拟机类加载机制(1)ClassNotFoundExcetpion   Java.lang.ClassNotFoundExcetpion对于...

Java程序员从笨鸟到菜鸟之(九十八)深入java虚拟机(七)深入源码看java类加载器ClassLoader

欢迎阅读本专题的其他博客:                      深入java虚拟机(一)——java虚拟机底层结构详解     ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)