当Java程序开始运行时,JVM会从操作系统获取一些内存。JVM使用这些内存,这些内存的一部分就是堆内存。堆内存通常在存储地址的底层,向上排列。当一个对象通过new关键字或通过其他方式创建后,对象从堆中获得内存。当对象不再使用了,被当做垃圾回收掉后,这些内存又重新回到堆内存中。

在大多数32位机、Sun的JVM上,Java的堆空间默认的大小为128MB,但也有例外,例如在32未Solaris操作系统(SPARC平台版本)上,默认的最大堆空间和起始堆空间大小为 -Xms=3670K 和 -Xmx=64M。对于64位操作系统,一般堆空间大小增加约30%。但你使用Java 1.5的throughput垃圾回收器,默认最大的堆大小为物理内存的四分之一,而起始堆大小为物理内存的十六分之一。要想知道默认的堆大小的方法,可以用默认的设置参数打开一个程序,使用JConsole(JDK 1.5之后都支持)来查看,在VM Summary页面可以看到最大的堆大小。

用这种方法你可以根据你的程序的需要来改变堆内存大小,我强烈建议采用这种方法而不是默认值。如果你的程序很大,有很多对象需要被创建的话,你可以用-Xms and -Xmx这两个参数来改变堆内存的大小。Xms表示起始的堆内存大小,Xmx表示最大的堆内存的大小。另外有一个参数 -Xmn,它表示new generation(后面会提到)的大小。有一件事你需要注意,你不能任意改变堆内存的大小,你只能在启动JVM时设定它。

我们知道对象创建在堆内存中,垃圾回收这样一个进程,它将已死对象清除出堆空间,并将这些内存再还给堆。为了给垃圾回收器使用,堆主要分成三个区域,分别叫作New Generation,Old Generation或叫Tenured Generation,以及Perm space。New Generation是用来存放新建的对象的空间,在对象新建的时候被使用。如果长时间还使用的话,它们会被垃圾回收器移动到Old Generation(或叫Tenured Generation)。Perm space是JVM存放Meta数据的地方,例如类,方法,字符串池和类级别的详细信息。你可以查看“Java中垃圾回收的工作原理”来获得更多关于堆和垃圾回收的信息。

当JVM启动时,使用了-Xms 参数设置的对内存。当程序继续进行,创建更多对象,JVM开始扩大堆内存以容纳更多对象。JVM也会使用垃圾回收器来回收内存。当快达到-Xmx设置的最大堆内存时,如果没有更多的内存可被分配给新对象的话,JVM就会抛出java.lang.outofmemoryerror,你的程序就会当掉。在抛出 OutOfMemoryError之前,JVM会尝试着用垃圾回收器来释放足够的空间,但是发现仍旧没有足够的空间时,就会抛出这个错误。为了解决这个问题,你需要清楚你的程序对象的信息,例如,你创建了哪些对象,哪些对象占用了多少空间等等。你可以使用profiler或者堆分析器来处理 OutOfMemoryError错误。”java.lang.OutOfMemoryError: Java heap space”表示堆没有足够的空间了,不能继续扩大了。”java.lang.OutOfMemoryError: PermGen space”表示permanent generation已经装满了,你的程序不能再装在类或者再分配一个字符串了。

Java堆内存(heap memory)的十个要点:

1. Java堆内存是操作系统分配给JVM的内存的一部分。

2. 当我们创建对象时,它们存储在Java堆内存中。

3. 为了便于垃圾回收,Java堆空间分成三个区域,分别叫作New Generation, Old Generation或叫作Tenured Generation,还有Perm Space。

4. 你可以通过用JVM的命令行选项 -Xms, -Xmx, -Xmn来调整Java堆空间的大小。不要忘了在大小后面加上”M”或者”G”来表示单位。举个例子,你可以用 -Xmx256m来设置堆内存最大的大小为256MB。

5. 你可以用JConsole或者 Runtime.maxMemory(), Runtime.totalMemory(), Runtime.freeMemory()来查看Java中堆内存的大小。

6. 你可以使用命令“jmap”来获得heap dump,用“jhat”来分析heap dump。

7. Java堆空间不同于栈空间,栈空间是用来储存调用栈和局部变量的。

8. Java垃圾回收器是用来将死掉的对象(不再使用的对象)所占用的内存回收回来,再释放到Java堆空间中。

9. 当你遇到java.lang.outOfMemoryError时,不要紧张,有时候仅仅增加堆空间就可以了,但如果经常出现的话,就要看看Java程序中是不是存在内存泄露了。

10. 请使用Profiler和Heap dump分析工具来查看Java堆空间,可以查看给每个对象分配了多少内存。

