从JVM的常见异常来看Tomcat中内存的设置

一、Tomcat和JDK的关系:

       1. Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java 虚拟机。

        2. JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序。这个初始内存和最大内存在一定程度都会影响程序的性能。比如说在应用程序用到最大内存的时候,JVM是要先去做垃圾回收的动作,释放被占用的一些内存。所以想调整Tomcat的启动时初始内存和最大内存就需要向JVM声明, 一般的JAVA程序在运行都可以通过-Xms -Xmx来调整应用程序的初始内存和最大内存:  这两个值的大小一般根据需要进行设置。

        3.为什么一般把-Xms和-Xmx设置成一样大?

初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用程序在大负 载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化,虚拟机就必须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应 、用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。

        Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,会造成内存溢出的异常。

 

二、常见的Java内存溢出有以下三种:

 

         1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出
JVM在启动的时候会自动设置JVM Heap的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)不可超过物理内存。

 

堆内存可以利用JVM提供的-Xmn -Xms -Xmx等选项进行设置。Heap的大小是Young Generation 和Tenured Generaion 之和。

 

在JVM中如果98%的时间是用于GC,且可用的Heap size 不足2%的时候将抛出此异常信息。

 

解决方法:手动设置JVM Heap(堆)的大小。  

 

 

 

          2. java.lang.OutOfMemoryError: PermGen space  ---- PermGen space溢出。
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。

 

为什么会内存溢出,这是由于这块内存主要是被JVM存放Class和Meta信息的,Class在被Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同。sun的GC不会在主程序运行期对PermGen space进行清理,所以如果你的APP会载入很多CLASS的话,就很可能出现PermGen space溢出。

 

解决方法: 手动设置MaxPermSize大小。

 

 

 

          3. java.lang.StackOverflowError   ---- 栈溢出
JVM依然是采用栈式的虚拟机,这个和C和Pascal都是一样的。函数的调用过程都体现在堆栈和退栈上了。
调用构造函数的 “层”太多了,以致于把栈区溢出了。
通常来讲,一般栈区远远小于堆区的,因为函数调用过程往往不会多于上千层,而即便每个函数调用需要 1K的空间(这个大约相当于在一个C函数内声明了256个int类型的变量),那么栈区也不过是需要1MB的空间。通常栈的大小是1-2MB的。通常递归即使递归的层次不会过多,也很容易溢出。

 

解决方法:修改程序。

 

三、怎样修改Tomcat的初始化内存

         有如下修改方法:

        1、Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下设置:

Windows下:

set JAVA_OPTS=-server -Xms2048m -Xmx2048m -Xss512k -XX:PermSize=512M -XX:MaxNewSize=512m -XX:MaxPermSize=780m

 

Linux下:注意没有set,但是有引号

 

JAVA_OPTS="-Xms256m -Xmx512m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m"

 

参数说明:

         -server:一定要作为第一个参数,在多个CPU时性能佳

 

  JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'

 

  需要把这个两个参数值调大。例如:

 

  JAVA_OPTS='-Xms256m -Xmx512m'

 

  表示初始化内存为256MB,可以使用的最大内存为512MB。

住,必须要有m(表示兆,如果没有,则是KB)

 

        2.  环境变量中设变量名:JAVA_OPTS     变量值:-Xms512m   -Xmx512m

 

 

        3.   前两种方法针对的是bin目录下有catalina.bat的情况(比如 直接解压的Tomcat等),但是有些安装版的Tomcat下没有catalina.bat,这个时候可以采用如下方法,当然这个方法也是最通用的方法: 打开tomcatHome//bin//tomcat7w.exe,点击Java选项卡,然后将会发现其中有这么两项:Initial memory pool和Maximum memory pool。

       其中Initial memory pool这个就是初始化设置的内存的大小。Maximum memory pool这个是最大内存的大小。 设置完了就按确定然后再重启TOMCAT你就会发现tomcat中jvm可用的内存改变了。

 

          4. Eclipse中修改JVM内存

 

 

Eclipse->Window->Preferences->Server->Runtime Environments->选中Apache Tomcat v5.0->点击Edit按钮->在弹出对话框里点击JRE后面的Installed JREs按钮->在弹出对话框中选中tomcat使用的那个JRE->点击Edit按钮->在弹出对话框中,

 

找到Default VM Arguments,并在输入框中输入:-Xms110M -Xmx110M

 

 

 


 

然后我们在jvisualvm控制台可以看到:

 


 

 

 

其实除了进行常见的-Xms和-Xmx的设置外,还能对jvm参数进行如下的设置,下面接着说明jvm参数的常用配置。

 

四、jvm参数说明:

 

