文章正文

为什么我的Java程序起不来

来源:    2007-5-15 14:09:13 网友评论 0 条 字体:[ ] ~我要投稿!

经常遇到有关Java应用启动的问题,例如,刚才还好好的Java应用,现在却无法启动了?在Solaris上能跑的Java应用,Windows上却启动不了?下面根据不同的原因,给出一定的解决方案.

一. 版本和环境不对

Java程序的运行有时候对版本和环境是有要求的,很多Java应用对环境的设置有特殊的要求(例如classpath环境变量、JAVA_HOME环境变量等等)。因此环境变量的改变,JDK版本的改变都会引起Java程序的启动问题。因此在Java应用发生问题的时候,先要检查当前的环境变量是否发生了改变。这些改变是多方面原因造成的,很有可能是安装了其他的软件。例如在安装了Oracle数据库的时候,Oracle安装程序会自动安装一个JDK版本(通常这个版本比较低),并且Oracle还将一些环境变量指向这个JDK,这会给以前的Java应用带来一定的麻烦。
 

二. 启动参数不正确

Java是跨平台的语言,但是启动参数不是跨平台的。有很多启动参数是某些操作系统特有的参数。就算是跨平台的启动参数,在不同的平台上有着不同的限制。对于一般的Java程序员,用得比较多的参数就是对Java的内存heap的大小的控制,也就是(Xmx,Xms)的设置。 这些设置也能够造成Java应用无法启动。

  1. Xmx设置太小
    如果Xmx设置太小,而Java应用启动一旦需要较多的内存,那一定就会抛出“OutOfMemory”的错误。
  2. Xmx设置太大
    难道给应用程序设置更多的内存也不行吗?事实上有很多Java程序员已经遇到这个问题了。32位的Java虚拟机所占用的进程空间最多只有4G。因此Xmx的设置不会超过这个值的,如果要超过,需要64位Java虚拟机。就是这4个G的空间,也不是全部能被Java获得。在Windows下,Windows内核需要占用2G的进程空间,留给Java的空间只有一半,加上Java虚拟机其他的内存开销(包括线程栈开销,本地代码开销),在Windows上能给Xmx分配的空间只有1.5G左右。在Solaris上和其他Unix上要好些,有3.7G可以使用。因此,如果发现启动错误“ Error occurred during initialization of VM Could not reserve enough space for object heap ”或者“cannot allocate enough space for thread”,那么将Xmx值设得再小点。

三. 网络端口被占用

 有时候,当Java应用(特别是服务器端的应用)出现问题或被杀掉,迅速重新启动这个应用会失败,系统报出“java.net.BindException: Address already in use: ”的错误。这是因为此Java应用需要在某个Socket端口进行监听,而这个端口当前不可用。是什么原因造成了当前端口不可用呢?有两种可能:一是别的应用程序先抢用了这个端口。要想知道到底是哪个应用用了某个端口,只需要一些简单的脚本即可。例如,在Solaris下,使用下面的脚本就可是知道,哪个进程正在使用8080端口。

for i in `ps -ef -o pid` ; do echo "Now checking the Process $i"; pfiles $i | grep "port: 8080"; done

另外还有一个原因就是这个Socket正在“time_wait”的状态。通常一个应用在关闭以后,Socket不会立刻释放(在TCP/IP的协议中规定),在Time_WAIT状态下需要保持4分钟(不同的操作系统时间不一样)。要解决这个问题,需要在Java程序中加上“serverSocket.setReuseAddress(true);”就能快速的重用这个Socket。

四. 人为的疏忽

还有很多认为的疏忽,例如配置文件损害,库文件丢失等等都能引起启动的问题,这里就不多介绍了。



上一篇:Prototype and jseditor
下一篇:Xerces库中的内存泄漏
用户名:新注册) 密码: 匿名评论 [所有评论]
评论内容:不能超过250字,请自觉遵守互联网相关政策法规。
本栏搜索

  • Google Chinesedocument.com
 网站首页 -  网站地图 -  技术论坛 -  网站投稿 -  广告服务 -  手机游戏
©2007 分享文档 Chinesedocument.com [京ICP备06000384号]