##1.Jvm运行期实例负责运行java程序,但java程序启动时便创建了一个jvm实例,当程序结束时,该实例也消失. 一般,JVM的内存分为两部分:Stack和Heap。
##2.栈stack是解决程序运行问题,代表逻辑,堆heap解决数据的存储问题,代表数据。一个线程都有一个线程栈对应,而堆可以被多个栈共享.
##3.堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用
##4。一般,JVM的内存分为两部分:Stack和Heap。程序永远都是在栈stack中运行的.
###4.JVM调优的最基本的方向是怎样回收垃圾(不使用的对象)才有效并且节省空间.
###5.垃圾回收是从哪里开始的? 因为程序是在栈中执行的,所以要知道哪些对象被使用,则需要从栈stack开始,这样以栈中的引用为起点,可以找到对应的堆中的对象,从这个对象又可以找到堆中其他被引用的对象,这种引用逐步展开,这样形成一颗以java栈中引用所对应的对象为根节点的对象树,如果栈中有多个引用便存在多个对象树,这些对象树上的对象都是当前系统运行需要的对象,不能被回收,而堆中其他剩余的对象可以视为无法被引用的对象,可以当作垃圾进行回收。---〉以下所说的回收策略在标记清除和标记整理都是从根节点开始遍历标记的.
同时,除了栈外,还有系统运行时的寄存器等,也是存储程序运行数据的。这样,以栈或寄存器中的引用为
起点,我们可以找到堆中的对象,又从这些对象找到对堆中其他对象的引用,这种引用逐步扩展,最终以null引
用或者基本类型结束,这样就形成了一颗以Java栈中引用所对应的对象为根节点的一颗对象树,如果栈中有多
个引用,则最终会形成多颗对象树。在这些对象树上的对象,都是当前系统运行所需要的对象,不能被垃圾回
收。而其他剩余对象,则可以视为无法被引用到的对象,可以被当做垃圾进行回收。
因此,
垃圾回收的起点是一些根对象(java栈, 静态变量, 寄存器...)。而最简单的Java栈就是Java程序执行的
main函数。这种回收方式,也是上面提到的“标记-清除”的回收方式
---->接下来要问的是什么时候开始垃圾回收?在介绍完垃圾回收算法法后再说。
##6.垃圾回收算法 :
$1.按回收策略分有:
引用计数(引用就加1,删除一个引用就减1,最后回收0计数的)但无法处理循环引用问题。
标记清除:从根节点开始第一次遍历先标记那些对象被引用,第二次遍历整个堆就删除没有被引用的. 需暂停整个应用,并会有碎片
复制:使用双倍空间,将正在被引用的复制到另一空间,但需要两倍空间。
标记整理: mark-compact, 也就是第一次遍历整个堆时,便标记哪个对象还被引用,然后第二次遍历堆时,便把未标记的对象清除(清理垃圾),同时把存活的对象压缩整理到堆的一块,这样便没有碎片.
$2〉按系统线程分:
串行收集(serial collector)使用单线程收集
并行收集(parallel Collector)使用多线程
并发收集(Concurrent Collector)无需暂停整个应用,上面两个要暂停.
$3)按分区对待的方式分 有增量收集和分代收集(上面那个两个不同角度的策略可以用到具体每个去上?---觉得三种可以结合起来用,只是角度和关注点不同: 比如在做选择时可以使用串行收集,也分代,那么在年轻代的收集时可以使用标记整理策略)
分代收集依据是因为不同对象有不同的生命周期,所以就可以
把不同生命周期的对象放在不同代上(不同的分区上),不同代上采用最适合它的垃圾回收方式进行回收.
如果不进行分代(分区)的话,每次垃圾回收都需要对整个堆空间进行遍历回收,那么花费时间会很长,在分代后,持久区基本没用遍历,其次是老年区也会做,主要是在年轻代做垃圾回收。
#2.
虚拟机中的共划分为三个代:
年轻代(Young Generation)、年老代(Old Generation)和持久代
(Permanent Generation)
。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系
不大。年轻代和年老代的划分是对垃圾收集影响比较大的。
年轻代:
所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。
年轻代分三个区。一个Eden区,两个Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来 对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。
年老代:
在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的
都是一些生命周期较长的对象。
持久代:
用于存放静态文件,如今Java类、方法等。和生命比较长的对象,如Session对象持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或
者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新
增的类。持久代大小通过-XX:MaxPermSize=<N>进行设置。
###3>什么情况下触发垃圾回收
由于对象进行了分代处理,因此垃圾回收区域、时间也不一样。GC有两种类型:
Scavenge GC和Full GC.
Scavenge GC:
一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,
清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲
出来。
相关推荐
一份JVM学习的笔记,含查看JVM运行时信息\JVM垃圾收集信息\JVM锁信息等
java之jvm学习笔记五(实践写自己的类装载器)
JVM学习笔记.docx
java之jvm学习笔记十一(访问控制器)-源码
jVM学习笔记.ppt
从JVM内存模型、常用JVM参数、垃圾回收算法和垃圾回收器等几个角度学习JVM
JVM学习笔记(缓慢更新).md
JVM 学习笔记(Java虚拟机)
JVM学习笔记核心知识点整理,包含类文件加载机制,运行时数据,JVM内存模型,GC算法,垃圾收集器分类等
java之jvm学习笔记八(实践对jar包的代码签名)
java之jvm学习笔记九(策略文件)
java之jvm学习笔记十二(访问控制器的栈校验机制)
java之jvm学习笔记十而(访问控制器的栈校验机制)
如果看过java之jvm学习笔记十一(访问控制器)这篇文章的人或许对着份源码会比较需要,仅仅作为交流之用,别吐槽。
jvm经典笔记
java之jvm学习笔记十而(访问控制器的栈校验机制)-步骤2源码
NULL 博文链接:https://cooldatabase.iteye.com/blog/634599
title: 黑马JVM学习笔记二 date: 2020-01-13 1:00:00 tags: JVM categories: JVM 黑马jvm 内存结构 内存结构总览图: 程序计数器 1.定义:Program Counter Register 程序计数器 (寄存器) 程序计数器是Java对物理...
对jvm内存模型&垃圾收集算法&类加载机制进行了整理,读者可以作为参考进行学习和探讨,,