垃圾回收机制
针对堆内存而言的。当调用构造方法的时候,创建好一个对象,因为Java中对每种数据类型都明确的给定了大小,在创建对象的时候,会自动计算大小分配内存,所以在内存的回收和释放的时候也是由Java自己管理。
java垃圾回收判断是否回收的算法,有两种,一个是引用计数法,一个是引用可达法。
引用计数法,每个对象有一个专门的空间维护一个引用计数器,当该对象被引用时,计数器加一,引用消失时则计数器减一,当该对象引用数为0时则回收该对象。这个算法有一个好处就是可以及时回收废弃的对象,而不用等到空间占满后在统一回收,但是其无法解决循环引用的情况。
而引用可达性分析法,则是选取一个root节点,通过该节点是否能够遍历到某个对象的方法来判断该对象是否被回收。root节点的选择通常是静态变量,native变量,常量等。
垃圾回收清除算法有三种
1.标记清除
也就是每次GC,会先扫描内存区标记存活对象,而后释放未被标记的对象空间。这种算法在工作时需要停止工作线程,再进行标记清除,同时会产生内存碎片,而且jvm需要维护一个内存空间表,用于分配内存空间。
2.复制清除
将内存区分为两个相同大小的区域,先在A上分配对象,当其分配满后,进行标记操作,而后将标记对象按照内存顺序复制到B区域中,最后将A区域全部清除。这种方式可以有效避免内存碎片的问题,但是复制操作会产生额外的耗时,当存活对象多时并不适合使用该算法,因为复制所产生的耗时会很长。因此这种算法适合对象存活时间短的情况。同时会造成一定的内存浪费。
3.标记整理
这种算法就是在标记清除的基础上为了避免内存碎片的产生而优化产生的算法。总的过程分为两步,分别是标记和整理。
新生代由于其对象存活时间短,且需要经常gc,因此采用效率较高的复制算法。一个对象刚创建的时候是放到新生代的伊甸园区,如果这个对象在栈内存中没有引用,那么会在扫描的时候被解析,释放内存;如果经过一次扫描依然没有释放内存,会将其移入新生代的幸存区,幸存区的扫描频率略低于伊甸园区;如果在幸存区经过多次扫描依然没有被释放,会被放入老生代,老生代的扫描频率远远低于新生代的。老生代中的对象一旦被回收,可能会造成程序的卡顿或者崩溃。
老年代和永久代因为其存活对象时间长,因此使用标记清除或标记整理算法。
发生在新生代的回收称之为minor GC(Garbage Collect)---初代回收
发生在老生代的回收称之为full GC---完全回收
类加载器
启动类加载器/引导类加载器
扩展类加载器
系统类加载器
***双亲委派机制
每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.class”文件,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程称为类加载。
推荐:去网上看吧····作为一个刚接触java的小菜鸟 这个属实有点难度。推荐看这两个
https://blog.youkuaiyun.com/sunxianghuang/article/details/52093189
https://blog.youkuaiyun.com/javazejian/article/details/73413292