-server:一定要作为第一个参数,在多个CPU时性能佳
-Xms:java Heap初始大小。 默认是物理内存的1/64。
-Xmx:java heap最大值。不可超过物理内存。

 

 

-XX:PermSize:设定内存的永久保存区初始大小,用visualvm.exe可见其缺省值为64M。

 

-XX:MaxPermSize:设定内存的永久保存区最大 大小,用visualvm.exe可见其缺省值为64M。

 

 

 

-XX:SurvivorRatio=2:生还者池的大小,默认是2,如果垃圾回收变成了瓶颈,您可以尝试设置该值。

 

 -XX:NewSize:新生成的池的初始大小。 缺省值为2M。

 

-XX:MaxNewSize: 新生成的池的最大大小。   缺省值为32M。

 

如果 JVM 的堆大小大于 1GB,则应该使用值:-XX:newSize=640m -XX:MaxNewSize=640m -XX:SurvivorRatio=16,或者将堆的总大小的 50% 到 60% 分配给新生成的池。调大新对象区,减少Full GC次数。

 

 

 

 +XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
-Xss:每个线程的Stack大小。
-verbose:gc 现实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一
-XX:+UseParNewGC :缩短minor收集的时间
-XX:+UseConcMarkSweepGC :缩短major收集的时间 此选项在Heap Size 比较大而且Major收集时间较长的情况下使用更合适。

 

-XX:userParNewGC 可用来设置并行收集【多CPU】
-XX:ParallelGCThreads 可用来增加并行度【多CPU】
-XX:UseParallelGC 设置后可以使用并行清除收集器【多CPU】

 

五、关于垃圾收集的一些经验:

       另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集(Full GC)就会很慢, 但是频度会降低。如果你把堆的大小和内存的需要配置一致,完全收集(Full GC)就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程中出现。  

       如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。

       一个要注意的地方:建议把内存的最高值跟最低值的差值缩小,不然会浪费很多内存的, 最低值加大 ,最高值可以随便设,但是要根据实际的物理内存 ,如果内存设置太大了,比如设置了512M最大内存,但如果没有512M可用内存,Tomcat就不能启动,还有可能存在内存被系统回收,终止进程的情况。

        六、 Tomcat 7中怎样查看内存的使用情况

 

1. 在$Tomcat_Home/conf/tomcat-users.xml下配置一个tomcat user,并使用http://localhost:8080/manager 访问。

<tomcat-users>
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <role rolename="manager-gui"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>
  <user username="swang6" password="swang6" roles="manager-gui"/>
</tomcat-users>

2. 点击右方的Server Status.



 

 

Tomcat中监控JVM内存使用情况 本文将介绍如何在Tomcat中监控JVM内存使用情况,并提供相应的源代码示例。在本文中,我们介绍了如何在Tomcat中启用JMX,并使用Java代码连接到JMX服务并获取JVM内存使用情况。要监控JVM内存,我们需要将上述示例代码编译为Java类,并将其放置在Tomcat服务器的类路径下。请注意,在生产环境中,应该使用安全认证和SSL来保护JMX连接,并将监控数据记录到日志或专业监控工具中,以便进行长期性能分析和故障排除。接下来,创建一个Java类来连接到Tomcat的JMX服务并获取JVM内存使用情况。 阅读详情

相关推荐

用Matlab机器人工具箱搞定六轴机械臂建模:从DH参数到3D可视化(附完整代码)

本文详细介绍了如何使用Matlab机器人工具箱进行六轴机械臂建模,从DH参数输入到3D可视化全流程解析。通过正运动学验证、逆运动学求解和交互控制等实战技巧,帮助工程师快速掌握机械臂建模核心方法,并提供完整代码示例解决常见问题。

weixin_27372101的博客 394

Tomcat启动内存设置 

Tomcat启动内存设置 Tomcat的启动分为startupo.bat启动和注册为windows服务的启动,下面一一说明。 1.startup.bat启动 在tomcat_home/bin目录下找到catalina.bat,用文本编辑器打开,加上下面一行: set JAVA_OPTS= -Xms1024M -Xmx1024M -XX:PermSize=256M -XX:MaxNewSize=256M -XX:MaxPermSize=256M 解释一下各个参数: -Xms1024M:初始化堆..

聆听。。花开雨落的博客 1371

FPGA远程更新实战:Multiboot双镜像配置与Flash分区策略

本文详细介绍了FPGA远程更新中Multiboot双镜像的配置与实现,重点对比了XDC约束和ICAPE2原语两种配置方案的优缺点及适用场景。提供了基于W25Q128 Flash的非对称分区策略、MCS文件生成与烧写方法,并深入探讨了远程更新的流程容错处理与可靠性优化建议,帮助开发者构建稳定可靠的FPGA远程更新系统。

