1. 什么是JVM

    • Java Virtual Machine(Java虚拟机)的缩写 。本质上是一个程序。

    • java语言运行的平台,是ava跨平台的根本。

  2. java默认的三种类加载器

    • BootStrap ClassLoader:启动类加载器

      负责加载java核心包也就是rt.jar里面的所有Class。该加载器由C++实现

    • ExtClassLoader:扩展类加载器

      负责加载java平台扩展的一些包,主要是\lib\ext目录下的一些jar包

    • AppClassLoader:应用类加载器

      负责加载classpath中指定的jar以及目录中的class

      classpath:存放各种配置资源文件,存放模板文件,存放java文件编译后的class文件……

  3. 双亲委派机制

    • 当AppClassLoader或ExtClassLoader加载到一个class是,它首先把这个类委托给BootStrap ClassLoader去加载完成

    • 如果 BootStrap ClassLoader 加载失败,会使用 ExtClassLoader 来尝试加载

    • 如果 ExtClassLoader 也加载失败,会尝试使用 AppClassLoader 来尝试加载

    • 如果 AppClassLoader 也加载失败,则会报出 ClassNotFoundException 异常

      好处: 防止内存中出现多份同样的字节码(安全性角度)

      注意: 类加载器在成功加载某个类之后,会把得到的类的实例缓存起来。下次再请求加载该类的时 候,类加载器会直接使用缓存的类的实例,而不会尝试再次加载。

  4. JVM中的栈

    • 栈的存取顺序是先进后出,后进先出

    • 栈在线程被创建的同时被创建,每个线程有一个私有栈

    • 栈由许多帧组成,叫栈帧,

    • 每次调用方法都会创建一个新的栈帧,用来存储这个方法的数据

    • 栈帧的大小各不相同,取决于方法的参数、局部变量和算法

    • 当一个方法被执行时,程序只能访问当前栈帧的数据,你能看到的只有栈顶的帧

    • 当前方法结束执行(抛出异常终止或是正常return结束), 当前栈帧会弹出java栈

    • Java帧上的所有数据都是此线程私有的 ,任何线程都不能访问另一个线程的数据

  5. JVM中的堆

    • java堆内存分为堆内存和非堆内存,堆内存分为年轻代( Young Generation ) 、老年代(Old Generation),非堆内存就一个永久代(Permanent Generation)。

    • 年轻代又分为伊甸园区(Eden space)和幸存区(Survivor)。Survivor区由FromSpace和ToSpace组成。Eden区占大容量,Survivor两个区占小容量,默认比例是8:1:1。

    • 堆内存用途:存放的是对象,垃圾收集器就是收集这些对象,然后根据GC算法回收。

    • 堆内存用途:永久代,也称为方法区,存储程序运行时长期存活的对象,比如类的元数据、方法、常量、属性等。 当GC回收一定次数后还没有清除的对象,就会到永久代

    • 在JDK1.8版本废弃了永久代,替代的是元空间(MetaSpace),元空间与永久代上类似,都是方法区的实现,他们最大区别是:元空间并不在JVM中,而是使用本地内存。

  6. GC和Full GC

    • GC回收新生代

    • Full GC回收新生代,老年代,元空间

  1. GC垃圾回收算法

    • 复制算法

      • 将内存空间分为两块相同的存储空间,每次只使用一块,GC时,将正在使用的内存中的存活对象复制到另一块存储空间中,然后清除正在使用的空间的所有对象 ,适合幸存区

      • 优点: 存活对象相对少时,效率很高

      • 缺点:浪费了内存空间,假设对象100%存活,多了一半空间永远是to

    • 引用计数法

      • 每一个对象都有一个counter,只要有任何一个对象引用了该对象,则其counter加1

      • 当引用失效时,counter减1,当counter为0时,对象不存在任何引用,在GC时被清除

      • java虚拟机未采用引用计数法GC

    • 标记清除法

      • 标记所有的可达对象(存在引用的对象),则未被标记的对象就是不存在引用的垃圾对象,GC时清除所有未被标记的对象

      • 标记清除法的GC时经历标记 + 清除两个过程,先标记,后清除

      • 产生空间碎片

    • 标记压缩算法

      • 标记压缩法是对标记清除法的优化,所以也叫标记清除压缩法。和标记清除法一样,先标记所有的可达对象(存在引用的对象),不同的是,标记完成后并不是直接清除未标记的垃圾对象,而是将所有的被标记的对象(即存活对象)压缩到内存空间的一端后在清理边界外所有的空间。

      • 分为标记-压缩-清除三个步骤

    总结

    内存效率:复制算法 > 标记清除算法 > 标记压缩算法(时间复杂度)

    内存整齐度:复制算法=标记压缩算法 > 标记清除算法

    内存利用率:标记压缩算法 = 标记清除算法 > 复制算法

  1. GC分代算法

    • 将内存空间根据对象的特点不同进行划分,选择合适的垃圾回收算法,以提高垃圾回收的效率。

    • 老年代因为对象的存活率高(复制的代价就要高),也没有担保空间,所以采用标记清除/压缩法

    • 新生代采用复制算法

