开发者社区> pandamonica> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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了,开森

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java使用数组和循环结构实现简单的商品管理系统
今天使用数组和循环结构实现了一个简单的商品管理系统主要功能如下: 1.查询所有商品、2.添加、3.修改、4.删除、5.退出 查询: 编号 名称 价格 1 苹果 3.1 2 橘子 3.5 添加: 输入编号名称价格添加到数组中 修改: 根据编号修改名称、价...
983 0
JAVA之旅(二十)—HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习
JAVA之旅(二十)—HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习 我们继续说一下集合框架 Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复 Set集合的功能和Collection是一致的 我们重点关注的是子类对象 我们来聊聊 一.
916 0
使用监听器实现Java Web的定时执行
定时器GoogleListener类: import java.util.Timer;//定时器类 import javax.
540 0
利用java代码和web拦截器轻松实现一个app抓包工具
    目前app测试时我们需要对接口数据进行抓包,对于app的抓包,我们可以使用很多现成的工具,比如fiddler、wireshark、charles等,基本上可以满足要求,但是对于一些定制化的需求,比如说:我们需要将抓包的数据进行篡改后再发送到服务器,或者对请求的数据新增标志字段以便定位问题,或者更多需要更改数据的需求,传统抓包工具已经很难实现,需要我们探索新的方式方法。
1494 0
Java 继承Thread类和实现Runnable接口的区别
ava中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类     在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程。当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,
1293 0
Java实现红黑树
红黑树概要 二叉查找树实现了基本操作时间复杂度O(h),但是树的高度h在最坏的情况下可能变为n 红黑树是一种平衡二叉树,可以保证树的高度 h = lg(N) 红黑树的性质 红黑树为每个节点添加了颜色存储位,确保了任何一个从根到叶子的路径长度不会比其他路径长出2倍 每个节点是红色或者黑色 根节点是黑色的 叶子节点是黑色的 红色节点的子节点都是黑色的 当前节点到其后代叶子节点的所有简单路径路的黑色节点数目相同 性质4确保了根节点到任意叶子节点的路径长度不会比到其他叶子节点的路径长度长出2倍。
849 0
+关注
159
文章
3
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载