Java堆内存Heap与非堆内存Non-Heap概要


     JAVA虚拟机内存结构分为以下5部分:程序计数器,虚拟机栈,本地方法栈,方法区,堆。具体可查看上一篇文章JAVA虚拟机内存分配概要。而又可以粗略分为堆内存和非堆内存。一般程序员最关心的也是堆内存。也是最容易造成内存泄漏的一部分内存,也是jvm垃圾回收时主要操作的内存空间。堆内存又可以分为新生代、年老代、永久代,具体垃圾回收机制查看另一篇文章Java虚拟机:Java垃圾回收(GC)机制详解


堆(Heap)和非堆(Non-heap)内存 
    按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给 自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法 的代码都在非堆内存中。 

堆内存分配 
    JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指 定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。 

非堆内存分配 
    JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。 
JVM内存限制(最大值) 
    首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然 可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统 下为2G-3G),而64bit以上的处理器就不会有限制了。

程序运行时可以通过jconsole查看堆内存和非堆内存运行情况


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当你遇到`java.lang.OutOfMemoryError: Java heap space`错误时,意味着你的Java堆内存不足以支持程序的运行。要排查使用堆内存最多的部分,你可以按照以下步骤进行: 1. 使用堆内存分析工具:使用一些堆内存分析工具,比如Eclipse Memory Analyzer(MAT)或Java VisualVM等,可以帮助你分析程序在运行时的堆内存使用情况。这些工具可以显示内存快照和对引用关系,帮助你找出占用大量堆内存的对和代码。 2. 检查内存泄漏:内存泄漏是指无用对仍然被保留在内存中,导致内存占用不断增加。使用堆内存分析工具可以帮助你检查是否存在内存泄漏问题。查看内存快照中的对引用关系,找出无用对并分析它们的引用路径,判断是否有对被意外保留。 3. 检查大对:大对是指占用大量堆内存空间的对。使用堆内存分析工具可以查看对的大小,识别占用最多内存的大对。检查这些大对是否能够进行优化或重构,减少其对堆内存的需求。 4. 检查集合和缓存:集合和缓存是常见的内存消耗点。检查你的代码中使用的集合和缓存对,确保它们被正确地清理或释放。避免在集合中存储大量数据或长时间保留不必要的缓存。 5. 调整堆内存大小:如果经过以上步骤检查后还是无法解决问题,你可以尝试调整Java堆内存的大小。通过修改JVM启动参数中的-Xmx和-Xms参数来增加或减少堆内存的分配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值