关于JAVA中内存溢出的解决办法

2023-05-16

关于JAVA中内存溢出的解决办法

J2ee应用系统是运行在J2EE应用服务器上的,而j2ee应用服务器又是运行在JVM上的,

生成环境中JVM参数的优化和设置对于J2EE应用系统性能有着决定性的作用。要优化系统,则需要对JVM参数进行合理的设置,所以我们需要了解究竟在什么地方进行设置、有哪些参数以及各参数的意义分别是什么,并且我们还得了解JVM的内存管理机制究竟是个什么玩意儿?其实我们在网上搜索引擎上,一搜就有可以获取到一大把相关信息,关键是我们如何深入的理解它们。那么下面我们就简单的介绍一下究竟什么是JVM的内存管理机制吧~!  

 

JVM的早期版本并没有进行分区管理;这样的后果是JVM进行垃圾回收时,不得不扫描JVM所管理的整片内存,所以搜集垃圾是很耗费资源的事情,也是早起JAVA程序的性能低下的主要原因。随着JVM的发展,JVM引进了分区管理的机制。

 

JVM所管理的所有内存资源分为2个大的部分。永久存储区(Permanent Space) 和堆空间(The Heap Space)。其中对空间又分为新生区()和养老区,新生区又分为伊甸园,幸存者0区、幸存1区。如下图:

 

关于个分区的用途,大家可以参考其他相关文档。本教程所要处理的问题是如何解决内存溢出的问题。接下来以tomcat服务器为例:

我们首先得找到内存管理所要设置的参数在哪个文件:<CATALINA_HOME>/bin/catalina.bat。

需要添加一行代码:

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

下面分别对各参数进行介绍和解释:

JVM 相关参数:

参数名参数说明

-server 启用能够执行优化的编译器, 显著提高服务器的性能,但使用能够执行优化的编译器时,服务器的预备时间将会较长。生产环境的服务器强烈推荐设置此参数。

-Xss 单个线程堆栈大小值;JDK5.0 以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

-XX:+UseParNewGC 可用来设置年轻代为并发收集【多CPU】,如果你的服务器有多个CPU,你可以开启此参数;开启此参数,多个CPU 可并发进行垃圾回收,可提高垃圾回收的速度。此参数和+UseParallelGC,-XX:ParallelGCThreads搭配使用。

+UseParallelGC 选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。可提高系统的吞吐量。

-XX:ParallelGCThreads 年轻代并行垃圾收集的前提下(对并发也有效果)的线程数,增加并行度,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。永久存储区相关参数:参数名参数说明

-Xnoclassgc 每次永久存储区满了后一般GC 算法在做扩展分配内存前都会触发一次FULL GC,除非设置了-Xnoclassgc.

-XX:PermSize 应用服务器启动时,永久存储区的初始内存大

-XX:MaxPermSize 应用运行中,永久存储区的极限值。为了不消耗扩大JVM 永久存储区分配的开销,将此参数和-XX:PermSize这个两个值设为相等。堆空间相关参数参数名参数说明

-Xms 启动应用时,JVM 堆空间的初始大小值。

-Xmx 应用运行中,JVM 堆空间的极限值。为了不消耗扩大JVM 堆控件分配的开销,将此参数和-Xms 这个两个值设为相等,考虑到需要开线程,讲此值设置为总内存的80%.

-Xmn 此参数硬性规定堆空间的新生代空间大小,推荐设为堆空间大小的1/4。

上面所列的JVM 参数关系到系统的性能,而其中-XX:PermSize,

-XX:MaxPermSize,-Xms,-Xmx 和-Xmn 这5 个参数更是直接关系到系统的性能,系统是否会出现内存溢出。

-XX:PermSize 和-XX:MaxPermSize 分别设置应用服务器启动时,永久存储区的初始大小和极限大小;在生成环境中强烈推荐将这个两个值设置为相同的值,以避免分配永久存储区的开销,具体的值可取系统“疲劳测试”获取到的永久存储区的极限值;如果不进行设置-XX:MaxPermSize 默认值为64M,一般来说系统的类定义文件大小都会超过这个默认值。

