Java堆内存设计原理
通常来说,堆中存储通过new字符创建的对象或者数组;
JVM中堆内存分为2大块,Permanent space和 Heap space
- Permanent即持久代(Permanent Generation),主要存储了Java类的定义信息,与垃圾收集器要收集的Java对象关系不大
- Heap={Old+new={Eden,from,to}},Old代表年老代,New代表年轻代,年老代和年轻代的划分对垃圾回收器的影响比较大
Permanent Generation 持久代
用来存放静态数据类型
年轻代、年老代
所有新生的对象首先放在年轻代,年轻代的目标就是尽可能的在此将生命周期短的对象通过垃圾回收器进行回收。年轻代分为3个去,Eden,Survivor(From,To其中,From和To区地位是平等的);
大部分对象是在Eden去生成档Eden区满时,还存活的对象被复制到Survivor区中的From区或者To区,当其中一个Survivor区满时,还存活的对象就被复制到另一个Survivor区,当另一个Survivor区也满的时候,这时候从另一个Survivor区复制过来的仍然存活的对象就有可能被复制到Old区;
针对年轻代的回收 Young GC
针对年老代的回收 Full GC
内存申请过程:
1.JVM会试图为相关的Java对象在Eden区申请内存空间;
2.如果在Eden区内存中空间足够,则申请结束;否则,进行下一步;
3.JVM试图释放Eden区所有不活跃的对象(Young GC),释放后空间仍然不足的话,则JVM会试图将活跃的对象存放至Survivor区中
4.Survivor区是Eden区与年老代的中间件。当年老代空间足够时,在Survivor区中存活了一定次数的对象会被移到年老代;
5.当年老代空间不足时,JVM会在年老代执行完全的垃圾回收(Full GC);
6.当Full GC 后,若Survivor区和年老代仍然无法存放从Eden区复制过来的对象,这时会出现JVM无法在Eden区为新的对象申请内存空间,即“Out of Memory”
出现错误情况
1.年老代溢出 ,表现为 java.lang.OutOfMemoryError:JavaHeapSpace
原因:设置的内存参数Xmx过小或内存泄漏及使用不当问题
2.持久代溢出,表现为java.lang OutofMemoryError:PermGenSpace
原因:持久代设置过小,动态加载大量Java对象导致溢出
解决方法:将 -xx MaxPermSize调大
参数说明(来自网络):
-Xms :初始堆大小。只要启动,就占用的堆大小-Xmx
:最大堆大小。java.lang.OutOfMemoryError: Java heap这个错误可以通过配置-Xms和-Xmx参数来设置-Xss
:栈大小分配。栈是每个线程私有的区域,通常只有几百K大小,决定了函数调用的深度,而局部变量、参数都分配到栈上。当出现大量局部变量,递归时,会发生栈空间OOM(java.lang.StackOverflowError)之类的错误。-XX:NewSize=n
:设置新生代大小的绝对值-XX:NewRatio=n
: 设置年轻代和年老代的比值。比如设置为3,则新生代:老年代=1:3,新生代占1/4的总heap大小。-XX:SurvivorRatio=n
:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有from和to两个。比如设置为8时,那么eden:from:to=8:1:1-XX:MaxPermSize=n
:设置持久代大小 ;java.lang.OutOfMemoryError: PermGen space这个OOM错误需要合理调大PermSize和MaxPermSize大小。-XX:HeapDumpOnOutOfMemoryError
:发生OOM时转储堆到文件,这是一个非常好的诊断方法。-XX:HeapDumpPath
:导出堆的转储文件路径-XX:OnOutOfMemoryError
:OOM时,执行一个脚本,比如发送邮件报警,重启程序。后面跟着一个脚本的路径。
相关推荐
2. **Java**:深入剖析Java基础,包括内存模型、面向对象编程、集合体系、接口、Lambda表达式、类加载机制、内部类、代理类以及Java并发和JVM(Java虚拟机)的工作原理。这部分内容对于理解Java的运行机制至关重要。...
代码随想录知识星球精华-大厂面试八股文v1.1 代码随想录知识星球精华-大厂面试八股文v1.1 代码随想录知识星球精华-大厂面试八股文v1.1 代码随想录知识星球精华-大厂面试八股文v1.1 代码随想录知识星球精华-大厂面试...
本文将深入探讨如何通过《平凡的魅力》这一教学设计,培养学生对语文基础模块上册的理解与欣赏,同时促进他们的情感认知和人文素养的提升。 一、学生现状与教学目标的对接 面对中职学生的学习现实,教师需全面考虑...
多因子模型是一种统计模型,用于分析和解释股票收益的来源,通常用于投资组合管理和金融工程领域。该模型的基本思想是将股票的收益分解为一系列因子(如市场因子、规模因子、价值因子、动量因子等)的线性组合加上一...
《代码随想录-最强八股文(第五版)》是一部综合性的编程知识合集,旨在帮助程序员,尤其是面试者,提升在前端、后端以及Java和Go等领域的技术素养。这一版本的内容涵盖了大量的面试常见问题,是程序员们准备技术...
用户可以在记录中写下自己的解题思路、关键代码和总结等内容,方便日后回顾和复习。 ## 刷题笔记记录的优点 刷题笔记记录有以下几个优点: - 帮助用户更好地理解和掌握题目解法 - 促进用户对算法和数据结构的深入...
一些基本问题如何时选择数组或链表、散列函数的工作原理、递归的概念、算法复杂度的理解以及如何实现冒泡排序和二分查找等,都是衡量是否掌握这些基础知识的标准。对于不熟悉这些概念的新手,建议阅读经典的算法和...
2. **排序与查找算法**:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等排序算法以及二分查找、哈希查找等查找算法的原理和实现。排序算法对数据的处理能力是衡量算法效率的重要标准。 3. **递归与...
计算机组成原理是计算机专业的基础知识,包括冯诺依曼体系的结构、CPU和内存、硬盘、各种外设之间的关系、寄存器、缓存等知识。了解CPU的指令、执行指令、数组、结构体、函数调用等概念,都是编程的必备知识。虚拟机...
代码随想录贪心算法知识,非常管用
通过学习《代码随想录》,你可以系统地了解和掌握这些基础知识,为面试和工作中的问题解决做好准备。 书中可能包含以下核心知识点: 1. **基础数据结构**:数组、链表、栈、队列、哈希表、二叉树等。理解这些数据...
文档内容丰富,包括但不限于C++、Java、Go语言的基础知识,数据结构和算法,操作系统,数据库,计算机网络,设计模式,Linux等核心领域,并涵盖了近30份面试经验分享,各个岗位的学习路径,offer对比,以及程序员的...
这些是算法的基础,理解它们的特性和操作,能够帮助我们更有效地设计和实现算法。 2. **排序算法**:如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。这些排序算法各有优劣,掌握它们的工作原理有...
从给定的文件信息来看,「代码随想录」动态规划专题精讲(v1.2).pdf 的内容涉及到编程算法中的动态规划专题的精讲。动态规划(Dynamic Programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息...
java笔试题算法 WeeklyBlog 欢迎来到 itsCoder 的 WeeklyBlog 项目。 更多介绍和加入项目请阅读 。 项目文章 标题 类别 作者 期数 随想 10 iOS 10 Nginx 10 Git 10 设计模式 10 Java 10 Android 9 Android 9 Web 9 ...