首页
学习
活动
专区
圈层
工具
发布

《深入理解Java虚拟机》读书笔记(三)

实战:OutOfMemoryError异常 图片 Java堆溢出 Java堆用于存储对象实例,只要不断的创建对象并且保证GC Roots到对象之间有可达路径来避免垃圾回收,就可以触发Java堆的内存溢出异常...控制Java堆的扩展容量可以通过参数-Xms和-Xmx来设置,为更方便的获取到内存溢出时的内存快照数据可以使用参数-XX:+HeapDumpOnOutOfMemoryError 代码示例 import...java.util.ArrayList; import java.util.List; /** * Java堆内存溢出异常测试 * {@link 《深入理解Java虚拟机》第三版 代码清单2-3...虚拟机规范中,对虚拟机栈和本地方法栈描述了两种异常,同时允许Java虚拟机实现自行选择是否支持栈的动态扩展 当线程请求的栈深度大于虚拟机所允许的深度时,将抛出StackOverflowError异常 当虚拟机栈扩展时无法申请到足够内存时会抛出...intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {

66330

java.lang.OutOfMemoryError: Java heap space错误及处理办法(收集整理、转)

下面是从网上找到的关于堆空间溢出的错误解决的方法: java.lang.OutOfMemoryError: Java heap space =============================...JVM堆的设置是指java程序执行过程中JVM能够调配使用的内存空间的设置....JVM堆的设置是指java程序执行过程中JVM能够调配使用的内存空间的设置.JVM在启动的时候会自己主动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的...JVM堆的设置是指java程序执行过程中JVM能够调配使用的内存空间的设置.JVM在启动的时候会自己主动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的...假设程序中仅仅用到了此Bean的id和name字段,那么从数据库中仅仅用读此两字段,而不是读取整个bean以及关联的Bean。

7.7K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JVM笔记-运行时内存区域划分

    2.4 Java 堆 对多数应用来说,Java 堆(Java Heap)是 JVM 管理的内存中最大的一块。 唯一目的:存放对象实例(【几乎所有】的对象实例都在这里分配内存)。...将 Java 堆细分的目的只是为了更好地回收内存,或者更快地分配内存。...JDK 1.7 中,将 1.6 中永久代的字符串常量池和静态变量等移到了堆中,如下(虚线框表示已移除): ?...而到了 JDK 1.8,则完全废弃了"永久代",改用了在本地内存中实现的"元空间(Metaspace)",将 JDK 1.7 中永久代剩余的部分(主要是类型信息)移到了元空间,如下(虚线框表示已移除):...PS: 一些虚拟机参数 # 设置堆空间大小 -Xms20m -Xmx20m # 设置虚拟机栈空间大小 -Xss160K # 设置永久代大小 -XX:PermSize=10m -XX:MaxPermSize

    1.2K20

    面试被问:OOM类型有哪些?怎么答?

    以下是常见的 OOM 类型及其产生原因:1. java.lang.OutOfMemoryError: Java heap space触发原因:堆内存(存放对象实例)不足,无法分配新对象。...示例:// 不断向集合中添加对象导致堆溢出ListObject> list = new ArrayList();while (true) { list.add(new Object());}...2. java.lang.OutOfMemoryError: Metaspace(Java 8+)或 PermGen space(Java 7-)触发原因:元空间(Metaspace)或永久代(PermGen...7. java.lang.OutOfMemoryError: CodeCache(JIT 编译代码缓存溢出)触发原因:JIT 编译器生成的本地代码占满代码缓存区。...总结OOM 的根本原因是 JVM 内存区域不足 或 资源耗尽,需结合错误类型分析具体内存区域(堆、元空间、直接内存等)。排查时可通过以下步骤:1、确定 OOM 类型(通过错误日志)。

    20910

    Java堆空间Vs栈内存

    Java堆空间 Java运行时使用Java堆空间为对象和JRE类分配内存。每当我们创建任何对象时,它总是在堆空间中创建。 垃圾回收在堆内存上运行以释放没有任何引用的对象使用的内存。...方法结束后,该块将立即立即变为未使用状态,用作下一个方法使用。 与堆内存分配,栈内存的大小要小一点。 Java程序中的堆空间和栈内存分配 让我们用一个简单的程序来了解堆和交替的内存使用情况。...由于Java是按值传递的,因此在第6行的foo()变量中中创建了对Object的新引用。 在第7行创建一个字符串,该字符串进入堆空间的“字符串池”,并在foo()最小空间中创建引用。...如果您对Java编码技巧与实践更感兴趣,请阅读Joshua Bloch撰写的《Effective Java 中文 第三版》 ,这是值得深读的一本书。...当栈内存已满时,Java运行时将java.lang.StackOverFlowError引发,而如果堆内存已满,则将引发java.lang.OutOfMemoryError: Java Heap Space

    1.4K20

    剖析Java OutOfMemoryError异常

    本篇主要包括如下内容: Java堆溢出 运行时常量池和方法区溢出 本地内存溢出 Java堆溢出 Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免JVM清除这些对象...堆溢出复现 要复现这种情况也很简单:将Java堆的大小限制为固定值,且不可扩展(将堆的最小值-Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展);当使用一个 while(true) 循环来不断创建对象就会发生..."main" java.lang.OutOfMemoryError: Java heap space即是说发生了堆溢出。...与-Xms),是否设置的堆内存空间太小,以及检查代码中是否存在某些对象声明周期过长、持有状态时间过长的情况。...JDK 8 中将类信息移到了本地堆内存(Native Heap)中,将原有的永久代移动到了本地堆中成为 MetaSpace ,如果不指定该区域的大小,JVM 将会动态的调整。

    2.1K30

    OutOfMemoryError系列: Java heap space错误深度解析

    当你编译它并使用12MB的Java堆空间(java -Xmx12m OOM)启动时,它会失败,并返回java.lang.OutOfMemoryError:Java heap space 消息。...使用13MB的Java堆空间,程序就运行正常了。...因此,这些未使用的对象将无限期地保留在Java堆空间中。这个堆积将最终触发java.lang.OutOfMemoryError:Java heap space 错误。...例如,如果您的应用程序包含内存泄漏,添加更多堆将只是推迟java.lang.OutOfMemoryError:Java heap space 错误。...此外,增加Java堆空间量也会增加影响应用程序吞吐量或延迟的GC暂停时间。 如果你想解决Java堆空间的根本问题,而不是掩盖症状,你需要找出那些分配了最多的内存的那些代码。

    12.3K61

    Java 内存模型 + 排查全流程

    我当时迷迷糊糊地盯着日志,看到 java.lang.OutOfMemoryError: Java heap space 那一瞬间,困意立刻没了——因为我知道,这种“偶尔性 OOM”八成不会是简单问题。...Java 的内存结构,没搞懂排查会超级痛苦别问为什么要看这些区域,线上定位问题时不知道堆、栈、元空间的区别,基本就等于在黑屋里找黑猫。...我自己的经验是,Java 内存问题 80% 都不是栈的问题,剩下 20% 在堆和元空间,还有少量在 Direct Memory。几个对排查特别关键的点:堆(Heap):大部分对象都在这里。...java.lang.OutOfMemoryError: Java heap spacejava.lang.OutOfMemoryError: GC overhead limit exceededjava.lang.OutOfMemoryError...引用链最终指向一段代码:MapObject> cache = new HashMap();cache.put(key, JSON.parseObject(body));问题是 body

    29700

    Java程序员必备:常见OOM异常分析

    Java 堆溢出原因 无法在 Java 堆中分配对象 应用程序保存了无法被GC回收的对象。 应用程序过度使用 finalizer。...Java 堆溢出排查解决思路 1.查找关键报错信息,如 java.lang.OutOfMemoryError: Java heap space 2.使用内存映像分析工具(如Eclipsc Memory...1.查找报错关键信息 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 2....栈溢出 关于虚拟机栈和本地方法栈,在Java虚拟机规范中描述了两种异常: 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError 异常; 如果虚拟机栈可以动态扩展,当扩展时无法申请到足够的内存时会抛出...1.查找报错关键信息 Caused by: java.lang.OutOfMemoryError: Metaspace 2.检查JVM元空间设置参数是否过小 -XX:MetaspaceSize=10M

    1.6K11

    JVM内存模型和垃圾回收机制

    4.其他 -XX:MaxTenuringThreshold,设置将新生代对象转到老年代时需要经过多少次垃圾回收,但是仍然没有被回收 OutOfMemoryError报错及解决方法 java.lang.OutOfMemoryError...如果是java堆内存不够的话,可以通过调整JVM下面的配置来解决:-Xms、-Xmx java.lang.OutOfMemoryError:GC overhead limit exceeded 这是JDK6...所以如果分配了堆内存之后只剩下很少的可用内存,依然可能遇到java.lang.OutOfMemoryError: unable to create new native thread。...HotSpot虚拟机将Java堆划分为年轻代(Young Generation)、老年代(Tenured Generation),其中年轻代又分为一块Eden和两块Survivor。...g1将一组或多组区域中存活对象以增量并行的方式复制到不同区域进行压缩,从而减少堆碎片,目标是尽可能多回收堆空间,且尽可能不超出暂停目标以达到低延迟的目的。

    83530

    后浪,谈谈你对jvm性能调优的理解

    堆内存的分布如下: G1圾收集器的堆空间分配策略如下: 后来出现的ZGC内存分配更加动态和灵活。本文以Java8为例,不讨论G1和ZGC 顺便回顾一下常用的垃圾收集算法: a....jmap展示指定进程的对象共享内存或堆内存信息 使用示例: 将堆中所有存活对象导出 jmap -dump:live,format=b,file=filename.bin 打印堆中存活对象 jmap -histo...JVM常用调优参数 堆空间设置: -Xmx4g 进程占用的最大堆空间大小,超出后会OOM -Xms2g 初始化堆空间大小 -Xmn1g 年轻代大小,官方推荐配置为整个堆的3/8 -XX:NewRatio...,如果空闲比小于这个参数,那么虚拟机将增长Metaspace的大小。...lockA = new Object(); Object lockB = new Object(); new Thread(() ->{ synchronized

    1K10

    Java虚拟机--运行时数据区与内存溢出

    JDK1.8之后已经将这个方法区删除了,使用元空间,metaspace代替了,理由有如下: 1.方法区存放的是常量,容易造成内存溢出,outofmemory:permGen space 2.编译后的代码...3.MinMetaspaceFreeRatio 当进行过Metaspace GC之后,会计算当前Metaspace的空闲空间比,如果空闲比小于这个参数(即实际非空闲占比过大,内存不够用),那么虚拟机将增长...本地方法栈 虚拟机栈上执行的是 Java方法,本地方法栈上执行的是本地方法(Native Methmod),HotSpot虚拟机将,虚拟机栈和本地方法栈合二为一。...溢出一般会报错 java.lang.OutOfMemoryError: PermGen space JDK 1.8之后去除了PermGen space 使用Metaspace 代替了,如果方法区溢出,...会有如下异常: Caused by: java.lang.OutOfMemoryError: Metaspace import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer

    60430

    Java 内存溢出(OOM)异常完全指南

    当应用程序试图向堆空间添加更多的数据,但堆却没有足够的空间来容纳这些数据时,将会触发java.lang.OutOfMemoryError: Java heap space异常。...内存泄漏:特定的编程错误会导致你的应用程序不停的消耗更多的内存,每次使用有内存泄漏风险的功能就会留下一些不能被回收的对象到堆空间中,随着时间的推移,泄漏的对象会消耗所有的堆空间,最终触发java.lang.OutOfMemoryError...: Java heap space错误,而当你指定 13M 堆空间时,将正常的运行。...随着时间的推移,越来越多的Key对象进入堆空间且不能被垃圾收集器回收(m为局部变量,GC 会认为这些对象一直可用,所以不会回收),直到所有的堆空间被占用,最后抛出java.lang.OutOfMemoryError...java.lang.OutOfMemoryError: Permgen space Java 中堆空间是 JVM 管理的最大一块内存空间,可以在 JVM 启动时指定堆空间的大小,其中堆被划分成两个不同的区域

    5.5K23

    JVM的深入理解

    PermGen space) 直接内存溢出 2.1 堆溢出 创建对象时如果没有可以分配的堆内存,JVM就会抛出OutOfMemoryError:java heap space异常。...2.2 栈溢出 栈空间不足时,需要分下面两种情况处理: 线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError 虚拟机在扩展栈深度时无法申请到足够的内存空间,将抛出OutOfMemberError...下面我将堆内存设置为:-Xms5m -Xmx5m,执行上面的代码,运行结果如下: 运行次数:58162 Exception in thread "main" java.lang.OutOfMemoryError...intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {...4.1 内存区域 根据《Java虚拟机规范(Java SE 7版)》规定,Java虚拟机所管理的内存将包括以下几个运行时数据区域,如图: 线程私有的内存区域: 程序计数器: 可看做当前线程执行字节码的行号指示器

    49120

    JVM面试题解析

    在Java语言中,除了基本数据类型外,其他的都是指向各类对象的对象引用;Java中根据其生命周期的长短,将引用分为4类。...: unable to create new native thread 创建线程数太多了 java.lang.OutOfMemoryError : Metaspace Java 8 之后的版本使用元空间...G1 垃圾回收器 G1 垃圾回收器将堆内存分割成不同的区域然后并发的对其进行垃圾回收。 7、怎么查看服务器默认垃圾收集器是哪个?生产是如何配置垃圾收集器?谈谈你对垃圾收集器的理解?...必须要在老年代堆用尽之前完成垃圾回收,否者 CMS 回收失败,将触发担保机制,串行老年代收集器将会以 STW 的方式进行一次 GC,从而造成较大的停顿时间。...标记清除算法无法整理空间碎片,老年代空间会随着应用时长被逐渐耗尽,最后将不得不通过担保机制对堆内存进行压缩。

    16100
    领券