java堆空间(内存)相关推荐

  1. 12.JDK1.8 JVM运行时数据区域概览、各区域介绍、程序计数器、Java虚拟机栈、本地方法栈、堆、堆空间内存分配(默认情况下)、字符串常量池、元数据区、jvm参数配置

    12.JDK1.8 JVM运行时数据区域概览 12.1.JDK1.8 JVM运行时数据区域概览 12.2.各区域介绍 12.3.各区域介绍 12.3.1.程序计数器 12.3.2.Java虚拟机栈 1 ...

  2. Java堆空间,本机堆和内存问题

    最近,我在和一个朋友讨论为什么Java进程使用的内存比启动Java进程时设置的最大堆多. 代码创建的所有Java对象都是在Java堆空间内创建的,其大小由-Xmx选项定义. 但是一个Java进程由很多 ...

  3. java 读取excel2007 内存不足_内存不足错误 – 写入Excel时的Java堆空间

    我有近100,000条记录的数据,我正在尝试使用XSSFWorkbook通过 Java代码将数据写入.xlsx文件.我能够将数据库中的所有数据提取到ArrayList.通过迭代ArryList,我将数 ...

  4. 浅谈Java堆内内存、堆外内存、直接内存、用户空间和内核空间

    我们都知道Java中大多数的对象都存在于堆内存中,那什么是堆外内存.直接内存?它们又分别用来做什么?分布在用户空间还是内核空间? 首先,有个前置知识点,所谓的Java程序,其实可以理解为是用C/C++ ...

  5. qotd服务_QOTD:Java线程与Java堆空间

    qotd服务 以下问题很常见,并且与OutOfMemoryError有关:在JVM线程创建过程和JVM线程容量期间无法创建新的本机线程问题. 这也是我向新技术候选人(高级职位)提出的典型面试问题. 我 ...

  6. QOTD:Java线程与Java堆空间

    以下问题很常见,并且与OutOfMemoryError有关:在JVM线程创建过程和JVM线程容量期间无法创建新的本机线程问题. 这也是我向新技术候选人(高级职位)提出的典型面试问题. 我建议您在查看答 ...

  7. OutOfMemoryError:Java堆空间–分析和解决方法

    java.lang.OutOfMemoryError:Java堆问题是在支持或开发复杂的Java EE应用程序时可能会遇到的最复杂的问题之一. 这篇简短的文章将为您提供此JVM HotSpot Out ...

  8. Java堆空间– JRockit和IBM VM

    本文将为您提供JRockit Java堆空间与HotSpot VM的概述. 它还将为您提供有关JRockit和HotSpot的Oracle未来计划的一些背景知识. Oracle JRockit VM ...

  9. Cassandra Java堆外内存排查经历全记录

    背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测.压测时候比较容易触发OOM Killer,把cassandra进程干掉.问题是8G这个规格我配置的heap(Xmx ...

最新文章

  1. 在ubuntu 14.04 64bit上安装酷我音乐盒Linux客户端kwplayer
  2. 第九章 神经网络学习-机器学习老师板书-斯坦福吴恩达教授
  3. 4、连接Mysql数据库
  4. powerbi visualization
  5. php版本哪个没有面向对象,php面向对象的方法重载两种版本比较
  6. qt2-无边框窗口创建、拖拽、阴影
  7. 事务超时时间无效_Java面试题:Spring事务面试考点的集合整理。建议收藏阅读...
  8. 什么是AWT_Swing_Vector?居然这么高频使用
  9. linux GSM0710(2)
  10. iOS 菜鸟钻研动态特性——动态类型、绑定、加载
  11. 使用Andriod Device Moniter时用正则表达式筛选指定日志
  12. bit feild and CPU endian 位域和大小端
  13. Linux dirname 命令
  14. iphone计算机历史信息,“领先业界5年!” 苹果iPhone历史回顾
  15. .NET内存性能分析宝典
  16. 用户注册增强:用户登录时显示进度条
  17. Adobe DMP的一些设计
  18. 温度传感芯片助力智慧农业领域的应用
  19. Tasklist命令详解
  20. 作为360老员工,谈谈和周鸿祎的接触和印象

热门文章

  1. 利用sklearn库决策树模型对iris数据多分类并进行评估
  2. ablation experiments
  3. 《健康地奋斗着——程序员自己的养生书》作者:中医程序猿
  4. Linux中配置Aria2 RPC Server
  5. 录音文件下载_录音转文字app有哪些?录音转文字助手怎么样?
  6. 晶体管分类、符号及作用
  7. 网络面经总结-仅供参考
  8. 停用 微软上载服务器,如何完全禁用 Office上载中心
  9. EasyExcel专题(一) Excel 读取、写入、上传和下载
  10. 18届大专实习生2020总结