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 ...
随机推荐
- 还是a+b
题目描述: 给定 2 个正整数 a, b,a 和 b 最多可能有 40 位,求出 a + b 的和.输入描述: 两个正整数 a, b,a 和 b 最多可能有 40 位.一行表示一个数.输出描述: a ...
- 第6章:LeetCode--数组(冒泡排序、快速排序)
11. Container With Most Water class Solution { public: int maxArea(vector<int>& height) { ...
- python学习--13 基本数据类型 2
接上次补充: s = "username\temail\tpassword\naaa\taa@qq.com\t123\nusername\temail\tpassword\naaa\taa@ ...
- 【数据结构】P1165 日志分析
题目描述 MM 海运公司最近要对旗下仓库的货物进出情况进行统计.目前他们所拥有的唯一记录就是一个记录集装箱进出情况的日志.该日志记录了两类操作:第一类操作为集装箱入库操作,以及该次入库的集装箱重量:第 ...
- Java坑人面试题之自动装箱和拆箱后的引用数据类型和基本数据类型的计算
在Java1.5以后的版本中,引用类型Integer和基本数据类型int之间是可以通过自动装箱和拆箱进行计算的 例如: Integer in = 1; //it means Integer in = ...
- ASM实例修改SYS密码
修改ASM实例中SYS用户密码 How To Change ASM SYS PASSWORD ? (文档 ID 452076.1) Oracle Database - Enterprise Editi ...
- 存储过程、插入数据后直接过去主键id
DECLARE @sql nvarchar() DECLARE @cou int SET @sql='INSERT INTO people values('''+'xiaohong'+''');sel ...
- 在sublime3中运行python文件
1.首先下载Sublime和Python,安装Python环境 注意:如果不想动手亲自配置Python环境安装的时候环境变量,请在安装的界面给Add Python 3.5 To Path前面打上对号. ...
- c#基础知识梳理(三)
上期回顾 - https://www.cnblogs.com/liu-jinxin/p/10824638.html 一.方法 一个方法是把一些相关的语句组织在一起,用来执行一个任务的语句块.每一个 C ...
- 使用ctypes调用系统C API函数需要注意的问题,函数参数中有指针或结构体的情况下最好不要修改argtypes
有人向我反应,在代码里同时用我的python模块uiautomation和其它另一个模块后,脚本运行时会报错,但单独使用任意一个模块时都是正常的,没有错误.issue链接 我用一个例子来演示下这个问题 ...