首页 > 编程语言 >java heap space解决方法

java heap space解决方法

时间:2023-08-08 16:34:37浏览次数:47  
标签:java JVM space heap 内存 设置 Xmx Heap

在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 这个不仅解决问题了,而且执行的速度比没有设置的时候快很多。如果是开发测试,也可以再eclipse中直接设置。Eclipse ->run -arguments 中的VM arguments 中输入-Xms32m -Xmx800m这个参数就可以了。
  • 2.可以在windows更改系统环境变量加上JAVA_OPTS=-Xms64m -Xmx512m。
  • 3.如果用的tomcat,在windows下,可以在C:\tomcat5.5.9\bin\catalina.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’

因为程序要从数据读取近10W行记录处理,当读到9W的时候就出现 java.lang.OutOfMemoryError: Java heap space 这样的错误。
在网上一查可能是JAVA的堆栈设置太小的原因。

跟据网上的答案大致有这两种解决方法:

1、设置环境变量
set JAVA_OPTS= -Xms32m -Xmx512m
可以根据自己机器的内存进行更改,但本人测试这种方法并没有解决问题。可能是还有哪里需要设置。

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

如果在测试的时候可能会用Eclispe 这时候就需要在Eclipse ->run -arguments 中的VM arguments 中输入-Xms32m -Xmx800m这个参数就可以了。

java.lang.OutOfMemoryError: Java heap space

使用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”。

经过一个晚上的努力终于完成了一个文件替换指定字符串的程序,但是由于我要替换的全站程序html文件太多,所以eclipse下边老是在一个目录结束后 报出java.lang.OutOfMemoryError: Java heap space的异常,然后就崩溃了。

我一想肯定是频繁操作造成来不及回收,于是在每个循环之后加上一个Thread.sleep(1000),发现还是到那个目录下就死掉,于是把 1000改成5000,还是到那里死掉,我想可能不是来不及回收这么简单,或许sun 的JVM里边刚好对于这种情况不释放也有可能。
接着我又把启动的参数添上一个 -Xmx256M,这回就可以了。

标签:java,JVM,space,heap,内存,设置,Xmx,Heap
From: https://blog.51cto.com/u_16207997/7010096

相关文章

  • asterisk-java的测试使用
    asterisk-java的测试使用一个可用于FreePBX的封装库asterisk-java用于asteriskPBX集成的免费Java库。https://github.com/asterisk-java/asterisk-java最新版本为3.39.0<dependency><groupId>org.asteriskjava</groupId><artifactId>asterisk-java</artifactId><......
  • Java入门题-查找一个字符串中,所有想查找短字符串的起始位置
    问题:就是长短两串字符串,从长字符串中查找所有短字符串在长字符串中的位置方法:用截取方式来规避已经查找过的内容,重复遍历来确定位置代码:需要引用importjava.util.Scanner; Scanners=newScanner(System.in);//新定义一个ScannerStringS=s.next();......
  • JAVA 问题记录
     OOM(内存溢出) 先查看java进程pidjps使用jmp把内存导出查看那些对象内存占用比较高jmp-histo<pid>>/histo.txt在可以看堆内存使用情况jmp-heap<pid>>/heap.txt ......
  • 安装好了Java、Neo4j社区版3.5.5,和二者的环境变量后,如何浏览器登录Neo4j
    前提:安装好了Java、Neo4j社区版3.5.5,和二者的环境变量后。Win+R->cmd进入输入neo4j.batconsole回车正常情况下是这样: 不正常情况下是这样:解决办法:输入下图的两句但是记住:neo4jstart一次就要neo4jstop一次,不然会给如下报错:记得neo4jstop就行了 最后......
  • Java 11 新特性
    Java11新特性Java11是Java8之后的第一个长期支持版本(longtermsuppoertLTS),Oracle将在2019年1月停止支持Java8.OracleVSOpenJDKJava10是最后一个免许可商用版本,如果不需要Oracle商业支持的话,可以选择OpenJDK直接运行java文件Java11之前需要先用......
  • 基于Java开发的智慧EHR人力系统(源码获取)
    一、项目介绍一款全源码可二开,可基于云部署、私有部署的企业级数字化人力资源管理系统,涵盖了招聘、人事、考勤、绩效、社保、酬薪六大模块,解决了从人事招聘到酬薪计算的全周期人力资源管理,符合当下大中小型企业组织架构管理运作模式,助力企业人力资源管控信息化、智能化、规范化,......
  • Java开发需要掌握哪些技术?
    Java开发需要掌握哪些技术? 想要找到一份不错的Java开发工作,首先需要掌握一定的Java技术。那么想成为一名合格的Java开发工程师都有哪些技术是必须掌握的呢?零基础开始学习Java开发主要需要学习四个方面的内容,分别为:JavaEE基础、JavaWeb开发、Java高级框架、大型微服务分布式项目......
  • Java内存解析(转)
    栈、堆、常量池等虽同属Java内存分配时操作的区域,但其适用范围和功用却大不相同。本文将深入Java核心,简单讲解Java内存分配方面的知识。首先我们先来讲解一下内存中的各个区域。 stack(栈):存放基本类型的数据和对象的引用,即存放变量。如果存放的事基本类型的数据(非静态变量),则直接......
  • java多线程 sleep()和wait()的区别
    java多线程sleep()和wait()的区别作者:octobershiner(2篇文章)日期:十二月16,2011在11:58上午接触了一些多线程的东西,还是从java入手吧。相信看这篇文章的朋友都已经知道进程和线程的区别,也都知道了为什么要使用多线程了。这两个方法主要来源是,sleep用于线程控制,而w......
  • java 线程池
    博客分类:JavaJava工作thread活动JDK线程池的作用:    线程池作用就是限制系统中执行线程的数量。    根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队......