JVM性能优化专题(二)

10、深拷贝和浅拷贝。

简单来讲就是复制、克隆。

Person p=new Person(“ 张三”);

浅拷贝就是对对象中的数据成员进行简单赋值,如果存在动态成员或者指针就会报错。

深拷贝就是对对象中存在的动态成员或指针重新开辟内存空间。

11、 System.gc()和 Runtime.gc()会做什么事情?

这两个方法用来提示JVM要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决于JVM的。

12、 finalize。方法什么时候被调用?析构函数(finalization)的目的是什么?

垃圾回收器(garbage colector)决定回收某对象时,就会运行该对象的 finalize。方法但是在Java中很不幸,如果内存总是充足的,那么垃圾回 收可能永远不会进行,也就是说filalize。可能永远不被执行,显然指望它 做收尾工作是靠不住的。那么finalize。究竟是做什么的呢?它最主要的用 途是回收特殊渠道申请的内存。Java程序有垃圾回收器,所以一般情况 下内存问题不用程序员操心。但有一种JNI(Java Native Interface)调用 non-Java程序(C或C++), finalize。的工作就是回收这部分的内存。

13、 如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?

不会,在下一个垃圾回收周期中,这个对象将是可被回收的。

14、 什么是分布式垃圾回收(DGC)?它是如何工作的?

DGC叫做分布式垃圾回收。RMI使用DGC来做自动垃圾回收。因为RMI 包含了跨虚拟机的远程对象的引用,垃圾回收是很困难的。DGC使用引 用计数算法来给远程对象提供自动内存管理。

15、 串行(serial)收集器和吞吐量(throughput )收集器的区别是什么?吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规 模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上需 要大概100M左右的内存)就足够了。

16、在Java中,对象什么时候可以被垃圾回收?当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了。

17、 简述Java内存分配与回收策率以及Minor GC和Major GC。

对象优先在堆的Eden区分配

大对象直接进入老年代

长期存活的对象将直接进入老年代

当Eden区没有足够的空间进行分配时,虚拟机会执行一次Minor GCO Minor GC通常发生在新生代的Eden区,在这个区的对象生存期短,往 往发生Gc的频率较高,回收速度比较快;Full GC/Major GC发生在老年 代,一般情况下,触发老年代GC的时候不会触发Minor GC,但是通过 配置,可以在Full GC之前进行一次Minor GC这样可以加快老年代的回收速度。

18、 JVM的永久代中会发生垃圾回收么?

垃圾回收不会发生在永久代, 如果永久代满了或者是超过了临界值, 会触发完全垃圾回收(Full GC)。

注:Java 8中已经移除了永久代,新加了一个叫做元数据区的native内存区。

19、 Java中垃圾收集的方法有哪些?

标记-清除:这是垃圾收集算法中最基础的,根据名字就可以知道,它的 思想就是标记那些要被回收的对象,然后统一回收。这种方法很简单,但 是会有两个主要问题:

1. 效率不高,标记和清除的效率都很低;

2. 会产生大量不连续的内存碎片,导致以后程序在分配较大的对象时,由于没有充足的连续内存而提前触发一次GC动作。

复制算法:为了解决效率问题,复制算法将可用内存按容量划分为相等的两部分,然后每次只使用其中的一块,当一块内存用完时,就将还存活的对 象复制到第二块内存上,然后一次性清除完第一块内存,再将第二块上的对象复制到第一块。但是这种方式,内存的代价太高,每次基本上都要浪费一般的内存。

于是将该算法进行了改进,内存区域不再是按照1:1去划分,而是将内存 划分为8:1:1三部分,较大那份内存交Eden区,其余是两块较小的内存区叫Survior区。每次都会优先使用Eden区,若Eden区满,就将对象复制到第二块内存区上,然后清除Eden区,如果此时存活的对象太多, 以至于Survivor不够时,会将这些对象通过分配担保机制复制到老年代

中。(java堆又分为新生代和老年代)

标记-整理:该算法主要是为了解决标记-清除,产生大量内存碎片的问 题;当对象存活率较高时,也解决了复制算法的效率问题。它的不同之处 就是在清除对象的时候先将可回收对象移动到一端,然后清除掉端边界以外的对象,这样就不会产生内存碎片了。

分代收集:现在的虚拟机垃圾收集大多采用这种方式,它根据对象的生存周期,将堆分为新生代和老年代。在新生代中,由于对象生存期短,每次回收都会有大量对象死去,那么这时就采用复制算法。老年代里的对象存活率较高,没有额外的空间进行分配担保。

20、 什么是类加载器,类加载器有哪些?

实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。 主要有以下四种类加载器:

启动类加载器(BootstrapCIassLoader)用来加载Java核心类库,无法被 Java程序直接引用。

扩展类加载器(extensions class loader):它用来加载Java的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载Java类。

系统类加载器(system class loader):它根据Java应用的类路径 (CLASSPATH)来加载Java类。一般来说,Java应用的类都是由它来完成加载的。可以通过ClassLoader.getSystemClassLoader。来获取它。

用户自定义类加载器,通过继承java.lang.ClassLoader类的方式实现。

21、 类加载器双亲委派模型机制?

当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派 给父类,由父类去加载,如果此时父类不能加载,反馈给子类,由子类去完成类的加载。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值