有時(shí)候?yàn)槭裁磈ava程序起不來的可能原因

          經(jīng)常遇到有關(guān)Java應(yīng)用啟動的問題,例如,剛才還好好的Java應(yīng)用,現(xiàn)在卻無法啟動了?在linux上能跑的Java應(yīng)用,Windows上卻跑不動了?這是為什么呢?下面給出一些可能的解決方案.

          1.環(huán)境和版本不對

          Java程序的運(yùn)行有時(shí)候?qū)Π姹竞铜h(huán)境的設(shè)置都是要求的,很多Java應(yīng)用對環(huán)境的設(shè)置有特殊的要求(例如JDK的版本、classpath環(huán)境變量、JAVA_HOME環(huán)境 變量等等)。因此環(huán)境變量的改變,JDK版本的改變都會引起Java程序的啟動問題。因此在Java應(yīng)用發(fā)生問題的時(shí)候,先要檢查當(dāng)前的環(huán)境變量是否發(fā)生 了改變。這些改變是多方面原因造成的,很有可能是安裝了其他的軟件。例如在安裝了Oracle數(shù)據(jù)庫的時(shí)候,Oracle安裝程序會自動安裝一個JDK版 本(通常這個版本比較低),并且Oracle還將一些環(huán)境變量指向這個JDK,這會給以前的Java應(yīng)用帶來一定的麻煩(我就遇到了幾次)。

          2.啟動參數(shù)不正確


          Java是跨平臺的語言,但是啟動參數(shù)不是跨平臺的。有很多啟動參數(shù)是某些操作系統(tǒng)特有的參數(shù)。就算是跨平臺的啟動參數(shù),在不同的平臺上有著不同的 限制。對于一般的Java程序員,用得比較多的參數(shù)就是對Java的內(nèi)存heap的大小的控制,也就是(Xmx,Xms)的設(shè)置。 這些設(shè)置也能夠造成 Java應(yīng)用無法啟動。

          1. Xmx設(shè)置太小
            如果Xmx設(shè)置太小,而Java應(yīng)用啟動一旦需要較多的內(nèi)存,那一定就會拋出“OutOfMemory”的錯誤。
          2. Xmx設(shè)置太大
            難道給應(yīng)用程序設(shè)置更多的內(nèi)存也不行嗎?事實(shí)上有很多Java程序員已經(jīng)遇到這個問題了。32位的Java虛擬機(jī)所占用的進(jìn)程空間最多只有4G。因此Xmx的設(shè)置不會超過這個值的,如果要超過,需要64位Java虛擬機(jī)。就是這4個G的空間,也不是全部能被 Java獲得。在Windows下,Windows內(nèi)核需要占用2G的進(jìn)程空間,留給Java的空間只有一半,加上Java虛擬機(jī)其他的內(nèi)存開銷(包括線 程棧開銷,本地代碼開銷),在Windows上能給Xmx分配的空間只有1.5G左右。在Solaris上和其他Unix上要好些,有3.7G可以使用。 因此,如果發(fā)現(xiàn)啟動錯誤“ Error occurred during initialization of VM Could not reserve enough space for object heap ”或者“cannot allocate enough space for thread”,那么將Xmx值設(shè)得再小點(diǎn)。

          3.網(wǎng)絡(luò)端口被占用

          有時(shí)候,當(dāng)eclips突然要關(guān)閉(出現(xiàn)問題非正常關(guān)閉),迅速重新啟動這個應(yīng)用會失敗,系統(tǒng)報(bào)出“java.net.BindException: Address already in use: ” 的錯誤。這是因?yàn)榇薐ava應(yīng)用需要在某個Socket端口進(jìn)行監(jiān)聽,而這個端口當(dāng)前不可用。是什么原因造成了當(dāng)前端口不可用呢?有兩種可能:一是別的應(yīng) 用程序先搶用了這個端口。要想知道到底是哪個應(yīng)用用了某個端口,只需要一些簡單的腳本即可。例如,在WINDOWS下,使用下面的命令就可是知道,8080端口是否占用。netstat.
          還有就是在關(guān)閉IDE后看進(jìn)程里如果有JAVA.EXE的話.一般就是被它自己占用了.

          另外還有一個原因就是這個Socket正在“time_wait”的狀態(tài)。通常一個應(yīng)用在關(guān)閉以后,Socket不會立刻釋放(在TCP/IP的協(xié) 議中規(guī)定),在Time_WAIT狀態(tài)下需要保持4分鐘(不同的操作系統(tǒng)時(shí)間不一樣)。要解決這個問題,需要在Java程序中加上 “serverSocket.setReuseAddress(true);”就能快速的重用這個Socket。

          4.人為的疏忽

          還有一些人為的疏忽,例如配置內(nèi)容寫錯,配置文件損害,庫文件丟失等等都能引起啟動的問題,自己應(yīng)用中多注意一下.應(yīng)該還能找出很多不同的情況來.。

          posted on 2007-05-16 10:06 shgavin 閱讀(985) 評論(0)  編輯  收藏 所屬分類: java


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導(dǎo)航

          留言簿

          文章分類

          文章檔案

          收藏夾

          搜索

          最新評論

          主站蜘蛛池模板: 田阳县| 祁东县| 漾濞| 文成县| 久治县| 祁连县| 石狮市| 淄博市| 百色市| 彩票| 五原县| 临沂市| 晋江市| 莆田市| 涡阳县| 方山县| 辽中县| 武邑县| 宜君县| 什邡市| 太湖县| 连南| 汉中市| 宣城市| 龙里县| 姜堰市| 沙田区| 景德镇市| 阳东县| 闽清县| 丽江市| 三河市| 南乐县| 子洲县| 沙河市| 闽清县| 永嘉县| 石台县| 福建省| 邵武市| 建湖县|