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 ...
随机推荐
- 暴力解决HTMLTestRunner出现dict() ->new empty dictionary的问题
在使用ddt数据驱动之后,HTMLTestRunner报告的用例名称之后出现dict() ->new empty dictionary,如下图所示: 经排查,发现是因为ddt源码中test_do ...
- vector简单常用用法
Vector是什么? vector翻译为向量,从某种角度来说就是一个可以变长的数组,它会根据需要自动扩充数组的容量,除此之外其是一个STL中的模板类,其 还具有一些内部的方法. Vector的使用方法 ...
- 图像人脸检测+人眼检测 (opencv + c++)
摘要:实现图像中人脸检测,和人眼定位.输出检测标记图像和定位坐标. 工具:vs2015 opencv3 C++ 资源:haarcascade_frontalface_alt2.xml;haarcas ...
- 网络模式: host-only & NAT & 桥接
基本上,Host-only相当于虚拟机和宿主机通过交叉线相连:NAT,宿主机相当于虚拟机的路由器:桥接,相当于把宿主机和虚拟机同时接到交换机上,然后交换机接到外网. 连接性上说,可参考下表: 连接 宿 ...
- react中jsx文件是如何转换成js对象的
通过在线babel转换器,转换出jsx是如何变成js对象的 jsx文件 加入了正常的标签以及嵌套标签以及方法属性 function hello() { click=()=>{ console.l ...
- R|批量循环处理同一格式文件-csv,txt,excel
本文首发于“生信补给站”微信公众号,https://mp.weixin.qq.com/s/8IfMrSr9xc8_1Y2_9Ne6hg 在一个文件夹下有很多字段一致,格式统一的数据文件(csv,txt ...
- HTML中关于动态创建的标签无法绑定js事件的解决方法:.on()方法的 [.selector]
在前端页面的时候,会经常遇到用JavaScript动态创建出来的Button按钮或其他标签无法使用点击事件的问题.如下代码,使用jquery在body中动态创建一个class为demo的Button按 ...
- (三)Spring框架之事务管理
一.编程式事务管理 Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager,事务管理器接口PlatformT ...
- 改善C#程序的方法
写在开头: http://www.cnblogs.com/luminji 157个建议_勘误表 一:属性 属性和方法一样.也可以是virtual和abstract. 条款2:运行时常量(read ...
- php定界符介绍
php界定符就是为了照样输出内容.它的格式如下: <<<EOF ...... EOF; 其中EOF是自定义的变量,但要成对出现! 首先附上一段php代码: <?php $a = ...