1.关于gc
1.java JVM将堆区分代成新生代,年老代,永久代三部分:
新生代中分为一个E区,两个S区。新创建的对象会被分配到E区。每个对象身上会有一个年龄一开始为0。当E区内存不足时会进行一次minor gc,剩下的对象会被复制到其中的一个S区。同时每个对象年龄+1,垃圾对象会被清除。等到E区内存再次不足时再次进行minor gc。E区剩下的对象和其中一个S区的对象会被复制到另一个S区中并且所有对象年龄+1。同时清除E区中的垃圾对象。当S区中对象达到一定年龄,对象会被复制到年老代中。年老代中的内存不足时会进行full gc清除垃圾对象释放空间。永久代中主要是存放类的class文件,静态变量,字符串这类数据。
2.gc算法有标记-清除算法,标记-压缩算法,复制算法:
标记过程指gc通过遍历内存对哪些数据在使用,哪些数据没有在使用会做标记。
清除过程会将标记没有在使用的对象回收,同时会将清除对象后空闲空间维护成一个链表,以便再次新建对象时使用。
压缩指对象被清除后内存中会产生许多大的内存碎片,对象与对象之间的地址不连续。如果再次插入对象时进行空闲空间链表的遍历,然后插入到内存中很费时。所以会将内存区的对象全部移动到内存区的头部。把琐碎的内存碎片整理成一个大的内存块。这样在下次新建对象,分配内存时提高效率。
3.为什么要采用分带回收?
因为根据经验所谈,新创建的对象可能会很快的被回收,如果不分带,就需要经常进行gc。分带以后将存活时间短的对象和存活时间长的对象进行分开。存活时间短的对象经常进行gc,存活时间长的对象gc慢一些。提高gc效率。
2.类的生命周期(简述)
一个类文件的生命周期分为 编译-加载-链接-初始化-销毁
编译阶段:.java文件编译成.class文件。
加载阶段:.class二进制字节码文件通过相应的classloader加载到jvm虚拟机内存中。
链接阶段:分为验证-准备-解析三个步骤。验证主要是验证类结构的合法性,语法语义词法,类的字节码文件是否合法,类与类的引用关系是否正确,比如A类中有B的引用,会检查是否存在B类。如果存在B类会先加载B类再加载A类。准备会为类中的静态变量分配内存,设置默认的静态变量。解析时会将类中的符号引用转化为具体的直接引用。
初始化阶段:为类的静态变量分配具体的值。
销毁阶段:类被加载到JVM内存中基本上不会被销毁了,它会随着JVM的停止而释放内存。
3.JDK与JRE
jdk是java开发环境,jdk中包括jre(java运行环境,jre中包括jvm和java核心类库)、java工具(像是java和javac命令)、java标准类库(rt.jar)。如果你只安装了jre那么恭喜你可以在电脑上运行java程序,如果你安装了jdk那么既可以开发java程序进行编译也可以将程序运行在你的电脑上。
不定时更新中..