8.15 5个题

1.垃圾回收算法

    垃圾回收算法:标记-清除;复制算法;标记-整理;分代收集

标记-清除:标记所有需要回收的对象,在标记完成后统一清除需要回收的对象。

效率低且容易产生碎片空间。

复制算法:将可用内存分为大小相等的两块,每次只使用其中的一块,一块用完以后将还存活的对象复制到另一块上面,然后一次性清除已使用过的空间。不过现在都是分为一块Eden,两块Survivior,Eden:survivor:survivor=8:1:1,每次使用eden和一块survivor。

提高了效率但是内存缩小为原来的一半,代价有点高;

新生代,适合对象存活率低的时候效率高,对象存活率高的话复制操作太多。

标记-整理算法:和标记-清除算法类似,把需要回收的对象标记,后续操作不是直接进行清除,而是将还存活的对象都向一端移动,然后直接清理掉边界以外的内存。

老年代,对象存活率高的话采用这种

分代收集:当前商业虚拟机的垃圾收集都采用分代收集算法,根据对象存活周期将内存分为新生代和老年代,新生代对象存活时间短,那么采用复制算法;老年代对象存活时间长,采用标记-清除和标记-整理算法。

2.垃圾收集器

Serial收集器:新生代收集器,单线程收集器,复制算法,在垃圾收集的时候把其他所有的工作线程全部停掉;

Serial Old收集器:Serial的老年代版本,标记-整理算法;

ParNew收集器:Serial收集器的多线程版本;

Parallel Scavenge收集器:使用复制算法的新生代收集器,也是多线程收集器,吞吐量优先收集器;

Parallel Old收集器:Parallel Scanvenge的老年代版本,多线程和标记整理算法。

CMS收集器:以获取最短回收停顿时间为目的的收集器,标记-清除。

  • 初始标记,暂停工作线程/GC Roots Tracing。
  • 并发标记
  • 重新标记,暂停工作线程。
  • 并发清除

G1收集器:将整个堆划分为多个大小相等的独立区域,region,弱化了新生代和老年代的概念,标记-整理。

  • 初始标记,暂停工作线程
  • 并发标记
  • 最终标记
  • 筛选回收,根据用户所期望的GC停顿时间来制定回收计划。

如何触发minor GC和full GC?

  • Minor GC ,Full GC 触发条件:

Minor GC触发条件:当Eden区满时,触发Minor GC。

Full GC触发条件:

(1)调用System.gc时,系统建议执行Full GC,但是不必然执行

(2)老年代空间不足

(3)方法去空间不足

(4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存

(5)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小

Java堆:所有线程共享。虚拟机启动时创建。存放对象实力和数组。所占内存最大。分为新生代(Young区),老年代(Old区)。新生代分Eden区,Servior区。Servior区又分为From space区和To Space区。Eden区和Servior区的内存比为8:1。 当扩展内存大于可用内存,抛OOM。

  • GC流程  ,对象如何晋升到老年代

对象优先在新生代区中分配,若没有足够空间,Minor GC; 大对象(需要大量连续内存空间)直接进入老年态;长期存活的对象进入老年态。如果对象在新生代出生并经过第一次MGC后仍然存活,年龄+1,若年龄超过一定限制(15),则被晋升到老年态。

  1. 【对象优先在Eden中分配,当Eden中没有足够的空间分配时会促发一次Minor GC。每次Minor GC结束后,Eden区会清空,因为它会把Eden中还依然存活的对象放到Survivor中,当Survivor中放不下时,则由分派担保进入老年代中。
  2. 大对象直接进入老年代中。-XX:+PretenuerSizeThreshold 控制”大对象的“的大小。即当创建的对象大于这个临界值时,则该对象直接进入老年代。
  3. 长期存活的对象将进入老年代。虚拟机对每个对象定义了一个对象年龄(Age)计数器。当年龄增加到一定的临界值时,就会晋升到老年代中,该临界值由参数:-XX:MaxTenuringThreshold来设置。如果对象在Eden出生并在第一次发生Minor GC时仍然存活,并且能够被Survivor中所容纳的话,则该对象会被移动到Survivor中,并且设Age=1;以后每经历一次Minor GC,该对象还存活的话会被移动到另一个Survivor区中,并且Age=Age+1。
  4. 动态对象年龄判定:如上所示,虚拟机并不总是要求对象的年龄必须达到MaxTenuringThreshold才能晋升到老年代,如果在Survivor区中相同年龄(设年龄为age)的对象的所有大小之和超过Survivor空间的一半,年龄大于或等于该年龄(age)的对象就可以直接进入老年代,无需等到MaxTenuringThreshold中要求的年龄。】

3.数据库隔离级别

事务的4个属性:原子性,一致性,隔离性,持久性(ACID)

并发事务带来的问题:

  • 更新丢失,两个事务同时修改一个数据,T2提交的结果覆盖了T1提交的结果;
  • 脏读,读到了其他事务尚未提交的数据,如果事务回滚就读到了错误数据;
  • 不可重复读,在一个事务内多次读一个数据,在读操作之间有别的数据修改了该数据,多次读的结果不一致;
  • 幻读:统计计数的时候出的错!!

隔离级别介绍:

  • 读未提交数据:允许事务读取未被其他事务提交的数据。会造成脏读 读的时候不加锁
  • 读已提交数据:允许事务读取已经被其它事务提交的变更。会造成不可重复读!解决了脏读 读的时候加锁,加完马上释放。
  • 可重复读:确保事务可以多次从一个字段中读取相同的值。解决了不可重复度。对整个事物加锁,可能出现幻读。
  • 可串行化:所有事务都一个接一个地串行执行。

4.HashMap底层原理

5.ArrayList,LinkedList和Vector的区别和实现原理

从线程安全;扩容机制;增删改查的频率三方面来说

猜你喜欢

转载自blog.csdn.net/hellodake/article/details/81698183