ss78901的博客 839

Tomcat修改内存

1. 概述 1.1 问题描述 用户工程部署在 Tomcat 容器中,若遇到以下问题: 内存溢出错误:java.lang.OutOfMemoryError:Java heap space 内存占用过高。 Tomcat 后台提示Memory is over threshold 报错:内存溢出。 需要将 Tomcat 服务器内存调大,可参考本文方法解决。 1.2 解决思路 为了避免内存溢出的问题,一方面应适当启用磁盘缓存,另一方面可以根据实际情况调整服务器.

menghuannvxia的专栏 2万+

一种基于改进YOLOv8并与ORB-SLAM3融合的动态环境密集点云同步定位与建图(SLAM)方法

文章提出了一种基于改进 YOLOv8 与 ORB-SLAM3 融合的动态环境稠密点云 SLAM 方法,通过引入GSConv 卷积模块和VoVGSCSP 特征融合模块优化 YOLOv8 的轻量性,结合实时目标检测与语义分割技术去除动态特征点,显著提升了动态场景下的位姿估计精度。

2401_87345388的博客 1940

Unity中5分钟实现3D高斯泼溅渲染:从原理到实战部署

3D高斯泼溅(3D Gaussian Splatting)是一种新兴的神经渲染技术,它通过显式地使用大量3D高斯椭球来表示场景,革新了传统的体渲染和神经辐射场(NeRF)方法。其核心原理是将这些3D高斯投影到2D屏幕并进行快速光栅化与Alpha混合,从而绕过了耗时的光线步进,实现了极高的渲染效率。这项技术的价值在于,它能够在消费级GPU上达到实时甚至超实时的帧率,同时保持紧凑的数据表达和惊人的视觉细节,极大地降低了高质量3D重建与渲染的门槛。在应用场景上,它正快速渗透到数字孪生、虚拟现实、文化遗产数字化以及

weixin_29474431的博客 274

Tomcat 启动参数设置

Tomcat 启动参数设置    -server:一定要作为第一个参数,在多个CPU时性能佳  -Xms:初始Heap大小,使用的最小内存,cpu性能高时此值应设的大一些  -Xmx:java heap最大值,使用的最大内存  上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理 内存的一半。-XX:PermSize:

沉底的石头 1万+

图像质量评估(9) -- 杂散光(Flare)的测量标准与实战解析

本文深入解析了杂散光(Flare)对图像质量的影响及其测量标准,包括ISO 9358和ISO 18844的核心方法。通过实战指南和优化策略,帮助读者掌握杂散光的测量与控制技术,提升光学系统性能。

sql99的博客 251

jdk和tomcat的关系

关系:jdk可以在tomcat下运行,tomcat是jdk的编译工具。 1.什么是jvm 我们从操作系统的层面来理解,jvm其实就是操作系统中的一个进程。既然是一个进程,那么我们很容易的可以通过任务管理器来查看。假设此时我们启动myeclipse(myeclipse其实就是用java语言编写的一个软件,他的运行必然会启动一个jvm,我们可以把myeclipse理解成我们自己写的一个简单的java版的helloworld程序)。 2.什么是tomcat tomcat其实是一个用java语言开发的免费.

weixin_42596278的博客 5162

使用W5500与外网通信故障解决(MAC地址问题)

在蒲城项目的调试时,AMS500发现一个致命的问题,就是:在局域网跨网段通信时候和中心服务器不能通信,但是在一个HUB下是没有问题的,以前的串口服务器有过类似的问题出现,解决方法说是芯片的问题,结果也不了了之,换了芯片正常。 我们的网络通信芯片选择W5500,其中的MAC地址采用的是CPU的序列号作为Mac地址的问题就出在这,我们在使用的时候MAC地址的第一个必须是偶数,我们忽视了。 现象描...

zxm8513优快云博客 7756

ARM CoreLink 系列 5.1.1 -- CI-700 System Address Map 】

所有的CHI 命令都包含一个 Source ID 和 Target ID, 其中 Source ID 可以来自于 RN Node, Target ID 可以来自于HN node或者其他 SN node. 其中 Target ID 是通过 SAM解析传入的地址得到的。对于 CI-700中的所有 RN Node 中的 SAM 多会进行配置,因为RN Node 访问的是整个地址空间,不同的地址空间会有不同的属性(I/O, DRAM),所以会对RN SAM 配置多个不同属性的区域。

CodingCos的博客 771

JVM 参数详解(从JVM的常见异常来看Tomcat中内存的设置)

一、Tomcat和JDK的关系:        1. Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java 虚拟机。         2. JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序。这个初始内存和最大内存在一定程度都会影响程序的性能。比如说在应用程序用到最大内存的时候,JVM是要先去做垃圾回收的动作,释放被占用的一些内存。所以想调整

