经常遇到有关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应用无法启动。
有时候,当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。
还有很多认为的疏忽,例如配置文件损害,库文件丢失等等都能引起启动的问题,这里就不多介绍了。