tomcat项目报错javax.servlet.ServletException: java.lang.OutOfMemoryError: PermGen space

本文介绍了当遇到PermGen内存溢出错误时的两种解决方法。通过调整Tomcat的内存配置参数,有效避免了因永久代空间不足而导致的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自: https://blog.youkuaiyun.com/a517690655

原作者版权所有,谢谢

 

首先根据以往的直觉肯定是内存溢出问题,在此顺便了解一下JVM的内存结构,首先PermGen这个东西在JVM是指永久保存区域(permnent generation),因此存放的是一些不会被回收的一些类信息和描述,因此针对一些业务比较杂的项目(公司的六期项目好几百MB,Maven仓库3点多个G),类对象比较多的,如果tomcat配置的最大内存不够存放这些永久存在的类信息和描述,就会抱内存溢出异常;
javax.servlet.ServletException: java.lang.OutOfMemoryError: PermGen space
忘记截报错截图了;

接下来说解决思路:
首先在eclipse以及其他内存都配置充足的情况下,在tomcat报这个错误,肯定是tomcat分配的内存不够情况导致的,而这个参数哪里配置呢?查了一下,是在tomcat根目录下面的BIN文件夹下的catalina.bat(linux就是.sh)这个文件下面配置的,我们右击在这个文件加上一行
JAVA_OPTS="$JAVA_OPTS" -server -XX:PermSize=128m -XX:MaxSize=512m
保存之后重启tomcat载入配置信息即可,但是这种要重启,比较麻烦;接下来说第二种方法
二:

 

 

在Argument里面加上一条
-Xms256M -Xmx512M -XX:PermSize=256m -XX:MaxPermSize=512m
重启一下项目,ok。就不会报内存溢出了。

 

 

找了一天的,只有原作者解决了我的问题,非常感谢

