Java内存模型与垃圾回收笔记
内存模型
- 栈。 局部变量(基本类型)与对象引用;线程隔离。每个方法执行时会创建一个栈帧,存储局部变量等。
- 堆。 对象实例;线程共享。
- 方法区。类信息、常量(final)、静态变量、符号引用; 线程共享。
- 程序计数器。记录当前线程执行字节码的行号;线程隔离。
- 本地方法栈。native方法。
新建对象
程序new一个对象时,首先看类是否加载到了内存,如果没有则需要通过执行一个类加载过程,之后在堆中创建一个对象。
类加载
使用双亲委派模型来进行类加载。类加载器收到加载请求会委托给父类加载器,能够确保类的全局唯一性。
- 加载。类加载器根据类的全限定名读取二进制字节流到方法区,并生成一个Class对象,作为访问入口。
- 验证。格式验证、语义验证。
- 准备。为静态变量分配内存。
- 解析。符号引用转为直接引用。
- 初始化。
创建对象
分配对象内存、变量赋默认值、执行初始化方法、在栈中创建对象引用并把对象指针赋给它。可能发生指令重排序。
内存分配
- 对象优先分配到新生代的Eden区,空间不足时进行minor gc。Eden区与survivor区的对象复制到另一个survivor区,然后回收Eden区。
- 长期存活的对象复制到老生代。
- 每次minor gc时检查老生代空间是否充足,不足执行full gc。
垃圾回收
垃圾判定
引用计数(存在循环引用)、可达性分析(从多个root对象出发,不在引用链上的表示不可达)。
垃圾回收器
- Serial
单线程收集器,收集时用户线程会暂停。收集新生代用复制算法,收集老生代用标记整理算法。
- CMS (Concurrent Mark Sweep)
老生代收集器。使用标记清除算法,可以并发标记、并发清除,目标是最短停顿时间,提高响应速度。
缺点是会产生内存碎片,导致频繁GC。
- Parallel Scavenge
新生代收集器。使用复制算法,优点是可控制吞吐量,适合后台运算、交互少的任务。
- G1(Garbage First)
收集新生代与老生代。将Java堆划分成多个区域,区域之间不一定连续,每个区域可能是eden、survivor、old或Humongous(大对象)。 通过全局并发标记统计每个区域的垃圾堆积情况,每次收集垃圾最多的区域,不需要扫描全堆,效率高。
特性: 与应用程序并发执行
不会产生内存碎片
软实时,设置垃圾回收的限时,G1会尽量在时限内完成垃圾回收(不确保)
GC模式:Young GC:eden区域达到最大阈值时,触发young gc,回收eden区与survivor区
Mixed GC:回收young region和old region。
Java内存模型与垃圾回收笔记的更多相关文章
- Java内存模型与垃圾回收
1.Java内存模型 Java虚拟机在执行程序时把它管理的内存分为若干数据区域,这些数据区域分布情况如下图所示: 程序计数器:一块较小内存区域,指向当前所执行的字节码.如果线程正在执行一个Java方法 ...
- java内存模型和垃圾回收(收藏)
java内存模型: https://www.cnblogs.com/handsomeye/p/5442879.html java垃圾回收 http://www.cnblogs.com/handsome ...
- JAVA内存模型及垃圾回收自我总结
本文为原创,根据<深入理解java虚拟机>和自己的一些理解进行整理,单纯和看其他人的博客感觉不如自己一点点的画和记录来的印象深刻. JAVA内存模型: 上图中:局部变量表所需的内存在编译期 ...
- java内存模型和垃圾回收
摘抄并用于自查 JVM内存模型 1. Java程序具体执行的过程: Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀) 由JVM中的类加载器加载各个类的字节码文 ...
- Java虚拟机内存模型及垃圾回收监控调优
Java虚拟机内存模型及垃圾回收监控调优 如果你想理解Java垃圾回收如果工作,那么理解JVM的内存模型就显的非常重要.今天我们就来看看JVM内存的各不同部分及如果监控和实现垃圾回收调优. JVM内存 ...
- 【Java_基础】JVM内存模型与垃圾回收机制
1. JVM内存模型 Java虚拟机在程序执行过程会把jvm的内存分为若干个不同的数据区域来管理,这些区域有自己的用途,以及创建和销毁时间. JVM内存模型如下图所示 1.1 程序计数器 程序计数器( ...
- 程序猿的日常——JVM内存模型与垃圾回收
Java开发有个很基础的问题,虽然我们平时接触的不多,但是了解它却成为Java开发的必备基础--这就是JVM.在C++中我们需要手动申请内存然后释放内存,否则就会出现对象已经不再使用内存却仍被占用的情 ...
- JVM内存模型和垃圾回收
Java开发有个很基础的问题,虽然我们平时接触的不多,但是了解它却成为Java开发的必备基础——这就是JVM.在C++中我们需要手动申请内存然后释放内存,否则就会出现对象已经不再使用内存却仍被占用的情 ...
- (转载)JVM中的内存模型与垃圾回收
转载自微信公众号:Java高级架构(Java-jiagou)-----看完这篇文章,我奶奶都知道JVM中的内存模型与垃圾回收了! 六.内存模型 6.1 内存模型与运行时数据区 Java虚拟机在执行J ...
随机推荐
- Java基础---Java方法
基本方法的定义: public static void 方法名称() { 方法体 } 方法名称的命名规则和变量一样,使用小驼峰. 方法体:也就是大括号当中可以包含任意条语句. 注意事项: 1. 方法定 ...
- 2019CCPC网络赛——array(权值线段树)
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=6703 题目大意: 给出一个n(n<1e5)个元素的数组A,A中所有元素都是不重复的[1,n]. 有 ...
- GoF 的 23 种设计模式的分类和功能
1. 根据目的来分 根据模式是用来完成什么工作来划分,这种方式可分为创建型模式.结构型模式和行为型模式 3 种. 创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”.GoF ...
- pandas之分组计算笔记
分组计算三部曲:拆分-->应用-->合并 分组:就是按照行或列把相同索引的部分分到一起 分组的关键词为groupby,分组后我们就可以对每组数据进行同一操作,返回的是每组数据分别计算后的结 ...
- WPF入门(4)——资源
引用<深入浅出WPF>对资源的解读: 每个WPF的界面元素都具有一个名为Resources的属性,这个属性继承自FrameworkElement类,其类型为ResourceDictiona ...
- Hibernate一对多自关联、多对多关联
今天分享hibernate框架的两个关联关系 多对多关系注意事项 一定要定义一个主控方 多对多删除 主控方直接删除 被控方先通过主控方解除多对多关系,再删除被控方 禁用级联删除 关联关系编辑,不 ...
- shell习题第20题:统计文件大小
[题目要求] 加入需要每小时执行一个脚本.功能:当时间是0点和12点时,将/data/log/下的文件全部清空,注意只能清空文件内容而不能删除文件.而其他时间只需要统计一下每个文件的大小,一个文件一行 ...
- CCF 2017-09-2 公共钥匙盒
CCF 2017-09-2 公共钥匙盒 题目 问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家.每次老师上课前,都从公共钥匙盒里找到自己上课的教室 ...
- ligerui tab 部分记载
打开一个Tab $(".strength_box").click(function () { var id = $(this).attr("data"); va ...
- 程哥带你学python-[第一章-初识Python]
Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年. 像Perl语言一样, Pyt ...