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可达 ...
随机推荐
- 用Eclipse+Maven+Jetty构建Java Web开发环境(详细笔记)
(软件环境) 『系统』Windows 10 x64 『JAVA』JDK 1.8.0_91 『Eclipse』 Eclipse-oxygen 『Maven』 apache-maven-3.6.3 『Je ...
- django 模版查找路径
路径的配置,模版上下文的配置等.模版路径可以在两个地方配置. 1.'DIRS':这是一个列表,在这个列表中可以存放所有的模版路径,以后在视图中使用render或者render_to_string渲染模 ...
- 攻防世界 你知道什么是cookie吗?
打开题目链接,提示我们查看cookie,cookie是HTTP协议中的一个重要参数,(对HTTP协议不是很熟悉的friends可以看看这个“HTTP协议其实就是这么简单”) 查看cookie的方法有很 ...
- numpy函数hstack,vstack,dstack简介
vstack.hstack和dstack都用于把几个小数组合并成一个大数组.它们的差别是小数组的元素在大数组中的排列顺序有所不同.把两部手机摆到一起有几种方式?水平的左右排列,垂直的上下排列,还可以把 ...
- [C/C++] _tprintf() 输出不了汉字
在前面加一个 setlocale(LC_ALL, ""); //必须得有这行 否则不能输出中文 注意得加locale头文件 #include<stdio.h> #inc ...
- JVM系列(二)之类加载
什么是类的加载 类加载是指将源代码编译后的.class加载到内存中初始化待程序使用的过程,类加载的最终结果就是将.class字节码加载到JVM中生成一个java.lang.Class对象,提供给程序使 ...
- Python socket day2
接收数据 需要一个端口 (端口大于1024 1024一下的端口为特殊端口) (当同一个端口同一时间只能被一个使用) 创建一个套接字 s = socket.socket(AF_INET,SOCK ...
- js下false情况
//为false的情况 false null NaN undefined "" 0
- Spring 的 Bean 生命周期,11 张高清流程图及代码,深度解析
在网上已经有跟多Bean的生命周期的博客,但是很多都是基于比较老的版本了,最近吧整个流程化成了一个流程图.待会儿使用流程图,说明以及代码的形式来说明整个声明周期的流程.注意因为代码比较多,这里的流程图 ...
- Python:re 模块
re模块是python内置的正则表达式模块