Java内存溢出详解

Java内存溢出(OOM)全解析:场景、原因与实战解决方案 OOM问题本质是资源管理问题。通过理解内存模型、合理监控与调优,结合代码层面的谨慎实践,可显著降低其发生概率。记住,预防胜于治疗,良好的编程习惯与定期的性能分析是避免OOM的最佳武器。 阅读详情

一、常见的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内存设置不好很容易出现jvm内存溢出。

 

1、 linux下的tomcat:  jdk1.8后配置如下

修改TOMCAT_HOME/bin/catalina.sh
位置cygwin=false前。

JAVA_OPTS="-server -Xms512m -Xmx1024m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m" 

2、 tomcat8注册成了windows服务后内存配置:

 

要通过startup.bat启动tomcat才能加载配置

要添加在tomcat 的bin 下catalina.bat 里

rem Guess CATALINA_HOME if not defined
set CURRENT_DIR=%cd%后面添加,红色的为新添加的.

set JAVA_OPTS=-Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Djava.awt.headless=true

或者

首先找到 bin 目录下的 service.bat ,使用记事本打开

找到    --JvmMs 128 ^    --JvmMx 256  根据电脑配置可以把这两个参数设置大一些

 

if "%JvmMs%" == "" set JvmMs=128
if "%JvmMx%" == "" set JvmMx=256

 

 

 

3、 如果要在myeclipse中启动tomcat,上述的修改就不起作用了,可如下设置:

Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK面板中的

Optional Java VM arguments中添加:-Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m

 

三、jvm参数说明:

 

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

 


-XX:PermSize:设定内存的永久保存区初始大小,缺省值为64M。(我用visualvm.exe查看的)

-XX:MaxPermSize:设定内存的永久保存区最大 大小,缺省值为64M。(我用visualvm.exe查看的)

 

-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大小,“-Xss 15120” 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.

-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】

查看tomcat内存使用情况

地址:http://ip:port/manager/status

整 文件:~/bin/catalina.sh

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=512m -XX:MaxPermSize=512m"

 

重启,再看,噢啦,512M足够excel导入20万级别的造了。顺利完成

 

 

ps端口查看界面需要配置一些用户:

tomcat7配置管理员信息

 

1:打开tomcat7下的~/conf/tomcat-users.xml文件,关于用户角色、管理员的信息都在这个配置文件中。

 

2:在配置文件<tomcat-users>节点下添加如下xml

<role rolename="admin-gui"/> 

<role rolename="manager-gui"/>

<user username="admin" password="admin" roles=" admin-gui , manager-gui "/>

 

Java 中各种内存溢出的问题剖析 在Java开发领域,内存溢出(OutOfMemory,简称OOM)犹如一颗隐藏的“定时炸弹”,随时可能让程序崩溃,给用户带来糟糕的体验。今天,就让我们深入探究Java中各类内存溢出问题,了解其根源、排查方法以及有效的修改策略。 阅读详情

相关推荐

【详解】java开发中内存溢出的排查与解决

监控与发现:设置合适的监控和告警,及时发现问题分析与定位:使用专业工具分析堆转储和GC日志,定位根本原因解决与优化:针对不同类型的内存问题采取相应措施预防与改进:建立最佳实践,从代码和架构层面预防内存问题通过合理的内存管理和及时的问题排查,可以有效避免和解决Java应用中的内存溢出问题,保证系统的稳定性和可靠性。

qu1210的博客 1767

Java内存溢出问题深入探究及其解决策略

在我们的示例中,解决这个问题的方法是及时释放不再使用的对象。:如果内存溢出是由于过多的并发导致的,那么我们可能需要优化线程池配置,或者限制线程的数量。总的来说,解决内存溢出问题需要我们从多个维度出发,包括优化代码,合理配置JVM参数,使用适当的工具进行诊断和调试,以及理解并发对内存的影响。这时,我们可以使用内存分析工具,如MAT,VisualVM等,这些工具可以帮助我们找到内存使用的热点,从而定位到可能的内存泄漏源头。如果内存溢出是由于大量的线程并发导致的,可能需要优化线程池的配置,或者限制线程的数量。

沐雨风栉 6891

Java中的内存溢出异常(OutOfMemoryError)的出现场景及解决方法

除了上述场景外,还可能出现其他导致内存溢出的情况,例如大对象占用过多堆内存、过多的线程占用过多栈内存等。因此,在编写Java应用程序时,应当合理管理内存使用,及时释放不再使用的资源,避免内存溢出异常的发生。本文将介绍一些常见的导致内存溢出异常的场景,并提供相应的源代码示例,同时探讨一些解决方法。由于没有终止条件,递归调用会导致栈内存不断增长,最终抛出StackOverflowError异常(它是Error的子类,但也表示内存溢出)。在上面的示例中,我们动态生成了大量的类,并尝试加载它们。

