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月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
802 1
|
9月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
1160 0
|
10月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
610 1
|
缓存 算法 Java
Java中的内存管理:理解与优化
【10月更文挑战第6天】 在Java编程中,内存管理是一个至关重要的主题。本文将深入探讨Java内存模型及其垃圾回收机制,并分享一些优化内存使用的策略和最佳实践。通过掌握这些知识,您可以提高Java应用的性能和稳定性。
231 4
|
存储 监控 算法
Java中的内存管理:理解Garbage Collection机制
本文将深入探讨Java编程语言中的内存管理,着重介绍垃圾回收(Garbage Collection, GC)机制。通过阐述GC的工作原理、常见算法及其在Java中的应用,帮助读者提高程序的性能和稳定性。我们将从基本原理出发,逐步深入到调优实践,为开发者提供一套系统的理解和优化Java应用中内存管理的方法。
|
存储 算法 Java
Java内存管理深度剖析与优化策略####
本文深入探讨了Java虚拟机(JVM)的内存管理机制,重点分析了堆内存的分配策略、垃圾回收算法以及如何通过调优提升应用性能。通过案例驱动的方式,揭示了常见内存泄漏的根源与解决策略,旨在为开发者提供实用的内存管理技巧,确保应用程序既高效又稳定地运行。 ####
|
存储 监控 算法
Java内存管理深度剖析:从垃圾收集到内存泄漏的全面指南####
本文深入探讨了Java虚拟机(JVM)中的内存管理机制,特别是垃圾收集(GC)的工作原理及其调优策略。不同于传统的摘要概述,本文将通过实际案例分析,揭示内存泄漏的根源与预防措施,为开发者提供实战中的优化建议,旨在帮助读者构建高效、稳定的Java应用。 ####
304 35
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
运维 Cloud Native Java
Java项目部署的发展流程
本文介绍了四种不同的应用部署方式:传统部署、虚拟化部署、容器化部署和云原生部署。每种方式的特点、部署流程及优缺点进行了详细说明。传统部署直接在物理机上运行应用,存在资源利用率低和运维成本高的问题;虚拟化部署通过虚拟机实现资源隔离和复用,但有性能损失和单点故障风险;容器化部署则提供轻量级、可移植的应用环境,具备良好的隔离性和一致性;云原生部署结合了容器化和微服务架构,实现高效运维和灵活扩展。
838 1
Java项目部署的发展流程