JAVA HEAP SPACE解决方法和JVM参数设置

这篇具有很好参考价值的文章主要介绍了JAVA HEAP SPACE解决方法和JVM参数设置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JAVA HEAP SPACE解决方法和JVM参数设置

  • JAVA HEAP SPACE解决方法和JVM参数设置
    • 原因分析
    • 设置
    • 异常分析
    • Java堆的管理—垃圾回收提到一下几点,很不错,或许可以作为写程序时候的准则:
    • jvm 内存查看与分析工具

JAVA HEAP SPACE解决方法和JVM参数设置

在JVM中如果98%的时间是用于GC(Garbage Collection)且可用的 Heap size 不足2%的时候将抛出异常信息,java.lang.OutOfMemoryError: Java heap space。
所以产生这个异样的原因通常有两种:
1.程序中出现了死循环
2.程序占用内存太多,超过了JVM堆设置的最大值。

原因分析

第二种情况,我们手工扩大JVM堆的参数设置。JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置。在JVM启动时,JVM堆会自动设置heap size值。通常情况下,初始空间(即-Xms)默认值是物理内存的1/64,最大空间是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。这里对各个参数的意义解释一下:
-Xms:初始值
-Xmx:最大值
-Xmn:最小值

Heap
Size的设置不宜太小,也不宜太大。若设置太小程序的响应速度会变慢了,因为GC占用了更多的时间,而应用分配到的执行时间较少。太大也会造成空间的浪费,而且也会影响其他程序的正常运行。Heap
Size 最大最好不要超过可用物理内存的80%。建议将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。

设置的方法主要有以下几个:

  1. 就是在执行JAVA类文件时加上这个参数,其中className是需要执行的确类名。(包括包名)如:java -Xms32m -Xmx800m className 这个不仅解决问题了,而且执行的速度比没有设置的时候快很多。

  2. 可以在windows更改系统环境变量加上JAVA_OPTS=-Xms64m -Xmx512m。

  3. 如果用的tomcat,在windows下,可以在C: omcat5.5.9incatalina.bat(具体路径根据自己tomcat的位置而定) 中加上:set JAVA_OPTS=-Xms64m -Xmx256m (大小依自己内存而定)位置在: rem Guess CATALINA_HOME if not defined 这行的下面加合适.

  4. 如果是linux系统Linux 在{tomcat_home}/bin/catalina.sh的前面,加 set JAVA_OPTS=’-Xms64 -Xmx512’

设置

1、设置环境变量
set JAVA_OPTS= -Xms32m -Xmx512m
可以根据自己机器的内存进行更改,但本人测试这种方法并没有解决问题。可能是还有哪里需要设置。
2、 java -Xms32m -Xmx800m className
就是在执行JAVA类文件时加上这个参数,其中className是需要执行的确类名。(包括包名)
这个解决问题了。而且执行的速度比没有设置的时候快很多。

异常分析

使用Java程序从数据库中查询大量的数据时出现异常:
java.lang.OutOfMemoryError: Java heap space

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

JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.

JVM在启动的时候会自动设置Heap
size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms
-Xmx等选项可进行设置。 例如:java -jar -Xmn16m -Xms64m -Xmx128m MyApp.jar

如果Heap Size设置偏小,除了这些异常信息外,还会发现程序的响应速度变慢了。GC占用了更多的时间,而应用分配到的执行时间较少。

Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。

Heap size的 -Xms -Xmn 设置不要超出物理内存的大小。否则会提示“Error occurred during initialization of VM Could not reserve enough space for object
heap”。

Java堆的管理—垃圾回收提到一下几点,很不错,或许可以作为写程序时候的准则:

(1)不要试图去假定垃圾收集发生的时间,这一切都是未知的。比如,方法中的一个临时对象在方法调用完毕后就变成了无用对象,这个时候它的内存 就可以被释放。

(2)Java中提供了一些和垃圾收集打交道的类,而且提供了一种强行执行垃圾收集的方法–调用System.gc(),但这同样是个不确定 的方法。Java 中并不保证每次调用该方法就一定能够启动垃圾收集,它只不过会向JVM发出这样一个申请,到底是否真正执行垃圾收集,一切都是个未知数。

(3)挑选适合自己的垃圾收集器。一般来说,如果系统没有特殊和苛刻的性能要求,可以采用JVM的缺省选项。否则可以考虑使用有针对性的垃圾收 集器,比如增量收集器就比较适合实时性要求较高的系统之中。系统具有较高的配置,有比较多的闲置资源,可以考虑使用并行标记/清除收集器。

(4)关键的也是难把握的问题是内存泄漏。良好的编程习惯和严谨的编程态度永远是最重要的,不要让自己的一个小错误导致内存出现大漏洞。

(5)尽早释放无用对象的引用。

jvm 内存查看与分析工具

1:gc日志输出

在jvm启动参数中加入

-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimestamps
-XX:+PrintGCApplicationStopedTime

jvm将会按照这些参数顺序输出gc概要信息,详细信息,gc时间信息,gc造成 的应用暂停时间。如果在刚才的参数后面加入参数 -Xloggc:文件路径,gc信息将会输出到指定的文件中。其他参数还有
-verbose:gc和-XX:+PrintTenuringDistribution等。

2:jconsole

jconsole是jdk自带的一个内存分析工具,它提供了图形界面。可以查看到被监控的jvm的内存信息,线程信息,类加载信息,MBean信息。

jconsole位于jdk目录下的bin目录,在windows下是jconsole.exe,在unix和linux下是
jconsole.sh,jconsole可以监控本地应用,也可以监控远程应用。

