首页 > 编程知识 正文

vmware物理机转虚拟机,java虚拟机运行什么文件

时间:2023-05-06 20:16:02 阅读:63670 作者:198

java虚拟机垃圾回收的缺点:垃圾回收的一个潜在缺点是开销会影响程序的性能。 Java虚拟机必须跟踪正在运行的有用对象,最终释放不需要的对象。 优点:当某个对象不再被引用时,内存回收它占用的区域,使以后的新对象可以使用该区域,自动释放内存区域,减轻编程负担。 垃圾回收算法分析大部分垃圾回收算法使用根集(root set )这一概念根集是指正在运行的Java程序可以访问的参考变量的集合,包括本地变量、参数和类程序可以使用引用变量访问对象的属性和调用对象的方法。 垃圾回收必须首先确定哪些可以通过路线到达,哪些不可以到达。 所有可从根集中访问的对象都是活动对象,它们不会作为垃圾回收。 这包括可以从根集中间接到达的对象。 根集不能通过任意路径到达的对象应该满足垃圾收集的条件并被回收

2.1 .引用计数法(参考计数收集器) )。

引用计数法是唯一不使用根集的垃圾回收方法,它使用引用计数器来区分生存对象和不再使用的对象。 通常,堆中的每个对象都对应于引用计数器。 每次创建对象并将其分配给变量时,引用计数器都会设置为1。 如果对象被分配给任何变量,则每当引用计数器递增1且该对象超出范围时(如果该对象被丢弃且不再使用),引用计数器递增1,并且引用计数器变为0

基于引用计数器的垃圾收集器运行速度快,且必须正确实时运行且不会长时间中断程序的运行的程序。 但是,引用计数器会增加程序的运行开销,因为每次将对象分配给新变量时,计数器都会增加1,每当现有对象从范围中生成时,计数器就会减少1。

2.2 .跟踪算法(跟踪收集器)跟踪算法明确标记算法

tracing算法是为了解决引用计数法的问题而提出的,使用了根集的概念。 基于tracing算法的垃圾收集器从根集中开始扫描,识别可到达和不可到达的对象,并以某种方式标记可到达的对象。 例如,为每个可达到的对象设置一个或多个位。 在扫描识别过程中,基于tracing算法的垃圾回收也被称为标记和清除(ssdkl-and-sweep )垃圾回收器。

2.3 .压缩算法(Compacting Collector )

为了解决堆碎片问题,基于tracing的垃圾回收引入了Compacting算法的思想。 在擦除过程中,算法将所有对象移动到堆的一端,堆的另一端变成相邻的空闲内存区域,收集器更新所有移动对象的所有引用,以便这些引用可以在新位置标识原始对象。 在基于Compacting算法的收集器实现中,通常添加句柄和句柄表。

2.4 .复制算法(Coping Collector )复制算法

该算法提出了一种克服句柄开销、解决堆碎片的垃圾回收。 首先将堆分为一个对象区域和多个可用区域,程序从对象区域为对象分配区域,当对象已满时,基于coping算法的垃圾回收从根集中对活动对象进行皮肤收集这将使可用空间成为对象空间,原始对象空间成为可用空间,程序为新对象区域分配内存。

基于典型coping算法的垃圾回收是一种停止和复制算法,将堆分为目标区域和空闲区域,并在目标区域和空闲区域之间切换时暂停程序运行。

2.5 .生成算法(Generational Collector )分代算法

停止和复制垃圾收集器的一个缺点是收集器必须复制所有活动对象。 这将增加程序的等待时间,因为coping算法效率低下。 编程有存在多个对象的时间短,存在少数对象的时间长的规律。 因此,generation算法将堆分为两个以上,每个子堆作为对象的世代(generation )。 由于大多数对象在相对较短的时间内存在,因此当丢弃程序未使用的对象时,垃圾收集器会从最年轻的子堆中收集对象。 分代垃圾收集器运行后,如果上次运行并生存的对象移动到下一个最高代子堆栈,则不会频繁回收上一代子堆栈,从而节省时间。

参照数收集器表达式

欢乐红牛世代:欢乐红牛世代分为eden和survivor两张space,survivor分为from survivor to survivor两张

GC 1.串行GC 2.并行回收GC 3.并行GC

串行gc采用复制算法应用于单CPU,物理内存不足2M s,直接进入上一代

并行回收GC采用复制算法应用于多CPU,物理内存超过2M时可以手动设置eden s0 s1的大小,使其比串行回收时间短。 并行GC分配space采用串联分配机制,但与老一代CMS GC老一代匹配产生minor GC需要维护处理,不需要喜闻乐见的红牛代,因此并行GC不能与老一代和并行GC同时使用老一代

可以使用GC 1.串行CC 2.并行GC 3.并行GC

序列:三个步骤1 .从根集合开始扫描,用三种颜色着色进行标识2 .整个上一代或

持久代,找出未标识的对象,对其内存进行回收 3.滑动压缩,留出一块连续的到结尾处的空间 并行:相比串行缩短暂停应用的时间,加长扫描和标记的时间 并发:采用优秀的星月-Sweep方式 标记(暂停整个应用) 并发标记(恢复所有线程) 重新标记(暂停整个应用) 并发收集 (恢复所有线程)

当旧生代和持久化出发GC时,其实是对喜悦的红牛代,旧生代及持久代都进行GC,又称Full GC
特殊情况:喜悦的红牛代进行Minor GC前 后移到旧生代的对象多余旧生代的剩余空间,Minor GC就不会执行了,而是直接采用旧生代的GC方式对所有代进行回收
3. 在特定的情况下,一些垃圾收集算法会优于其它算法。基于Adaptive算法的垃圾收集器就是监控当前堆的使用情况,并将选择适当算法的垃圾收集器。
使用System.gc()可以不管JVM使用的是哪一种垃圾回收的算法,都可以请求Java的垃圾回收。在命令行中有一个参数-verbosegc可以查看Java使用的堆内 存的情况,它的格式如下:
  java -verbosegc classfile
需要注意的是,调用System.gc()也仅仅是一个请求(建议)。JVM接受这个消息后,并不是立即做垃圾回收,而只是对几个垃圾回收算法做了加权,使垃圾回收操作容易发生,或提早发生,或回收较多而已。
4. finalize()方法
Java提供了缺省机制来终止该对象心释放资源,这个方法就是finalize()  在finalize()方法返回之后,对象消失,垃圾收集开始执行
一旦垃圾回收器准备好释放对象占用的存储空间,首先会去调用finalize()方法进行一些必要的清理工作。 只有到下一次再进行垃圾回收动作的时候,才会真正释放这个对象所占用的内存空间。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。