web项目部署后heap溢出(jconsole java虚拟机内存管理 tomcat内存管理)

简介: 阶段性完成编码工作后,打算将项目部署到生产机上看看效果遇到了问题:原本在测试机的eclipse环境能够正常运行的web项目,打包成war文件部署在tomcat上运行后,报错:Java heap space在浏览器上,访问tomcat上部署的web项目时,在浏览器上显示的报错信息。
+关注继续查看

阶段性完成编码工作后,打算将项目部署到生产机上看看效果遇到了问题:
原本在测试机的eclipse环境能够正常运行的web项目,打包成war文件部署在tomcat上运行后,报错:Java heap space
_
在浏览器上,访问tomcat上部署的web项目时,在浏览器上显示的报错信息。简单的翻译过来就是java的heap溢出。
为什么会heap溢出?
怎么解决这个问题?

原理上说,java语言环境下开发的web项目,运行在tomcat服务器上。
tomcat这个服务器软件,运行在jvm上,而jvm运行在操作系统上,操作系统运行在硬件上。这就是整个的从上到下的关系。

java heap space这种溢出,简单的说就是jvm的heap部分的内存不够用,溢出了。
java虚拟机也就是jvm,的基础知识,是我们这些java工程师需要掌握的基本功:
1-jvm中内存的规划(分几块,各自有什么分工);
2-要知道有GC这样一个概念(内存垃圾处理器),GC管理的是哪块内存;
3-java jdk jre之间是什么关系;
4-jdk自带监控监测工具的使用;

有了上述基本功,以后,我们遇到的问题就可以这样来分析了:
heap溢出的意思是,heap啊,这块内存是线程共享的,存储的是“实例”,那么heap溢出肯定是发生在你的java代码创建“实例”“对象”的时候,也就是运行时(相对于编译时)。
比如下面博客,可以参考一下
http://blog.51cto.com/android/50100
GC管理的就是heap,你的web项目进行第一次实例创建就报错,说明GC应该还没有起作用,我猜测。
java = java语言+java虚拟机+java API包+自己开发的class+第三方jar
jdk = java语言+java虚拟机+java API包
jre = java虚拟机+java API包

java是一个泛泛的概念;
jdk是一个最基础的开发环境;
jre是一个最基础的运行环境;

jdk(是jdk不是jre)自身带有好几个工具和命令,只要你正常安装了jdk并且配置了环境变量path,那么你可以轻松地使用jdk中的命令和工具监控你自己的jvm的运行情况。换句话说,你现在遇到的问题其实是,你自己的jvm上运行的tomcat上部署的web项目heap溢出了,原因是什么?虽然你可以凭借经验或者百度去判断,但是最专业的做法是,看看你自己的生产机上jvm一共分配给heap多少内存,你的web项目使用了多少内存,这样才是最科学的调试方式。其中最应该会用的是Jconsole工具
_
我们来运行一下:
_
上图所示的环境不是开发机也不是生产机,是另一台win7虚拟机,测试用的,很幸运,这台机器安装的tomcat8.0,一上来就可以用,容易上手。
_
很顺利,原因是我们将同样的war文件部署到这台虚拟机上,就正常运行,原因嘛,也很清晰看上图:堆,也就是heap占据的内存始终有600+兆,足够我们的web项目使用,因此肯定是可以运行的。
_
也就是说,同样一个war打包的web项目,在服务器1上运行报错heap溢出,在另一台服务器2上运行,正常。
问题就出在tomcat的配置上。

那么我们去看看这两台服务器上tomcat有什么区别
废柴生产机
_
tomcat自身实际上也有一个监控自己的管理工具
_
_
上图中,看到了废柴生产机上,tomcat使用的jvm的内存情况
下面看看小强生产机的对应情况
_
看看这个tomcat的管理工具
_
看到了吧,这就是差距!
内存大,自然跑的起来。

之前通过小强生产机(win7vm)的jconsole工具看到了,你自己写的web项目跑在tomcat上占据的内存最低也要600+兆,然而废柴生产机一共就300兆左右内存,怎么可能跑的起来呢?

