写点什么

Week 09 命题作业

用户头像
Jeremy
关注
发布于: 2020 年 08 月 06 日
Week 09 命题作业

JVM

Java 虚拟机 Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制。JVM实现了Java语言最重要的特征:即平台无关性。原理:编译后的 Java 程序指令并不直接在硬件系统的 CPU 上执行,而是由 JVM 执行。JVM屏蔽了与具体平台相关的信息,使Java语言编译程序只需要生成在JVM上运行的目标字节码(.class),就可以在多种平台上不加修改地运行。Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。因此实现java平台无关性。它是 Java 程序能在多平台间进行无缝移植的可靠保证,同时也是 Java 程序的安全检验引擎(还进行安全检查)。

JVM 是 编译后的 Java 程序(.class文件)和硬件系统之间的接口 ( 编译后:javac 是收录于 JDK 中的 Java 语言编译器。该工具可以将后缀名为. java 的源文件编译为后缀名为. class 的可以运行于 Java 虚拟机的字节码。)



classloader

作用:装载.class文件

classloader 有两种装载class的方式 (时机):

  1. 隐式:运行过程中,碰到new方式生成对象时,隐式调用classLoader到JVM

  2. 显式:通过class.forname()动态加载



垃圾回收技术



方法一:引用计数法。简单但速度很慢。缺陷是:不能处理循环引用的情况。

方法二:停止-复制(stop and copy)。效率低,需要的空间大,优点,不会产生碎片。

方法三:标记 - 清除算法 (mark and sweep)。速度较快,占用空间少,标记清除后会产生大量的碎片。



JAVA虚拟机中是如何做的?

java的做法很聪明,我们称之为"自适应"的垃圾回收器,或者是"自适应的、分代的、停止-复制、标记-清扫"式垃圾回收器。它会根据不同的环境和需要选择不同的处理方式。



heap组成



由于GC需要消耗一些资源和时间的,Java在对对象的生命周期特征进行分析后,采用了分代的方式来进行对象的收集,即按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停.

heap 的组成有三区域/世代:(可以理解随着时间,对象实例不断变换heap中的等级,有点像年级)



新生代 Young Generation

  1. Eden Space 任何新进入运行时数据区域的实例都会存放在此

  2. S0 Suvivor Space 存在时间较长,经过垃圾回收没有被清除的实例,就从Eden 搬到了S0

  3. S1 Survivor Space 同理,存在时间更长的实例,就从S0 搬到了S1

旧生代 Old Generation/tenured

同理,存在时间更长的实例,对象多次回收没被清除,就从S1 搬到了tenured

Perm 存放运行时数据区的方法区



Java 不同的世代使用不同的 GC 算法。



Minor collection:

新生代 Young Generation 使用将 Eden 还有 Survivor 内的数据利用 semi-space 做复制收集(Copying collection), 并将原本 Survivor 内经过多次垃圾收集仍然存活的对象移动到 Tenured。

Major collection 则会进行 Minor collection,Tenured 世代则进行标记压缩收集。





To note that:

这个搬运工作都是GC 完成的,这也是garbage collector 的名字来源,而不是叫garbage cleaner. GC负责在heap中搬运实例,以及收回存储空间。



GC工作原理



JVM 分别对新生代和旧生代采用不同的垃圾回收机制



何为垃圾?



Java中那些不可达的对象就会变成垃圾。那么什么叫做不可达?其实就是没有办法再引用到该对象了。主要有以下情况使对象变为垃圾:

1.对非线程的对象来说,所有的活动线程都不能访问该对象,那么该对象就会变为垃圾。

2.对线程对象来说,满足上面的条件,且线程未启动或者已停止。



例如:
(1)改变对象的引用,如置为null或者指向其他对象。
Object x=new Object();//object1
Object y=new Object();//object2
x=y;//object1 变为垃圾
x=y=null;//object2 变为垃圾

(2)超出作用域
if(i==0){
Object x=new Object();//object1
}//括号结束后object1将无法被引用,变为垃圾
(3)类嵌套导致未完全释放
class A{
A a;
}
A x= new A();//分配一个空间
x.a= new A();//又分配了一个空间
x=null;//将会产生两个垃圾
(4)线程中的垃圾
class A implements Runnable{
void run(){
//....
}
}
//main
A x=new A();//object1
x.start();
x=null;//等线程执行完后object1才被认定为垃圾
这样看,确实在代码执行过程中会产生很多垃圾,不过不用担心,java可以有效地处理他们。







JVM中将对象的引用分为了四种类型,不同的对象引用类型会造成GC采用不同的方法进行回收:

(1)强引用:默认情况下,对象采用的均为强引用

(GC不会回收)

(2)软引用:软引用是Java中提供的一种比较适合于缓存场景的应用

(只有在内存不够用的情况下才会被GC)

(3)弱引用:在GC时一定会被GC回收

(4)虚引用:在GC时一定会被GC回收



用户头像

Jeremy

关注

还未添加个人签名 2018.01.21 加入

还未添加个人简介

评论

发布
暂无评论
Week 09 命题作业