-Xms 和-Xmx 分别是服务器启动时,堆空间的初始大小和极限值。-Xms的默认值是物理内存的1/64 但小于1G,-Xmx 的默认值是物理内存的1/4 但小于1G.在生产环境中这些默认值是肯定不能满足我们的需要的。也就是你的服务器有8g 的内存,不对JVM 参数进行设置优化,应用服务器启动时还是按默认值来分配和约束JVM 对内存资源的使用,不会充分的利用所有的内存资源。

 

 

 

结论:“永久存储区溢出(java.lang.OutOfMemoryError:Java Permanent Space)”乃是永久存储区设置太小,不能满足系统需要的大小,此时只需要调整-XX:PermSize 和-XX:MaxPermSize 这两个参数即可。“JVM 堆空间溢出(java.lang.OutOfMemoryError: Java heap space)”错误是JVM 堆空间不足,此时只需要调整-Xms 和-Xmx 这两个参数即可。

 

 

 

到此我们知道了,当系统出现内存溢出时,是哪些参数设置不合理需要调整。但我们怎么知道服务器启动时,到底JVM 内存相关参数的值是多少呢?

这个问题其实Sun公司早已经意料到了,所以给我们开发了内存使用监控工具jvmstat.

大家可以到ORACLE官网进行下载。用它可以很方便的看到我们的服务器内存使用情况。

将下载的jvmstat包解压到如“C:\ProgramFiles\Java\jvmstat”(这是我本地java路径,大家可以根据自己所安装的java环境的路径进行解压)。启动完之后我们就可以使用visualgc命令了,cmd进入命令符窗口,输入tasklist(windows下查看进程任务PID)查找到你要检测进程PID.然后直接输入visuglgc PID 就会弹出三个可见视图。

如下图:

 

 

 

 

 

 

参考资料《浅谈SUNJVM 内存管理与应用服务器的优化之SUNJVM 内存管理》JasonS.H.Chen

参考资料《浅谈SUNJVM 内存管理与应用服务器的优化之服务器内存分配与优化》JasonS.H.Chen

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于JAVA中内存溢出的解决办法 的相关文章

