想要识别java,就需要安装相应的识别工具,这就是JVM。
JVM就相当于一个翻译,使得同一个java程序可以在三个不同的平台上运行。
JVM将.java文件转换成.class文件
垃圾回收机制:GC
用于回收内存,开了一个线程区自动监测那些内存不用了就去回收掉
优点:自动性,而C/C++就需要手动编写
缺点:回收不及时,由于现在电脑内存越来越大,所以java的缺点就不怎么明显
原则:
宁可回收慢,不可不回收
GC(Garbage Collection)垃圾回收。
-哪些内存需要回收
程序计数器,虚拟机栈,本地方法栈随着线程一起生灭。
栈帧分配多少内存基本是在类结构确定下来时就已知了。
而堆和方法区就不一样,一个接口中的多个实现类需要的内存可能不一样,一个发那个法中多个分支需要的内存也可能不一样。我么你只有在程序运行时才会知道。
这部分内存的分配和回收都是动态的,也是GC关注的
1.引用计数算法:
对象头有一个counter计数器,引用一次+1,引用失效一次-1,到0该对象无效回收
主流jvm没有选用该算法因为他很那解决对象互相循环问题,那么可能导致计数永远不会为0
2.可达性分析算法:
从GC Roots(jvm中引用的对象,本地方法栈引用的对象,方法区产量引用的对象,方法区类静态属性引用的对象)为起点向下搜索,走过的路径为引用链,但一个对象没有任何引用链相连是,他就是无效的。
四种引力:
-强引力(Strong Reference):垃圾收集器不会回收被引用的对象,只有为null时才回收。但是赋给static变量,那么长时间不回收会造成内存泄漏。
-软引力(soft Reference):相较于强引力较弱,只有JVM认为内存不足才会试图回收软引力的对象
-弱引力(Weak Reference):但JVM回收时,无论内存是否充足都会被回收。
-虚引力Phantom Reference):作用只是在回收时能发出通知。
-什么时候回收
1.标记-清除(Mark-Sweep)算法
最简单最基础的算法,简单快速,但是效率 不高,而且会产生大量内存碎片。
2.复制(Copying)算法
将可用内存划分长大小相等的两块,每次使用其中一块,当快用完了,就把还存活的对象移到另一块上,清理全部空间。
没有内存碎片,只要一动堆顶指针按顺序分配内存,简单高效,缺点是可用内存只有原来一半。
现代商业虚拟机不需1:1,只需划分较大一块和较小两块空间,每次使用较大的一块和较小的一块。
3.标记-整理法
基于标记清除法,但是不是直接对可回收对象清理,而是让所有存活对象都想一段移动,直接清理另一端便捷的内存
网友评论