有时候为什么java程序起不来的可能原因

经常遇到有关Java应用启动的问题,例如,刚才还好好的Java应用,现在却无法启动了?在linux上能跑的Java应用,Windows上却跑不动了?这是为什么呢?下面给出一些可能的解决方案.

1.环境和版本不对

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

2.启动参数不正确


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值设得再小点。

3.网络端口被占用

有时候,当eclips突然要关闭(出现问题非正常关闭),迅速重新启动这个应用会失败,系统报出“java.net.BindException: Address already in use: ” 的错误。这是因为此Java应用需要在某个Socket端口进行监听,而这个端口当前不可用。是什么原因造成了当前端口不可用呢?有两种可能:一是别的应 用程序先抢用了这个端口。要想知道到底是哪个应用用了某个端口,只需要一些简单的脚本即可。例如,在WINDOWS下,使用下面的命令就可是知道,8080端口是否占用。netstat.
还有就是在关闭IDE后看进程里如果有JAVA.EXE的话.一般就是被它自己占用了.

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

4.人为的疏忽

还有一些人为的疏忽,例如配置内容写错,配置文件损害,库文件丢失等等都能引起启动的问题,自己应用中多注意一下.应该还能找出很多不同的情况来.。

posted on 2007-05-16 10:06 shgavin 阅读(953) 评论(0)  编辑  收藏 所属分类: java


只有注册用户登录后才能发表评论。


网站导航:
 
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

留言簿

文章分类

文章档案

收藏夹

搜索

最新评论