【问题标题】:Memory error when trying to change Apache Tomcat port from 8080 to 80尝试将 Apache Tomcat 端口从 8080 更改为 80 时出现内存错误
【发布时间】:2012-02-17 02:29:21
【问题描述】:

我试图让我在 VPS 上安装的 Tomcat 在端口 80 而不是 8080 上运行,但是当我在我的 Tomcat 目录中编辑 server.xml 文件的设置并尝试重新启动 Tomcat 时,我'我收到此错误:

2012 年 1 月 23 日上午 9:55:46 org.apache.coyote.http11.Http11Protocol 初始化 严重:初始化端点 java.net.SocketException 时出错:不能 分配内存 在 java.net.PlainSocketImpl.socketBind(本机方法) 在 java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:353) 在 java.net.ServerSocket.bind(ServerSocket.java:336) 在 java.net.ServerSocket.(ServerSocket.java:202) 在 java.net.ServerSocket.(ServerSocket.java:158) 在 org.apache.tomcat.util.net.DefaultServerSocketFactory.createSocket(DefaultServerSocketFactory.java:50) 在 org.apache.tomcat.util.net.JIoEndpoint.init(JIoEndpoint.java:538) 在 org.apache.coyote.http11.Http11Protocol.init(Http11Protocol.java:176) 在 org.apache.catalina.connector.Connector.initialize(Connector.java:1014) 在 org.apache.catalina.core.StandardService.initialize(StandardService.java:680) 在 org.apache.catalina.core.StandardServer.initialize(StandardServer.java:795) 在 org.apache.catalina.startup.Catalina.load(Catalina.java:524) 在 org.apache.catalina.startup.Catalina.load(Catalina.java:548) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:616) 在 org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:261) 在 org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) 1 月 23 日, 2012 年 9:55:46 AM org.apache.catalina.startup.Catalina 负载严重: Catalina.start LifecycleException:协议处理程序初始化 失败:java.net.SocketException:无法分配内存 在 org.apache.catalina.connector.Connector.initialize(Connector.java:1016) 在 org.apache.catalina.core.StandardService.initialize(StandardService.java:680) 在 org.apache.catalina.core.StandardServer.initialize(StandardServer.java:795) 在 org.apache.catalina.startup.Catalina.load(Catalina.java:524) 在 org.apache.catalina.startup.Catalina.load(Catalina.java:548) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:616) 在 org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:261) 在 org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)

不太清楚这意味着什么……这是否意味着我没有足够的内存?是否有其他方法可以让 Tomcat 在端口 80 上运行?

编辑:这是我输入 free -m 时的输出:

total       used       free     shared    buffers     cached
Mem:   1024        748        275          0          0          0
-/+ buffers/cache:   748        275
Swap:   0          0          0

【问题讨论】:

  • 其他东西已经绑定到端口 80?检查网络统计
  • 我正在运行 apache2,但是当我关闭 apache2 时,我仍然遇到同样的错误。
  • 尝试端口 81 或 89 看看会发生什么。此外,您可以使用 netstat -a 命令查看正在使用的端口。如果你讨厌命令行工具,试试 TCPView。
  • 端口 81 也会发生同样的情况。我使用了 netstat,但看起来没有任何东西在使用端口 81。我不确定这是否相关,但我使用的是 Ubuntu Linux。可能是root访问有问题?
  • 请edit您的问题包含free -m的输出。

标签: apache tomcat port


【解决方案1】:

我在 OpenVZ 上使用 authbind 在端口 80 上运行时遇到了同样的问题。我通过从 OpenJDK 切换到 Sun Java 解决了这个问题。

【讨论】:

  • 我如何知道我运行的是 OpenJDK 还是 Sun Java?对不起,我不是这里的专家......
  • "java -version" 会告诉你使用的运行时
  • 非常感谢!现在我让 Tomcat 在 80 端口上运行。我不知道从 OpenJDK 切换到 Sun Java 会解决它……你是救星哈哈
  • 另一种解决方案是减少分配给 Tomcat 的内存(-Xmx 参数)。在我的系统上,如果我将最大堆大小减少约 70M,则可以使用 OpenJDK 启动 Tomcat。您还可以禁用 authbind 并使用 iptable 来重定向端口,这将允许您将最大堆大小增加 2 倍(因为 authbind 分叉进程并且 OpenVZ 不支持内存过度使用,所以不能超过一半可用内存与 -Xmx)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 2017-09-21
  • 2017-09-07
相关资源
最近更新 更多