经常遇到有关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应用无法启动。
- Xmx设置太小
如果Xmx设置太小,而Java应用启动一旦需要较多的内存,那一定就会抛出“OutOfMemory”的错误。
- 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.人为的疏忽
还有一些人为的疏忽,例如配置内容写错,配置文件损害,库文件丢失等等都能引起启动的问题,自己应用中多注意一下.应该还能找出很多不同的情况来.。