CdiBug的博客 435

设置 Tomcat 的JVM运行内存

情况一:Tomcat注册成系统服务,如何修改JVM运行内存? WINDOW 64位 , cmd打开注册表(regedit) HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\Tomcat6\Parameters\Java(路径可能有一点点差别)中的Options。 设置JvmMs(

我能坚持多久的专栏 1万+

基于知识图谱的电影推荐系统——Neo4j&Python

也可直接从这里下载:链接: https://pan.baidu.com/s/1l6wjwcUzy5G_dIlVDbCkpw 提取码: pkq6。修改main.py中的driver,输入自己数据库的用户名与密码。系统会询问是否需要重新加载并创建知识图谱,在第一次时输入1。

weixin_46351593的博客 6356

告别外置电阻!揭秘MAX22201集成电流检测的5大设计优势(附PCB布局案例)

本文深入解析MAX22201集成电流检测技术在直流有刷电机驱动中的5大设计优势,包括BOM成本降低、PCB空间优化、动态性能提升等。通过与传统方案(如DRV8871+外置电阻)的实测对比,展示其在高精度电流检测、抗干扰能力和PCB布局简化方面的突破,并附有详细的PCB布局案例和配置指南。

weixin_29189377的博客 243

Java中的内存溢出详解

Java内存溢出是Java开发中最常见、最棘手的问题之一。本文基于Java 8,从JVM内存模型入手,全面剖析Java中各种类型的内存溢出现象,涵盖堆、栈、方法区、直接内存等多个方面,提供大量实战代码示例与排查技巧,并结合常用分析工具深入讲解诊断与优化方法,帮助读者掌握内存管理实战能力,避免线上故障。

持续输出Java相关知识 711

避开集成插件!手把手教你用URL登录实现Finereport与致远OA的无缝跳转

本文详细介绍了如何通过URL登录机制实现Finereport与致远OA的无缝跳转,无需复杂插件配置。文章涵盖用户体系同步、环境配置、URL登录核心设置及安全加固方案,特别适合企业数字化转型中BI工具与OA系统的轻量化集成需求。

weixin_29215815的博客 75

linux java内存溢出_Java内存溢出详解

Java内存溢出详解一、常见的Java内存溢出有以下三种:1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出JVM在启动的时候会自动设置JVM Heap的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)不可超过物理内存。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap的大小...

weixin_42181686的博客 906

SystemVerilog学习总结

因为选择的offer是IC验证,以前学的是设计,所以只能再学systemverilog(SV)和UVM了。在学习SV和UVM之前,我认为需要学习以下几个部分:数字电路、c++和verilog。因为IC验证确实有不少别的专业之前没学过数字电路和Verilog,所以还是最好先学习一下。 知识点的总结主要是通过systemverilog验证-测试平台编写指南这本书进行的,所以请看书。通过对这本书的目录进行重点的划分,然后再进行相关知识点的总结。最后,给出自己收集的别的博主IC EDA环境的虚拟机,以及使用虚拟机需

博主毕竟还是人,肯定会有错误,各位看的时候发现错误提出来就好 1万+

保姆级教程:用GMT6.1绘制专业地形起伏图(从数据下载到出图避坑)

本文提供了一份详细的GMT6.1绘制地形起伏图的保姆级教程,从环境搭建到数据下载,再到核心绘图命令解析,帮助用户避开常见错误。特别适合科研人员和地理信息爱好者快速掌握专业地形图的绘制技巧,提升工作效率。

weixin_42549723的博客 278

Java内存溢出:详解原因、排查步骤与解决方案

线上服务突然崩溃,日志里满屏刷着—— 这是 Java 开发中让人头疼的 “内存溢出” 问题。比如电商平台大促时,订单系统因内存溢出宕机,可能导致订单丢失;后台数据分析服务溢出,会造成数据计算中断。它不像语法错误能直接定位,往往隐藏在业务逻辑或资源配置中,小则影响单一功能,大则引发全站服务瘫痪,因此搞懂它的原理和解决方法,是 Java 开发者的必备技能。

u010843275的博客 1916

huggingface使用git上传model或者Dataset到HF,当然也可以上传代码,以及大文件,很哇塞!!!

huggingface使用git上传model或者Dataset到HF,当然也可以上传代码,以及大文件,很哇塞!!! 第一次使用时,需要使用设置系统全局的huggingface token,这。点击huggingface首页右上角的头像 → settings → access tokens,创建一个write权限的token,名字可以随便取。

拥抱具身智能,昇腾Ascend C 3105
上一篇: window.print() 实现A4纸张打印及去掉页眉页脚及打印链接
下一篇: Centos 7 top命令
fmwind
博客等级 码龄24年 147粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值