初探JVM总结的更多相关文章

  1. JVM初探 -JVM内存模型

    JVM初探 -JVM内存模型 标签 : JVM JVM是每个Java开发每天都会接触到的东西, 其相关知识也应该是每个人都要深入了解的. 但接触了很多人发现: 或了解片面或知识体系陈旧. 因此最近抽时 ...

  2. 初探JVM

    JVM探究 请你谈谈你对JVM的理解?java8虚拟机和之前的变化更新? 什么是OOM,什么是栈溢出StackOverFlowError?怎么分析? JVM的常用调优参数? 内存快照如何抓取,怎么分析 ...

  3. 初探JVM字节码

    作者: LemonNan 原文地址: https://juejin.im/post/6885658003811827725 代码地址: https://github.com/LemonLmNan/By ...

  4. JVM初探- 使用堆外内存减少Full GC

    JVM初探-使用堆外内存减少Full GC 标签 : JVM 问题: 大部分主流互联网企业线上Server JVM选用了CMS收集器(如Taobao.LinkedIn.Vdian), 虽然CMS可与用 ...

  5. 五分钟学Java:如何学习Java面试必考的JVM虚拟机

    原创声明 本文首发于微信公众号[程序员黄小斜] 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 为什么要学习JVM虚拟机 最近的你有没有参加Java面试呢?你有没有发现,Java ...

  6. java并发编程资料

    并发这玩意很有用,把自己在网上看过觉得总结的很好的资料分享出来.猛击下面的地址查看吧 java并发编程:线程池的使用说明 java并发编程系列文章 Java并发性和多线程专题 并发工具类 Java 7 ...

  7. JVM初探- 内存分配、GC原理与垃圾收集器

    JVM初探- 内存分配.GC原理与垃圾收集器 标签 : JVM JVM内存的分配与回收大致可分为如下4个步骤: 何时分配 -> 怎样分配 -> 何时回收 -> 怎样回收. 除了在概念 ...

  8. JVM调优入门之初探

    JVM:程序计数器,jvm栈,本地方法栈,堆,方法区 JVM:虚拟机内存又分有:年轻代(eden,servivor s0,servivor s1),年老代(tenured),永久代() 问题1:如何查 ...

  9. JVM初探

    ### JVM分为类的加载生命周期和gc垃圾回收两个大的方面#####首先是类的生命周期, 类的加载: --> 记载字节码 ---> 这个过程有类的加载起参与,双亲委托机制() --> ...

随机推荐

  1. JUC 一 CountDownLatch(闭锁)

    java.util.concurrent 介绍 CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待 CountDownLatch cou ...

  2. Linux grep 后通过 | 在次grep

    grep 'info' info.log|grep 'info2' 先筛选出 包含‘info’的信息,再次筛选出包含'info2'的信息

  3. 天猫精灵业务如何使用机器学习PAI进行模型推理优化

    引言 天猫精灵(TmallGenie)是阿里巴巴人工智能实验室(Alibaba A.I.Labs)于2017年7月5日发布的AI智能语音终端设备.天猫精灵目前是全球销量第三.中国销量第一的智能音箱品牌 ...

  4. 帝国cms把文章加入到收藏夹代码

    内容模板加这个:<a href="[!--news.url--]e/member/fava/add/?classid=[!--classid--]&id=[!--id--]&q ...

  5. 在myeclipse安装beyond插件

    目录 文章背景 目录 环境介绍 安装步骤 说明 参考文章 版本记录 文章背景 myeclipse自带的比较工具感觉是有一些看不清晰,也不是太方便处理,然后就找了个比较插件了. 目录 环境介绍 myec ...

  6. sqlserver中常用的windows命令行的操作

    1.删除指定目录下指定时间之前的文件: ), ), @sqltxtdel varchar(max) --指定的删除时间 set @deldate= '-8' --指定的删除路径 set @bakpat ...

  7. JS中 reduce() 的用法

    过去有很长一段时间,我一直很难理解 reduce() 这个方法的具体用法,平时也很少用到它.事实上,如果你能真正了解它的话,其实在很多地方我们都可以用得上,那么今天我们就来简单聊聊JS中 reduce ...

  8. UVA 12676 Inverting Huffman

    题目链接:https://vjudge.net/problem/UVA-12676 题目大意 一串文本中包含 N 个不同字母,经过哈夫曼编码后,得到这 N 个字母的相应编码长度,求文本的最短可能长度. ...

  9. DNS隧道--dnscat2

    安装 服务端 git clone https://github.com/iagox86/dnscat2.git cd dnscat2 cd server sudo gem install bundle ...

  10. python爬虫_从零开始破解js加密(一)

    除了一些类似字体反爬之类的奇淫技巧,js加密应该是反爬相当常见的一部分了,这也是一个分水岭,我能解决基本js加密的才能算入阶. 最近正好遇到一个比较简单的js,跟大家分享一下迅雷网盘搜索_838888 ...