各位小伙伴,到上一篇博文为止,我们的内存模型相关知识就已经讲完了!讲!完!了!不知道大家吸收了多少,这里我们简单的来回顾一下吧! 
  内存基本分为JAVA栈、本地方法栈、堆和方法区。 
  首先栈存放的是基本类型变量,局部变量,和对象的引用,他在内存中是一块连续的区域,有大小限制,是由系统自动分配的,因此它的读写速度比较快,而且会自动释放掉为该变量所分配的内存空间;还有一点就是他还存放线程调用方法时存储局部变量表,操作,方法出口等与方法执行相关的信息。 
  堆的话是存放对象和数组;在运行时动态分配内存(比如 new()),较慢,但灵活;是不连续的内存区域,在发出申请的时候,系统首先会遍历一个存有空闲地址节点的链表,找到第一个满足申请大小的节点,将他从链表删除,并分配给申请者,如果空间剩余,则将多出来的加入链表;由Java虚拟机的自动垃圾回收器来管理。分为一个Eden区和两个Survivor区。 
  方法区主要存放静态变量,常量,全局变量。他的大小不必是固定的,jvm可以根据应用的需要动态调整,同样方法区也不必是连续的。方法区可以在堆(甚至是虚拟机自己的堆)中分配。jvm可以允许用户和程序指定方法区的初始大小,最小和最大尺寸。因为方法区是被所有线程共享的,所以必须考虑数据的线程安全。假如两个线程都在试图找一个类,在该类还没有被加载的情况下,只应该有一个线程去加载,而另一个线程需要等待。 
  本地方法栈则是为执行Native方法服务,但这个在不同JVM内有不同的内部实现,比如在HotSpot JVM中Java虚拟机栈和本地方法栈被实现为同一个栈区。 
  对于收集方法来说一般有两种,“复制”和“标记-清除-整理”。“复制”算法需要留有部分空间用于复制后的存储,适用于朝生夕死的对象;“标记-清除-整理”适用于年老代,清除后形成逻辑上连续的区域,避免了内存碎片。 
  对象被回收之前都要先被标记为可回收的对象,一般有引用计数和可达性分析法。JAVA采用的则是可达性分析,从“GC Roots”开始组建一张张的关系网,不在关系网上的就会被清除。标记有两次,因为被标记后还可能会执行finalize()方法。“GC Roots”被记录在OopMap中,能够让虚拟机快速的得到他们,不用遍历整个堆来寻找“GC Roots”了。 
  回收的时候需要暂停程序的所有线程,这个过程叫做STW,我们的程序需要优化的时候,缩短STW也是优化的一部分。 
各种收集器都为缩短STW的时间提供了不同的策略,并行的、串行的,作用于年轻代的,作用于年老代的,还有作用于整个堆的。各有各的优劣势,需要搭配使用,不能随意组合。 
  好啦,这一整块我们算是大概回忆完啦,在后面的博文中我们就要开始讲虚拟机中的类加载机制了!

JVM(13)之 阶段回顾的更多相关文章

  1. alhpa阶段回顾

    说明:本次课程,大家按照我下面列出来的问题进行回顾和反思,总结alhpa阶段以来的得失.每个组都要回答这些问题.由组长或者组员来回答都可以.目的依然是让大家养成软工的一些习惯和思维方式. 1.最初的需 ...

  2. [译]Stairway to Integration Services Level 13 - SSIS 变量回顾

    介绍 在前一篇中我们组合了已经学过的事件冒泡 event bubbling, 日志记录 logging, 和父子模型 Parent-Child pattern 建立了自定义的SSIS包日志记录. 本文 ...

  3. jvm(13)-线程安全与锁优化(转)

    0.1)本文部分文字转自“深入理解jvm”, 旨在学习 线程安全与锁优化 的基础知识: 0.2)本文知识对于理解 java并发编程非常有用,个人觉得,所以我总结的很详细: [1]概述 [2]线程安全 ...

  4. jvm(13)-线程安全与锁优化

    [0]README 0.1)本文部分文字转自“深入理解jvm”, 旨在学习 线程安全与锁优化 的基础知识: 0.2)本文知识对于理解 java并发编程非常有用,个人觉得,所以我总结的很详细: [1]概 ...

  5. 深入理解JVM(学习过程)

    这,仅是我学习过程中记录的笔记.确定了一个待研究的主题,对这个主题进行全方面的剖析.笔记是用来方便我回顾与学习的,欢迎大家与我进行交流沟通,共同成长.不止是技术. 2020年02月06日22:43:0 ...

  6. JVM基础系列第7讲:JVM 类加载机制

    当 Java 虚拟机将 Java 源码编译为字节码之后,虚拟机便可以将字节码读取进内存,从而进行解析.运行等整个过程,这个过程我们叫:Java 虚拟机的类加载机制.JVM 虚拟机执行 class 字节 ...

  7. JVM垃圾回收(四)- GC算法:实现(1)

    GC算法:实现 上面我们介绍了GC算法中的核心概念,接下来我们看一下JVM里的具体实现.首先必须了解的一个重要的事实是:对于大部分的JVM来说,两种不同的GC算法是必须的,一个是清理Young Gen ...

  8. 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】

    目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...

  9. JVM学习——类加载机制(学习过程)

    JVM--类加载机制 2020年02月07日14:49:19-开始学习JVM(Class Loader) 类加载机制 类加载器深入解析与阶段分解 在Java代码中,类型的加载.连接与初始化过程中都是在 ...

随机推荐

  1. MYSQL中IN与EXISTS的区别

    在MYSQL的连表查询中,最好是遵循‘小表驱动大表的原则’ 一.IN与EXISTS的区别1.IN查询分析SELECT   *  FROM A WHERE id IN (SELECT id FROM B ...

  2. 反射getDeclaredFields()

    public static void main(String[] args) { // 获取所有属性值 Field[] fields = People.class.getDeclaredFields( ...

  3. phpstorm 生产php pojo类

    一. 修改Generate POJO.groovy文件 改为 import com.intellij.database.model.DasTable import com.intellij.datab ...

  4. Clean Docker <none>:<none>

    https://www.projectatomic.io/blog/2015/07/what-are-docker-none-none-images/ Reference: https://www.p ...

  5. 【leetcode】1031. Maximum Sum of Two Non-Overlapping Subarrays

    题目如下: Given an array A of non-negative integers, return the maximum sum of elements in two non-overl ...

  6. iOS10以上App请求用户授权系统设置权限

    <key>NSAppleMusicUsageDescription</key> <string>使用媒体资源</string> <key>N ...

  7. MySQL修改密码方法汇总

    本文给大家汇总介绍了MySQL修改密码的方法,分为MySQL5.7版本之前以及MySQL5.7版本之后的修改方法,有需要的小伙伴可以参考下 MySQL5.7版本之前修改密码的方法: 方法1: 用SET ...

  8. php array()函数 语法

    php array()函数 语法 作用:生成一个数组 语法:索引数组:array(value1,value2,value3,etc.);关联数组:array(key=>value,key=> ...

  9. JAVA学习纲要

    这份面试题,包含的内容了十九了模块:Java 基础.容器.多线程.反射.对象拷贝.Java Web 模块.异常.网络.设计模式.Spring/Spring MVC.Spring Boot/Spring ...

  10. [JSOI2004]平衡点 / 吊打XXX 题解

    预备概念: 金属退火:将金属缓慢加热到一定温度,保持足够时间,然后以适宜速度冷却 温度:一个逐渐减小的参数,表示接受次优解的概率 模拟退火是一种解决复杂问题的算法,相当于贪心,但以一个逐渐减小的该率接 ...