JVM虚拟机内存溢出垃圾收集及类加载机制总结
1.Java内存区域与内存溢出异常
虚拟机栈:为虚拟机执行Java方法服务
本地方法栈:为虚拟机使用到的native方法服务。
Java堆:是Java虚拟机所管理的内存中最大的一块,被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例。是垃圾收集器管理的主要区域。
可以通过-Xmx和-Xms控制堆的大小。
方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
内存溢出异常(OutOfMemoryError):
虚拟机栈:如果虚拟机栈可以动态扩展,如果扩展时无法申请到足够的内存。
Java堆:如果在堆中没有内存完成实例分配,并且堆也无法再扩展时。
方法区:当方法区无法满足内存分配需求时。当方法区中的常量池无法再申请到内存时。
2.垃圾收集器与内存分配策略
如何判断一个对象是否可回收呢?
可达性分析算法:通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径(称为引用链),当一个对象到GC Roots没有任何引用链相连,则证明此对象是不可用的。
如何宣判一个对象的死刑呢?
即使是在可达性算法中的不可达对象,也并非是非死不可的,此时它们暂时处于缓刑阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:第一次就是执行可达性算法后,若一个对象和任何其他对象没有关联就会标记一次。然后判断该对象是否重写了finalize()方法,若该对象没有重写,或者已经执行过那么会进行第二次标记,两次标记后确立其死刑,对象可在finalize()方法内进行一次自我救赎的机会。但是注意,finalize方法只会被执行一次。
垃圾收集算法:
标记-清除算法(最基础的算法):
首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。但是效率低且易产生大量不连续的内存碎片。
复制算法:
将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块内存使用完了,就将还存活的对象复制到另外一块上面,然后再把已使用过的内存空间清理掉。
标记-整理算法:
首先标记处所有需要回收的对象,在标记完成后将需要回收的对象向一端移动,然后直接清理掉端边界以外的内存。
分代收集算法:
根据对象存活周期的不同将内存划分为几块,一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或者“标记-整理”算法来进行回收。
默认使用的垃圾收集器:Serial/Serial Old收集器
对象的内存分配策略:
新建一个对象一般来讲会先存入新生代中的Eden中,若是大对象则直接存入老年代,当Eden内存满后,会根据复制算法将Eden中的存活对象复制到Survivor空间内,并执行一次minorGC,将Eden空间清空,若是老年代没有足够的内存进行分配时就会执行一次FullGC,一般来讲FullGC都会伴随着一次MinorGC,但是要比MinorGC慢10倍以上。若是一个对象在survivor空间内经历过了15次的MinorGC还不死,就会将该对象转存至老年代。
3.虚拟机类加载机制
概念:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
加载-->验证-->准备-->解析-->初始化-->使用-->卸载

JVM虚拟机内存溢出垃圾收集及类加载机制总结的更多相关文章
- 对jvm虚拟机 内存溢出的思考
java内存溢出:当新产生对象时,新生代空间不够,导致无法申请到足够的空间,报内存溢出 内存泄漏:一些静态集合,静态常量没有被gc清理,越来越多,占用内存,最后导致无法申请到新的空间
- jvm 虚拟机内存模型
来源:https://blog.csdn.net/A_zhenzhen/article/details/77917991?locationNum=8&fps=1 https://blog ...
- 设置TOMCAT的JVM虚拟机内存大小
你知道如何设置TOMCAT的JVM虚拟机内存大小吗,这里和大家分享一下,JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序.这个初始内存和最大内存在一定程度都会影响程序的性能. 设置 ...
- JVM虚拟机深入理解+GC回收+类加载
旭日Follow_24 的CSDN 博客 ,全文地址请点击: https://blog.csdn.net/xuri24/article/details/81455449 一,前言 本文章是读了“深入理 ...
- java中JVM虚拟机内存模型详细说明
java中JVM虚拟机内存模型详细说明 2012-12-12 18:36:03| 分类: JAVA | 标签:java jvm 堆内存 虚拟机 |举报|字号 订阅 JVM的内部结构 ...
- 巩固java(二)----JVM堆内存结构及垃圾回收机制
前言: 我们在运行程序时,有时会碰到内存溢出(OutOfMemoryError)的问题,为了解决这种问题,我们有必要了解JVM的内存结构和垃圾回收机制. 正文: 1.JVM堆内存结构 ...
- JVM 虚拟机内存深入探究
[<深入理解java虚拟机>-整理笔记] by lijun JVM虚拟机内存逻辑模型: 方法区(全局变量 静态数据 常量等) 线程共享 堆栈区(对象实例 数组数据 new generat ...
- JVM:内存溢出OOM
JVM:内存溢出OOM 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 经典错误 JVM 中常见的两个 OOM 错误 StackoverflowError:栈溢出 ...
- Java虚拟机内存溢出异常--《深入理解Java虚拟机》学习笔记及个人理解(三)
Java虚拟机内存溢出异常--<深入理解Java虚拟机>学习笔记及个人理解(三) 书上P39 1. 堆内存溢出 不断地创建对象, 而且保证创建的这些对象不会被回收即可(让GC Root可达 ...
随机推荐
- Springmvc-crud-01错误
错误:无法显示图书列表内容 原因:获取存储域对象中的名字写错了 controller层: 前端页面: 解决方案:前后端的代码要保持一致(名字自己定义),写代码要细心 修改成功后的界面
- netty(三)---NioEventLoop分析
问题 : NioEventLoop 作用到底是什么?是在哪里用到的? NioEventLoop 和我们开头创建的 ServerBootstrap 和 EventLoopGroup 是什么关系 ? Ni ...
- 【PAT甲级】1083 List Grades (25 分)
题意: 输入一个正整数N(<=101),接着输入N个学生的姓名,id和成绩.接着输入两个正整数X,Y(0<=X,Y<=100),逆序输出成绩在x,y之间的学生的姓名和id. tric ...
- idea如何提取变量(拆分变量赋值和声明)
需求描述: 我们时常遇到某个在某个局部作用域声明的变量,想要用在另一个地方,此时就需要在作用域外部声明变量,在作用域中给变量赋值. 在eclipse中这个功能和提取变量在一起,我们可以方便的拆分变量的 ...
- js中this,箭头函数和普通函数
四种基本用法 1. 一般方法中,this代指全局对象 window 2. 作为对象方法调用,this代指当前对象 3. 作为构造函数调用,this 指代new 出的对象 function test() ...
- Deeplearning.ai课程笔记-改善深层神经网络
目录 一. 改善过拟合问题 Bias/Variance 正则化Regularization 1. L2 regularization 2. Dropout正则化 其他方法 1. 数据变形 2. Ear ...
- ubuntu mysql允许root用户远程登录
有两种方法: 一. 1.mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPT ...
- 九、Appium-python-UI自动化之通过text定位
1.通过xpath定位text xpath路径为://android.widget.EditText[@text='请输入包含街道的完整地址'] 2.通过AndroidUIAutomator # 这个 ...
- 吴裕雄--天生自然Numpy库学习笔记:NumPy 副本和视图
副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置. 视图是数据的一个别称或引用,通过该别称或引用亦便可访问.操作原有数据,但原有数据不会产生拷贝.如果我们 ...
- jQuery结合CSS实现手风琴组件
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...