内存模型

  • 。 局部变量(基本类型)与对象引用;线程隔离。每个方法执行时会创建一个栈帧,存储局部变量等。
  • 堆。 对象实例;线程共享。
  • 方法区。类信息、常量(final)、静态变量、符号引用; 线程共享。
  • 程序计数器。记录当前线程执行字节码的行号;线程隔离。
  • 本地方法栈。native方法。

新建对象

  程序new一个对象时,首先看类是否加载到了内存,如果没有则需要通过执行一个类加载过程,之后在堆中创建一个对象。

类加载

  使用双亲委派模型来进行类加载。类加载器收到加载请求会委托给父类加载器,能够确保类的全局唯一性。

  1. 加载。类加载器根据类的全限定名读取二进制字节流到方法区,并生成一个Class对象,作为访问入口。
  2. 验证。格式验证、语义验证。
  3. 准备。为静态变量分配内存。
  4. 解析。符号引用转为直接引用。
  5. 初始化。

创建对象

  分配对象内存、变量赋默认值、执行初始化方法、在栈中创建对象引用并把对象指针赋给它。可能发生指令重排序。

内存分配

  1. 对象优先分配到新生代的Eden区,空间不足时进行minor gc。Eden区与survivor区的对象复制到另一个survivor区,然后回收Eden区。
  2. 长期存活的对象复制到老生代。
  3. 每次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内存模型与垃圾回收笔记的更多相关文章

  1. Java内存模型与垃圾回收

    1.Java内存模型 Java虚拟机在执行程序时把它管理的内存分为若干数据区域,这些数据区域分布情况如下图所示: 程序计数器:一块较小内存区域,指向当前所执行的字节码.如果线程正在执行一个Java方法 ...

  2. java内存模型和垃圾回收(收藏)

    java内存模型: https://www.cnblogs.com/handsomeye/p/5442879.html java垃圾回收 http://www.cnblogs.com/handsome ...

  3. JAVA内存模型及垃圾回收自我总结

    本文为原创,根据<深入理解java虚拟机>和自己的一些理解进行整理,单纯和看其他人的博客感觉不如自己一点点的画和记录来的印象深刻. JAVA内存模型: 上图中:局部变量表所需的内存在编译期 ...

  4. java内存模型和垃圾回收

    摘抄并用于自查 JVM内存模型 1. Java程序具体执行的过程: Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀) 由JVM中的类加载器加载各个类的字节码文 ...

  5. Java虚拟机内存模型及垃圾回收监控调优

    Java虚拟机内存模型及垃圾回收监控调优 如果你想理解Java垃圾回收如果工作,那么理解JVM的内存模型就显的非常重要.今天我们就来看看JVM内存的各不同部分及如果监控和实现垃圾回收调优. JVM内存 ...

  6. 【Java_基础】JVM内存模型与垃圾回收机制

    1. JVM内存模型 Java虚拟机在程序执行过程会把jvm的内存分为若干个不同的数据区域来管理,这些区域有自己的用途,以及创建和销毁时间. JVM内存模型如下图所示 1.1 程序计数器 程序计数器( ...

  7. 程序猿的日常——JVM内存模型与垃圾回收

    Java开发有个很基础的问题,虽然我们平时接触的不多,但是了解它却成为Java开发的必备基础--这就是JVM.在C++中我们需要手动申请内存然后释放内存,否则就会出现对象已经不再使用内存却仍被占用的情 ...

  8. JVM内存模型和垃圾回收

    Java开发有个很基础的问题,虽然我们平时接触的不多,但是了解它却成为Java开发的必备基础——这就是JVM.在C++中我们需要手动申请内存然后释放内存,否则就会出现对象已经不再使用内存却仍被占用的情 ...

  9. (转载)JVM中的内存模型与垃圾回收

    转载自微信公众号:Java高级架构(Java-jiagou)-----看完这篇文章,我奶奶都知道JVM中的内存模型与垃圾回收了! 六.内存模型 6.1  内存模型与运行时数据区 Java虚拟机在执行J ...

随机推荐

  1. 高阶函数 filter map reduce

    const app=new Vue({ el:'#app', data:{ books:[{ id:1, name:"算法导论", data: '2006-1', price:39 ...

  2. java多线程上篇(三) -- 进程通信和线程死锁简单介绍

    进程通信指的是进程间的信息交换 ,IPC(Inter-Process Communication,进程间通信) 进程通信就相当于一种工作方式.沟通形式,进程通信主要指的就是操作系统提供的进程通信工具( ...

  3. 搭建apache2.4+php7+mysql+phpmyadmin

    apache2.2不支持php7,会报错 cannot load php7apache2_4.dll into server 前排提示:保证安装文件夹和我的一致可以省事很多哦 下载地址 下载apach ...

  4. 使用HSI配置系统时钟

    这里我就直接粘代码了.很简单.上节理解了 这也就能简单了. void HSI_SetSysClk( uint32_t RCC_PLLMul_x ) { __IO uint32_t HSIStatus ...

  5. element-ui 时间设置 获取固定的时间格式

    <el-date-picker v-model="time1" type="daterange" start-placeholder="开始日期 ...

  6. odoo——日历的一对多与多对一

    # model文件 # -*- coding: utf-8 -*- from odoo import api, fields, models class TodoTestYear(models.Mod ...

  7. AtCoder练习

    1. 3721 Smuggling Marbles 大意: 给定$n+1$节点树, $0$为根节点, 初始在一些节点放一个石子, 然后按顺序进行如下操作. 若$0$节点有石子, 则移入盒子 所有石子移 ...

  8. Mybatis中Like 的使用方式以及一些注意点

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 模糊查询在项目中还是经常使用的,本文就简单整理Mybatis中使用Like进行模糊查询的几种写法以及一些常见的问题. 使用 ...

  9. 关于MQ的几件小事(六)消息积压在消息队列里怎么办

    1.大量消息在mq里积压了几个小时了还没解决 场景:几千万条数据在MQ里积压了七八个小时,从下午4点多,积压到了晚上很晚,10点多,11点多.线上故障了,这个时候要不然就是修复consumer的问题, ...

  10. cli中webpack的配置详解

    一.前言 vue-cli是构建vue单页应用的脚手架,输入一串指定的命令行从而自动生成vue.js+wepack的项目模板.这其中webpack发挥了很大的作用,它使得我们的代码模块化,引入一些插件帮 ...