經常遇到有關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.人為的疏忽
還有一些人為的疏忽,例如配置內容寫錯,配置文件損害,庫文件丟失等等都能引起啟動的問題,自己應用中多注意一下.應該還能找出很多不同的情況來.。