下面我们需要做的工作就很简单了
1-要使用jconsole连接上废柴生产机,随时监控内存使用情况;
2-给废柴生产机分配更多的内存;

参考下面的博客文章配置废柴服务器的tomcat,让它可以被远程连接
http://blog.csdn.net/rainyspring4540/article/details/65434854
首先用tomcat自己的service.bat命令将tomcat9从废柴服务器的服务功能中,卸载;
_
后来我终于发现了问题所在,肯定是之前在配置过程中,不知道哪天手欠,自己修改catalina配置文件的时候把内存值改小了,现在让我改回去,怎么改也不生效。
没办法,我直接把一模一样的tomcat9解压版文件夹整个拷贝来一个全新的,就是修改了一下端口号,其他都不变。
结果,一点问题没有了,废柴服务器不再废柴:
_
虽然目前还没有掌握使用jconsole远程访问服务器上tomcat的方法,也没有掌握tomcat上jvm内存大小修改的方法,但是已经搞明白jvm内存的基础知识,会使用tomcat自身manager和jconsole本地工具查看服务器上tomcat的内存情况,能够用科学的工具应对java heap的OOM了,开森

目录
相关文章
|
9天前
|
前端开发 关系型数据库 MySQL
J2EE项目部署与发布(Linux版本)->jdk&tomcat安装,MySQL安装,后端接口部署,linux单体项目前端部署
J2EE项目部署与发布(Linux版本)->jdk&tomcat安装,MySQL安装,后端接口部署,linux单体项目前端部署
25 0
|
9天前
|
Java Maven Android开发
Maven - 快速创建Java工程和Web工程
Maven - 快速创建Java工程和Web工程
20 0
|
5月前
|
编译器 应用服务中间件
多种方法帮你解决tomcat项目部署,idea控制台乱码问题
多种方法帮你解决tomcat项目部署,idea控制台乱码问题
100 0
|
11月前
|
应用服务中间件 Linux Shell
Docker:第五章:基于centos7的docker安装配置部署教程以及基于docker Tomcat镜像使用的项目部署教程
Docker:第五章:基于centos7的docker安装配置部署教程以及基于docker Tomcat镜像使用的项目部署教程
184 0
Docker:第五章:基于centos7的docker安装配置部署教程以及基于docker Tomcat镜像使用的项目部署教程
|
应用服务中间件 数据安全/隐私保护 Windows
最新Tomcat安装及配置教程+JavaWeb项目部署
最新Tomcat安装及配置教程+JavaWeb项目部署
165 0
最新Tomcat安装及配置教程+JavaWeb项目部署
|
Java 应用服务中间件 容器
解决SpringBoot项目部署到服务器后访问Tomcat后404,无法访问Controller
解决SpringBoot项目部署到服务器后访问Tomcat后404,无法访问Controller
解决SpringBoot项目部署到服务器后访问Tomcat后404,无法访问Controller
|
Java 应用服务中间件 Maven
将maven项目部署到tomcat服务器(可能遇到的bug: 启动tomcat后,Maven项目做的ava Web时无WEB-INF/classes)
将maven项目部署到tomcat服务器(可能遇到的bug: 启动tomcat后,Maven项目做的ava Web时无WEB-INF/classes)
125 0
将maven项目部署到tomcat服务器(可能遇到的bug: 启动tomcat后,Maven项目做的ava Web时无WEB-INF/classes)
|
XML Java 应用服务中间件
IDEA:运行tomcat时,项目部署位置
IDEA:运行tomcat时,项目部署位置
189 0
|
应用服务中间件 Docker 容器
Docker使用篇之容器数据卷(轻松实现项目部署到tomcat上)
Docker使用篇之容器数据卷(轻松实现项目部署到tomcat上)
119 0
Docker使用篇之容器数据卷(轻松实现项目部署到tomcat上)
|
应用服务中间件
手动把web项目部署到tomcat
手动把web项目部署到tomcat
147 0
相关产品
云迁移中心
推荐文章
更多