<think>我们正在处理用户关于Tomcat升级后出现的错误:javax.servlet.http.HttpServletRequest.getHttpServletMapping的问题。 根据用户描述,错误发生在升级Tomcat之后,涉及HttpServletRequest的getHttpServletMapping方法。这通常是因为Servlet API版本不兼容导致的。 分析: 1. `getHttpServletMapping` 方法是Servlet 4.0引入的(Java EE 8的一部分)。如果用户的应用代码中使用了这个方法,那么运行环境必须支持Servlet 4.0。 2. Tomcat 9.0.x开始支持Servlet 4.0,而Tomcat 8.5.x支持的是Servlet 3.1。 3. 因此,如果用户从较低版本(如Tomcat 8.5)升级到Tomcat 9.0或更高版本,但应用程序仍然编译时使用的是旧版本的Servlet API(比如Servlet 3.1),那么在运行时就会找不到这个方法(NoSuchMethodError)。 解决方案: 1. 确保Tomcat版本至少为9.0.x(因为Tomcat 9.0实现了Servlet 4.0规范)。 2. 检查应用程序的依赖,确保编译时使用的Servlet API版本为4.0或更高。如果使用Maven,可以在pom.xml中检查: ```xml <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> ``` 注意:版本至少为4.0.0,且scope一般为provided,因为Tomcat本身会提供该API。 3. 如果应用程序之前是针对Tomcat 8.5(Servlet 3.1)开发的,那么需要将代码中使用的Servlet 4.0新特性(如getHttpServletMapping)进行条件处理,或者升级整个应用以使用Servlet 4.0。 4. 清理并重新构建项目,确保部署到Tomcat的WAR文件包含正确的类文件。 5. 如果用户无法升级到Tomcat 9(例如由于环境限制),那么应该避免使用Servlet 4.0的新特性,将代码中调用`getHttpServletMapping`的地方移除或替换为其他方式。 6. 另外,检查是否有其他库依赖于Servlet API的版本,确保没有版本冲突。 参考引用: 根据引用[2]中提到的错误,有时可能是由于多个servlet映射到同一个URL导致的,但这里的问题明显是方法不存在,所以更可能是版本问题。同时,引用[3]提到了Tomcat 8.5.46的更新日志,但该版本仍然只支持Servlet 3.1。 因此,如果用户升级到了Tomcat 9以下版本,那么需要升级Tomcat到9以上;如果已经使用Tomcat 9,则需要确保应用使用Servlet 4.0 API编译。 相关问题: 1. 如何检查当前Tomcat版本支持的Servlet API版本? 2. 如何解决升级Tomcat后出现的NoSuchMethodError? 3. Servlet 4.0相对于3.1有哪些主要新特性?</think>### Tomcat升级错误:`javax.servlet.http.HttpServletRequest.getHttpServletMapping()` 解决方案 此错误通常发生在升级Tomcat后,应用程序尝试调用`getHttpServletMapping()`方法时出现`NoSuchMethodError`或类似异常。根本原因是**Servlet API版本不兼容**,涉及Servlet规范3.1与4.0的差异: #### 原因分析 1. **方法版本不匹配** `getHttpServletMapping()`是Servlet 4.0规范新增的方法(Java EE 8),在Servlet 3.1(Java EE 7)中不存在。 - Tomcat 8.5.x 实现的是 **Servlet 3.1** 规范 - Tomcat 9.0.x+ 实现的是 **Servlet 4.0** 规范 - 若应用代码使用此方法但部署在Tomcat 8.5上,会触发`NoSuchMethodError` 2. **依赖冲突** 应用编译时使用了Servlet 4.0 API库,但运行时Tomcat 8.5仅提供Servlet 3.1实现,导致方法缺失。 --- #### 解决方案 ##### 方案1:升级Tomcat版本(推荐) **步骤:** 1. 下载并安装Tomcat 9.0+([官网下载](https://tomcat.apache.org/download-90.cgi)) 2. 迁移应用: ```bash # 停止旧Tomcat $CATALINA_HOME/bin/shutdown.sh # 备份旧配置(conf/server.xml, conf/context.xml等) cp -r $CATALINA_HOME/conf /backup/tomcat_conf # 部署应用到新Tomcat的webapps目录 cp your_app.war $NEW_TOMCAT_HOME/webapps/ # 启动新Tomcat $NEW_TOMCAT_HOME/bin/startup.sh ``` 3. 验证版本: ```bash $ $NEW_TOMCAT_HOME/bin/version.sh Server version: Apache Tomcat/9.0.xx ``` ##### 方案2:降级应用依赖(兼容Tomcat 8.5) **步骤:** 1. 修改Maven依赖(或Gradle): ```xml <!-- pom.xml --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <!-- 使用3.1.0版本 --> <version>3.1.0</version> <scope>provided</scope> </dependency> ``` 2. 移除代码中对`getHttpServletMapping()`的调用,替换为兼容方案: ```java // 替代方案:通过请求路径解析映射信息 String path = request.getRequestURI(); // 或使用旧版API获取Servlet路径 String servletPath = request.getServletPath(); ``` 3. 清理并重新编译项目: ```bash mvn clean package ``` ##### 方案3:检查配置冲突(辅助措施) 1. 确保`conf/web.xml`中无重复Servlet映射(参考引用[2]): ```xml <servlet-mapping> <servlet-name>your_servlet</servlet-name> <!-- 检查URL模式唯一性 --> <url-pattern>/unique_path/*</url-pattern> </servlet-mapping> ``` 2. 更新`conf/context.xml`启用自动重载(参考引用[3]): ```xml <Context reloadable="true"> ``` --- #### 验证步骤 1. 部署后检查Tomcat日志: ```bash tail -f $CATALINA_HOME/logs/catalina.out ``` 2. 确认无以下错误: ``` java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.getHttpServletMapping() ``` --- ### 相关问题 1. 如何检查当前Tomcat支持的Servlet规范版本? 2. 升级Tomcat 9时如何避免应用兼容性问题? 3. Servlet 4.0相对于3.1有哪些主要新特性? [^1]: 配置修改参考Tomcat官方文档 [^2]: Servlet映射冲突解决方案 [^3]: Tomcat更新日志中的配置项说明
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值