随机推荐

  • 添加修改数据时前端报400的原因

    1 向后端提交的字段跟数据库中的字段对不上 当我们添加或者修改数据时 xff0c 前端跟后端的字段可能对不上 xff0c 如果没有让前后端的字段名保持一致 xff0c 就会导致数据不能正常添加到数据库 xff0c 因此会报400 2 对于某
  • 数组蛇形排序,优质解决方案

    目录 1 题目要求 xff0c 按照指定的行列号内 xff0c 数组按照蛇形的规律排列 xff0c 1 题目要求 xff0c 按照指定的行列号内 xff0c 数组按照蛇形的规律排列 xff0c 比如 1 2 6 7 3 5 8 13 4 9
  • (经典C语言题)1.输入3个字符串,要求按由小到大的顺序输出

    1 总体思路 字符串的比较可以使用 strcmp 函数 xff0c 返回值 gt 0 表示大于 xff0c 返回值小于 0 表示小于 xff0c 返回追等 于 0 表示相同 其他的比较排序思路与数字的排序交换没有区别 xff0c 逐个进行比
  • 【经典C语言题】输入10个整数,将其中最小的数与第一个数对换, 把最大的数与最后一个数对换,要求是使用三个函数

    1 先用函数输入10个数 xff0c 再调整 xff0c 最后输出 2 整体思路 在进行数值逐个比较的同时找到最小值的空间地址以及最大值的空间地址 xff0c 使用这两个空间 中的数据最终与第一和最后数据进行对换即可 3 上代码 1 先解决
  • (C语言经典题)有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,

    解题思路 1 2 3 4 5 6 7 8 9 前面都向后移动2的话 8 9 1 2 3 4 5 6 7 可以看出就是8 9 换到前面了 先保存最后一位的值9 xff0c 然后前面的所有数字后移一位 xff0c 再把9放到第一位 接下来就是重
  • git简单使用流程

    通过 git status 查看文件的状态 stage 暂存 commit 提交 history 历史 git本地库 push 推送 pull 拉取 remote 远的 repository 仓库 clone 克隆 上传step 1 git
  • MT8788 Android11 修改默认字体,字体大小和像素密度

    环境 MT8788 Android11 ili9881p hd720 dsi vdo 1 修改默认语言 目录 b device mediateksample tb8788p1 64 bsp vnd tb8788p1 64 bsp mk 内容
  • MT8788 Android11 tp 启动流程

    环境 MT8788 Android11 focaltech touch HD720 5寸tp log信息 分析步骤 一 获取dts信息 和 添加驱动到内核 1 获取dts设备树中配置的信息 2 将tp厂商的驱动文件注册添加到 tpd dri
  • 最新Java电子书

    最新Java电子书 JAVA参考大全 J2SE 5EDITION 世界级程序设计大师作品 Thinking in Java第三版 43 第四版 xff08 中文版 43 习题答案 xff09 Java数据库高级编程宝典 Java核心技术第八
  • 关于mtk配置文件的一些说明

    一 ProjectConfig mk 共三种区别 1 AUTO ADD GLOBAL DEFINE BY NAME类型 xff1a 将它后面的名字 xff0c 定义为宏是没有初始值的 define XXX 2 AUTO ADD GLOBAL
  • 监控平台(windows版本)使用SDK的方式接入摄像头

    一 登录进入监控平台管理端 二 添加设备 1 依次点击左侧菜单栏中业务管理 设备管理 xff0c 进入到设备管理界面 如下图 2 点击设备列表字样下的添加按钮添加设备 如下图 3 在添加设备中按如下方式填写 设备编号 可根据需求自行填写 国
  • 认识HTML

    目录 HTML介绍HTML结构HTML常用标签注释标签标题标签段落标签和换行标签格式化标签图片标签超链接标签表格标签列表标签表单标签form和input标签其他标签 无语义标签 HTML特殊字符 HTML介绍 HTML全称是超文本标记语言
  • spring超全面详解

    spring概述 Spring 是于2003年兴起的一款轻量级的 非侵入式的IOC和AOP的一站式的java开发框架 为简化企业级应用开发而生 1 轻量级 就是指spring核心功能的jar包不大 2 非侵入式 我们的业务代码不需要继承或实
  • 虚拟机怎么从图形界面转到命令行(去掉桌面)

    点击 xff1a ctrl 43 alt 43 F1切换到桌面 点击 xff1a ctrl 43 alt 43 F5切换命令行 xff08 去掉桌面 xff09
  • springboot是怎么实现自动配置的?

    一 springboot是对spring框架做的一系列优化 xff0c 减少了大量繁琐的配置 xff0c 并提供了内置web服务器 xff0c 让程序运行更快 1 springboot起步依赖 xff1a 简单的说 xff0c 起步依赖就是
  • 第三章 Linux文件目录查找

    Find命令 find命令在Linux中搜索效果非常不错 xff0c 不仅可以按照文件名搜索文件 xff0c 还可以按照权限 时间 容量大小等来搜索文件 xff0c 但是find命令它是通过递归式在硬盘中进行搜索的 xff0c 如果指定的搜
  • 超市购物小程序

    编写一个超市购物程序 xff0c 在一家超市有牙刷 毛巾 水杯 苹果和香蕉五种商品 xff1a 拥护输入序列号进行购物 xff0c 并在输入购物数量后算出所需花费及退出购物时的总花费 一次购买结束后 xff0c 需用户输入 34 Y 34
  • 链游是什么?

    链游 从字面上理解它就是区块链上的游戏 xff0c 也被称作gamefi xff08 Gaming and Decentralized Finance xff09 在国内也被称为金融性游戏 在链游中玩家除了能够有玩游戏的体验之外也能够参与交
  • 出现error ‘props‘ is defined but never used 这种eslint相关的报错,关闭eslint的方法

    最近做项目遇到如下报错 xff1a cmd终端中 xff1a 为了关闭这个eslint报错 xff0c 可以用如下方法 xff1a 针对自己创建的新项目的话 xff0c 是在项目文件夹中的vue config js 中 此处项目是用Vue
  • 关于JAVA中内存溢出的解决办法

    关于JAVA中内存溢出的解决办法 J2ee应用系统是运行在J2EE应用服务器上的 xff0c 而j2ee应用服务器又是运行在JVM上的 xff0c 生成环境中JVM参数的优化和设置对于J2EE应用系统性能有着决定性的作用 要优化系统 xff