蓝色小菜鸟 1061

姿态传感器/陀螺仪之LSM6DSLTR应用驱动程序设计

* LSM6DSLTR I2C地址(SA0=1) *//* 初始化LSM6DSLTR传感器(加速度计±2g,陀螺仪±250°/s) *//* 加速度计灵敏度 *//* 角速度值(°/s) *//* I2C句柄 *//* 陀螺仪灵敏度 *//* 加速度值(g) *//* 温度值(°C) *//* 设备地址 *//* IF_INC=1: 自动增量地址 *//* 10Hz采样率 *//* 配置I2C1引脚:PB6->SCL, PB7->SDA *//* 转换为实际温度值(°C),参考手册中温度计算公式 */

corlin6688的博客 395

jvm优化(二)JVM 内存大小设置

JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;...

m0_67402235的博客 478

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

内存溢出OutOfMemoryError

这是一个老生常谈的问题,至于这种异常产生的原因无外乎几种:JVM内存设置太小、内存泄漏、死循环和无限递归等。 一、常见问题类型的原因及解决方法 1. tomcat:java.lang.OutOfMemoryError: PermGen space 问题类型: PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要...

帝都的雁的博客 438

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

JVM内存溢出

原文路径:https://blog.youkuaiyun.com/ye1992/article/details/9344807Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机。Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对Java JVM有关内存方面的知识进行详细介绍。一、Java JVM内存介绍JVM管理两种类型的内存,堆和非堆。按照官方...

洋成林 297

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Tomcat配置与优化(内存、并发、管理)

一、JVM内存配置优化 在开发当中,当一个项目比较大时,依赖的jar包通常比较多,我们都知道,在应用服务器启动时,会将应用引用到的所有类通过ClassLoader依次全部加载到内存当中。Java的逻辑内存模型大致分为堆内存、栈内存、静态内存区,也称持久区,该区的内存不会被GC回收。堆内存用于存储类的实例、数组等引用类型数据,也就是用new生成的对象,都存放在这里,栈内存存储局部变量(如:方法参数),静态内存区存储常量、静态变量、类元数据信息(方法、属...

lgxzzz的博客 664

Tomcat内存释放不了,鸟哥的linux私房菜

JAVA_OPTS="-server -Xms800m -Xmx800m  -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true " JAVA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX: NewSize=192m -XX:MaxNewSize=384m" CATALINA_OPTS

m0_60848502的博客 1574

《从零开始带你成为JVM实战高手》 笔记八

一、常见导致OOM的原因 1、递归、循环调用导致虚拟机栈内存溢出 举例:找出D盘下文件名中含有txt的文件,D盘下有很多文件夹,每个文件夹下又有很多文件夹,如果使用递归可能导致栈溢出,如何解决? 2、 堆内存放不下过多对象 ...

colspanprince的博客 505

java.lang.OutOfMemoryError处理错误

java.lang.OutOfMemoryError异常解决方法   原因: 常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收; 3.代码中存在死循环或循环产生过多重复的对象实体; 4.使用的第三方软件中的BUG; 5.启动参数内存值设定的过小; 常见错误提示: 1.tomcat:jav...

weixin_34397291的博客 115

Tomcat 设置JVM内存大小

我的服务器的配置:  # OS specific support.  $var _must_ be set to either true or false. JAVA_OPTS="-Xms1024m -Xmx4096m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=2048m"   正文:   常见的内存溢出有以下两种: Java.lang.

落叶_19950624 4万+

修改Tomcat使用的JVM内存大小

我的服务器的配置:  # OS specific support.  $var _must_ be set to either true or false. JAVA_OPTS="-Xms1024m -Xmx4096m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=2048m"   正文:   常见的内存溢出有以下两种: java.l

翻越山峰 2万+

java tomcat jvm内存_Tomcat修改JVM内存,修改了就是不生效,

设置Tomcat启动的初始内存其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置三、实例,以下给出1G内存环境下java jvm 的参数设置参考:JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX...

weixin_39793098的博客 1906

CentOS 7 Linux 安装Tomcat 8 - JVM内存优化(

配置Tomcat启动JVM时分配的内存 JVM内存分配默认情况说明 JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:PermSize=128M -XX:MaxPermSize=128m" JVM内存配置参数 描述 -Xmx Java Heap最大值,默认值为物理内存的1/4; -Xms Java Heap初始值,Server端J...

大神降临! 5260
上一篇: Java虚拟机学习 - 垃圾收集器
下一篇: Tomcat中的线程池(APR和ThreadPool)
iteye_4921
博客等级 码龄8年 25粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值