1.JVM内存的分类程序计数器当前线程执行的代码的行号虚拟机栈.PDF

1.JVM内存的分类程序计数器当前线程执行的代码的行号虚拟机栈.PDF

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1.JVM内存的分类程序计数器当前线程执行的代码的行号虚拟机栈

1. JVM 内存的分类 程序计数器:当前线程执行的代码的行号 虚拟机栈: 本地方法栈: Java 堆: 方法区: 运行时常量池(属于方法区): 直接内存: 2. GC 标记对象的死活 A .引用计数法 给对象添加一个引用计数器,没当被引用的时候,计数器的值就加一。引用失效的时候减一, 当计数器的值为0 的时候就表示改对象可以被GC 回收了。 弊端:A-》B,B-》A ,那么AB 将永远不会被回收了。也就是引用有环的情况。 B.根搜索算法GC Roots Tracing 通过一个叫GC Roots 的对象作为起点,从这些结点开始向下搜索,搜索所走过的路径称为 引用链,当一个对象没有与任何的引用链相连的时候则改对象就可以被GC 回收回收了。GC Roots 包括:java 虚拟机栈中引用的对象,本地方法栈中引用的对象,方法区中常量引用的 对象,方法区中静态属性引用的对象。 当一个对象没有出现在引用链的时候,对象的生命就被判了缓刑:如果对象没有重写finalize() 方法或者finalize()方法已经被执行了一次了,这时候对象在GC 来到时候一定会被回收了, 否则会进入一个F-Queue 队列,执行finalize()方法。 3. GC 回收算法 A .标记-清除法:标记出没有用的对象,然后一个一个回收掉。两个问题:效率和空间问题。 产生很多的内存碎片,怡然不可以使用。 B.复制算法: 按照容量,划分二个大小相等的内存区域,当一块用完的时候将存活的对 象复制过来。 C .标记-整理法:将存活的对象向前移动,连续起来,然后将端以外的内存区域全部清空。 D.划代收集算法:一般分为新生代和老年代,新生代一般使用复制算法,老年代使用 “标 记-清除”或者“标记-整理”。 Java 堆内存的分配策略: 1. Young 区 又分为Eden 区,survivior 1 和survivior 2 。 一般小型的对象都会在 Eden 区上分配内存,当内存不够时候发生minor GC(年轻代的GC), 将存活的对象拷贝到survivor 1 区域,(此时2 是空的),然后清空Eden 在清理survivor1 的时候将存活的拷贝到2 区域,长时间存活的可以晋升到old 区。 这里是停止-复制算法。 2.Old 区一般使用标记清除或者标记整理的方法进行垃圾回收。 4. Class 的加载过程 一个class 在内存中要经过七个阶段:加载,验证,准备,解析,初始化,使用.卸载 类加载过程:加载.验证.准备.解析.初始化 这个三个阶段称为连接过程 1.加载过程: 1) 通过一个全类限定名称来获取定义此类的二进制字节流. 2) 将这个字节流所代表的静态数据结构转化为方法区的运行时数据结构 3) 在java 堆生成一个代表这个类的java .lang.class 对象,作为方法区这些数据访问的入口。 2.验证过程: 确保二进制字节流中包含的信息符合当前虚拟机的要求,并且不会危害到虚拟机自身的安 全。 文件格式验证,元数据验证,字节码验证,符号引用验证, 3.准备过程: 为类变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中分配。 注意两点:1. 类变量指的是static 类型的变量,实例变量分配在堆内存,不在这初始化。 如果仅仅是一个static 变量,那么将会被初始化为0,要是final static ,则被初始化为指定的 数值。-==》书上原话是这样的,通常情况下将会被初始化为0 。Static 直到被初始化后才 会被初始化为指定的数值。 4.解析阶段: 虚拟机将常量池内的符号引用替换成直接引用的过程 符号引用- 以符号来描述引用的目标 直接引用-可以是指向目标的指针,相对偏移量,或者能间接定位到目标的句柄 5.初始化阶段 初始化阶段就是执行类构造器clinit方法的过程。 该方法是编译器自动收集类中的多有类变量的赋值动作和静态语句块中的语句合并而成。编 译器收集的顺序就是语句在源文件中出现的顺序,静态语句块只能访问到他之前的变量,定 义在他之前的变量只能赋值不能访问。 父类的《clinit》方法在子类的之前调用完毕 5. 类加载器 Class 和classloader 一同确立了class 在虚拟机中的唯一性。 Classloader 有两种:1.启动类加载器,由c++完成,属于虚拟机的一部分。2.所有其他类加载 器,由java 语言实现,全部继承自抽象类java.lang.ClassLoader 细分又可分为三类: 启动类加载器 扩展类加载器 应用程序类加载器

文档评论(0)

2105194781 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档