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可达 ...
随机推荐
- springboot去除内嵌tomcat和打包在tomcat中运行需要做的步骤
去除内嵌tomcat和添加jsp依赖 去除内嵌tomcat 在springboot启动依赖中去除内嵌tomcat <dependency> <groupId>org.sprin ...
- 2020 i春秋新春战疫公益赛 misc
0x01 code_in_morse morse decode后得到: RFIE4RYNBINAUAAAAAGUSSCEKIAAAAEUAAAAA7AIAYAAAAEPFOMTWAAABANUSRCB ...
- 关于windows nginx不能启动问题的解决,史上最坑系列之一(原文)
我是直接在官方网址下载windows1.6稳定版的nginx,之所以下载它是因为在window下方便学习,更好的在linux安装和学习nginx. 下载到D:\nginx学习\,解压它,并进入启动它 ...
- easyExcel+poi导出Excel出现乱码
这种问题肯定是浏览器编码问题,修改官方给的util就好了
- A. Angry Students
网址:http://codeforces.com/problemset/problem/1287/A It's a walking tour day in SIS.Winter, so tt grou ...
- nginx+keepalived实现主从高可用
设备: 主:192.168.200.122 从:192.168.200.124 安装:两台都分别安装nginx以及keepalived 两台机步骤一致一主一从 安装nginx的依赖包 [root@lo ...
- mvn 搭建临时仓库批量下载依赖jar包
1.新建文件夹temp,在temp下新建setup.bat ,pom.xml 2.编辑setup.bat 和pom.xml bsetup.bat call mvn -f pom.xml depende ...
- js中this,箭头函数和普通函数
四种基本用法 1. 一般方法中,this代指全局对象 window 2. 作为对象方法调用,this代指当前对象 3. 作为构造函数调用,this 指代new 出的对象 function test() ...
- Python爬虫:数据解析 之 xpath
资料: W3C标准:https://www.w3.org/TR/xpath/all/ W3School:https://www.w3school.com.cn/xpath/index.asp 菜鸟教程 ...
- retrying 模块
我们在写爬虫的过程中,经常遇到爬取失败的情况,这个时候我们一般会通过 try 块去进行重试,但是每次都写那么一堆 try 块,真的是太麻烦了,所以今天就来说一个比较 pythonic 的模块,retr ...