﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-what  which  where -文章分类-java</title><link>http://www.blogjava.net/shgavin/category/22474.html</link><description>www</description><language>zh-cn</language><lastBuildDate>Wed, 16 May 2007 20:27:03 GMT</lastBuildDate><pubDate>Wed, 16 May 2007 20:27:03 GMT</pubDate><ttl>60</ttl><item><title>有时候为什么java程序起不来的可能原因</title><link>http://www.blogjava.net/shgavin/articles/gavin.html</link><dc:creator>shgavin</dc:creator><author>shgavin</author><pubDate>Wed, 16 May 2007 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/shgavin/articles/gavin.html</guid><wfw:comment>http://www.blogjava.net/shgavin/comments/117771.html</wfw:comment><comments>http://www.blogjava.net/shgavin/articles/gavin.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shgavin/comments/commentRss/117771.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shgavin/services/trackbacks/117771.html</trackback:ping><description><![CDATA[经常遇到有关Java应用启动的问题，例如，刚才还好好的Java应用，现在却无法启动了？在linux上能跑的Java应用，Windows上却跑不动了？这是为什么呢?下面给出一些可能的解决方案.<br>
<h2><span>1.环境和版本不对</span></h2>
Java程序的运行有时候对版本和环境的设置都是要求的，很多Java应用对环境的设置有特殊的要求（例如JDK的版本、classpath环境变量、JAVA_HOME环境
变量等等）。因此环境变量的改变，JDK版本的改变都会引起Java程序的启动问题。因此在Java应用发生问题的时候，先要检查当前的环境变量是否发生
了改变。这些改变是多方面原因造成的，很有可能是安装了其他的软件。例如在安装了Oracle数据库的时候，Oracle安装程序会自动安装一个JDK版
本（通常这个版本比较低），并且Oracle还将一些环境变量指向这个JDK，这会给以前的Java应用带来一定的麻烦(我就遇到了几次)。<br>
<h2>2.启动参数不正确</h2>
<span></span><br>
<p>Java是跨平台的语言，但是启动参数不是跨平台的。有很多启动参数是某些操作系统特有的参数。就算是跨平台的启动参数，在不同的平台上有着不同的
限制。对于一般的Java程序员，用得比较多的参数就是对Java的内存heap的大小的控制，也就是（Xmx,Xms）的设置。&nbsp;这些设置也能够造成
Java应用无法启动。</p>
<ol>
    <li>Xmx设置太小<br>如果Xmx设置太小，而Java应用启动一旦需要较多的内存，那一定就会抛出&#8220;OutOfMemory&#8221;的错误。<br>
    </li>
    <li>Xmx设置太大<br>难道给应用程序设置更多的内存也不行吗？事实上有很多Java程序员已经遇到这个问题了。32位的Java虚拟机所占用的进程空间最多只有4G。因此Xmx的设置不会超过这个值的，如果要超过，需要64位Java虚拟机。就是这4个G的空间，也不是全部能被
    Java获得。在Windows下，Windows内核需要占用2G的进程空间，留给Java的空间只有一半，加上Java虚拟机其他的内存开销（包括线
    程栈开销，本地代码开销），在Windows上能给Xmx分配的空间只有1.5G左右。在Solaris上和其他Unix上要好些，有3.7G可以使用。
    因此，如果发现启动错误&#8220;<em> Error occurred during initialization of VM Could not reserve enough space for object heap </em>&#8221;或者&#8220;<em>cannot allocate enough space for thread</em>&#8221;，那么将Xmx值设得再小点。</li>
</ol>
<h2>3.网络端口被占用</h2>
有时候，当eclips突然要关闭（出现问题非正常关闭），迅速重新启动这个应用会失败，系统报出&#8220;<font size="2"><font color="#cc0033">java</font>.net.BindException: Address already in use: </font>&#8221;
的错误。这是因为此Java应用需要在某个Socket端口进行监听，而这个端口当前不可用。是什么原因造成了当前端口不可用呢？有两种可能：一是别的应
用程序先抢用了这个端口。要想知道到底是哪个应用用了某个端口，只需要一些简单的脚本即可。例如，在WINDOWS下，使用下面的命令就可是知道，8080端口是否占用。netstat.<br>还有就是在关闭IDE后看进程里如果有JAVA.EXE的话.一般就是被它自己占用了.<br>
<p>另外还有一个原因就是这个Socket正在&#8220;time_wait&#8221;的状态。通常一个应用在关闭以后，Socket不会立刻释放（在TCP/IP的协
议中规定），在Time_WAIT状态下需要保持4分钟（不同的操作系统时间不一样）。要解决这个问题，需要在Java程序中加上
&#8220;serverSocket.setReuseAddress(true);&#8221;就能快速的重用这个Socket。</p>
<h2>4.人为的疏忽</h2>
还有一些人为的疏忽，例如配置内容写错,配置文件损害，库文件丢失等等都能引起启动的问题,自己应用中多注意一下.应该还能找出很多不同的情况来.。<br><br>      <img src ="http://www.blogjava.net/shgavin/aggbug/117771.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shgavin/" target="_blank">shgavin</a> 2007-05-16 10:06 <a href="http://www.blogjava.net/shgavin/articles/gavin.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>