要监控本地应用,执行jconsole pid,pid就是运行的java进程id,如果不带上pid参数,则执行jconsole命令后,会看到一个对话框弹出,上面列出了本地的java进 程,可以选择一个进行监控。如果要远程监控,则要在远程服务器的jvm参数里加入一些东西,因为jconsole的远程监控基于jmx的,关于 jconsole详细用法,请见专门介绍jconsle的文章,我也会在博客里专门详细介绍jconsole。文章来源地址https://www.toymoban.com/news/detail-463424.html

到了这里,关于JAVA HEAP SPACE解决方法和JVM参数设置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • DBeaver导数据抛错 Java heap space

    DBeaver导数据抛错 Java heap space

    从表中导出数据时报错: 原因: DBeaver内存设置过小,需要调整 找到配置文件:安装目录-dbeaver.init Xms为最小内存,默认 64M Xmx为最大内存,默认 1024M,调大此值即可,如10240M

    2024年02月05日
    浏览(11)
  • Java内存溢出(outofmemory:Java heap space)更改堆大小

    Java内存溢出(outofmemory:Java heap space)更改堆大小

    在跑一个项目的时候需要构建大量对象,导致出现内存溢出错误。去网上查需要修改堆大小,于是按照网上80%的方法修改了配置,结果依然内存溢出。于是,开启了半天的刨根问底之旅。 首先是按照网上说的方法,打开idea在上方找到help,然后点击edit custom vm options, 然后就

    2024年02月12日
    浏览(9)
  • es内存溢出启动报错java.lang.OutOfMemoryError: Java heap space

    es内存溢出启动报错java.lang.OutOfMemoryError: Java heap space

    问题: es容器自己停止,重启之后启动失败,报错如下: 原因: 容器中es由于数据量过大,超过了elasticsearch进程的最大内存量,elasticsearch 会将启动脚本中的JAVA_OPTS 选项传递给 JVM 来启动elasticsearch. 其中最重要的一个参数是 -Xmx ,此参数用于控制系统分配给elasticsearch 进程的

    2023年04月14日
    浏览(13)
  • kafka消费报错卡死:内存溢出OutOfMemoryError: Java heap space

    我们信控平台使用 Java 语言开发, Spring Cloud 微服务架构,采用容器化部署,所有服务都部署在 docker 里面,使用 docker-compose 进行管理,使用 portainer 进行监控 平台部署客户现场后,一切功能正常,客户已经使用三个月左右。最后一次更新时一个月前,代码版本也比较新 客户

    2024年02月15日
    浏览(12)
  • 使用jmeter做性能测试时遇到java.lang.OutOfMemoryError: Java heap space. 提示怎么办

    使用jmeter做性能测试时遇到java.lang.OutOfMemoryError: Java heap space. 提示怎么办

    使用jmeter做性能测试遇到java.lang.OutOfMemoryError: Java heap space.时是jvm的问题,需要调大jvm的内存,windows压力机通过编辑bin文件下的jmeter.bat文件来修改jvm的内存大小。在jmeter.bat文件的编辑状态下查询if not defined HEAP可快速查找到需要修改的位置。 修改前为默认大小: 修改后(根

    2024年02月16日
    浏览(13)
  • 接口报错原因分析:handler dispatch failed;nested exceptionis java.lang.outofMemoryError:JAVA heap space

    java.lang.OutOfMemoryError: Java heap space  解决方法 这个问题的根源是jvm虚拟机的默认Heap大小是64M,可以通过设置其最大和最小值来实现.设置的方法主要是几个. 加上 JAVA_OPTS=-Xms64m -Xmx512m Linux 在{tomcat_home}/bin/catalina.sh的前面,加

    2024年02月08日
    浏览(12)
  • 【JVM】JVM堆内存(heap)详解

    【JVM】JVM堆内存(heap)详解

    JAVA堆内存管理是影响性能主要因素之一。 堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的。 先看下JAVA堆内存是如何划分的,如图: JVM内存划分为堆内存和非堆内存,堆内存分为年轻代(Young Generation)、老年代(Old Generatio

    2024年02月09日
    浏览(12)
  • Error occurred during initialization of VM Could not reserve enough space for 2097152KB object heap

    Error occurred during initialization of VM Could not reserve enough space for 2097152KB object heap

    在启动elasticsearch.bat时会直接闪退,大概率是因为内存分配不足导致直接打不开elasticsearch。 于是我直接在终端运行,想看问题出在哪,此时报错如题所示 找到elasticsearch文件夹下config子文件夹,打开找到 jvm.options ,对内存分配进行调整 使用记事本或者Notepad++打开,如图: 这

    2024年02月07日
    浏览(12)
  • 【jvm系列-13】jvm性能调优篇---参数设置以及日志分析

    【jvm系列-13】jvm性能调优篇---参数设置以及日志分析

    JVM系列整体栏目 内容 链接地址 【一】初识虚拟机与java虚拟机 https://blog.csdn.net/zhenghuishengq/article/details/129544460 【二】jvm的类加载子系统以及jclasslib的基本使用 https://blog.csdn.net/zhenghuishengq/article/details/129610963 【三】运行时私有区域之虚拟机栈、程序计数器、本地方法栈 https

    2024年02月06日
    浏览(19)
  • java八股文面试[JVM]——JVM参数

    java八股文面试[JVM]——JVM参数

    参考:JVM学习笔记(一)_卷心菜不卷Iris的博客-CSDN博客 jdk1.7: jdk1.8: 面试题 :给定-Xms Xmx -Xmn 问 最大的eden区域是多少M。 常用JVM参数 怎么对jvm进行调优?通过 参数配置 参数 备注 -Xms 初始堆大小。只要启动,就占用的堆大小,默认是内存的1/64 -Xmx 最大堆大小。默认是内存

    2024年02月11日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包