最新垃圾收集器与内存分配策略,大牛带你直击优秀开源框架灵魂

文末

我将这三次阿里面试的题目全部分专题整理出来,并附带上详细的答案解析,生成了一份PDF文档

  • 第一个要分享给大家的就是算法和数据结构

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

  • 第二个就是数据库的高频知识点与性能优化

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

  • 第三个则是并发编程(72个知识点学习)

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

  • 最后一个是各大JAVA架构专题的面试点+解析+我的一些学习的书籍资料

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

}

}

objA 和objB是相互引用的,如果是采用计数器的算法,两次输出应该是一样的,如果是采用可达性分析的算法,第二次会报错,因为两个对象被回收了,这样操作两个对象会报错找不到。运行结果。

第一次

chapter.three.ReferenceCountingGC@15db9742

chapter.three.ReferenceCountingGC@6d06d69c

第二次

Exception in thread “main” java.lang.NullPointerException

at chapter.three.ReferenceCountingGC.testGC(ReferenceCountingGC.java:34)

at chapter.three.ReferenceCountingGC.main(ReferenceCountingGC.java:43)

拓展讲一点吧,其实这个不是很重要,了解一下

另外书中还讲了一点,哪些不可达的对象,也不一定就会被回收,并没有直接判死刑,而是判的缓刑,有一次自救的机会。也就是说,所有的“GC Roots”根节点都无法到该对象时,该对象会被标记一次,并对其进行一次筛选。筛选的条件是改对象有没有重写finalize()方法,如果没有重写,那么该对象就会被判死刑,会被回收。如果该对象有重写finalize()方法,就会执行这个方法,对象可以在这个方法中自救。但是这个方法只会条用一次,也就是说第二次如果还是不可达还是会被回收掉。不知道大家有没有理解,下面看一个例子

ackage chapter.three;

public class FinalizeEscapeGC {

public static FinalizeEscapeGC SAVE_HOOK=null;

public void isAlive(){

  System.out.println("yes,i am still alive...");

}

@Override

protected void finalize() throws Throwable {

  super.finalize();
  System.out.println("finalize method executed !");
  FinalizeEscapeGC.SAVE_HOOK=this;

}

public static void main(String[] args) throws InterruptedException {

  SAVE_HOOK=new FinalizeEscapeGC();
  System.out.println("first:");
  SAVE_HOOK=null;
  System.gc();
  Thread.sleep(500);
  if(SAVE_HOOK !=null){
  	SAVE_HOOK.isAlive();
  }else {
  	System.out.println("no,i am dead...");
  }
  System.out.println("second:");
  SAVE_HOOK=null;
  System.gc();
  Thread.sleep(500);
  if(SAVE_HOOK !=null){
  	SAVE_HOOK.isAlive();
  }else {
  	System.out.println("no,i am dead...");
  }

}

}

结果:

first:

finalize method executed !

yes,i am still alive…

second:

no,i am dead…

但是书中建议我们最好不要这么做,因为finalize()能做的,try-finally语句或者其他的语句就能做,,且做的更好,所以我这也是简单的提一下。

垃圾收集算法

有4种,标记-清除算法,复制算法,标记整理算法,分代收集算法。其实也就三种,以为分代收集算就是不同场景使用前面的三种方法。

  1. 标记清除算法 :就是先将需要回收的内存标记,然后清除掉。这种算法思路简单,但是会造成内存分布零散,存储大文件会导致触发一次GC.

  2. 复制算法:是将内存按照容量划分成大小相等的两块,每次都只使用其中的一块,其中一块内存使用完了,就会统计出这块内存中存活的对象复制到另一块内存中,并且清理当前快,这样循环使用。但是这样的缺点就是导师内存使用率太低,总有一半的内存在闲置状态。

  3. 标记整理的算法,标记整理算法也是先将需要回收的内存进行整理,然后并不是直接清理掉,而是将存活的对象向前移动,保存内存的前面都是存活的对象,然后清理掉回收的对象。这样做的解决了标记清除算法导致的内存可用空间分布的太散的问题,但是这样做的缺点就是效率低下。

  4. 分代收集算法:是把java堆分为老年代,新生代。新生代中对象存活时间普遍短使用复制的算法,老年代对象周期较长,采用标记整理算法或者标记清除算法。

垃圾收集器

上面的算法部分都是回收的理论,现在垃圾收集器则是内存回收的具体实现啦,虚拟机中存在很多的收集器,并且这些收集器是配合使用的,各种收集器有各自的优缺点,下图是HotSpot虚拟机中使用的垃圾收集器,以及这些收集器之间哪些是可以搭配只用的。

在这里插入图片描述

  1. serial收集器:是一个单线程收集器,只有一个cpu或者一条收集线程去进行收集,而且更重要的是在收集线程在进行垃圾收集的过程中会暂停用所有的用户线程,导致用户进行等待。

  2. ParNew收集器:ParNew收集器是serial收集器的多线程版本,但是一样的,在收集线程工作时,所有的用户线程会进行等待。

  3. parallel Scavenge收集器 是一个新生代收集器,使用的复制算法,是并行的多线程。这个收集器关注点是吞吐量,吞吐量是指,虚拟机总共运行100s,垃圾收集占用1s,那么吞吐量就是99%。

  4. se’rial Old 收集器 是serial收集器的老年代版本,采用的是标记整理的算法。一样是一个单线程收集器。

  5. parallel Old 收集器是parallel Scavenge收集器的老年代版本,采用的是标记整理的算法,多线程。

  6. GMS收集器:是一种获取最短回收停顿时间为目标的收集器。是基于标记清除 的算法实现的。有4个过程:

初始标记

并发标记

重新标记

并发清除


其中 初始标记和重新标记两部依然会“stop the world”也就是说这两部还是会造成用户线程等待,但是相对而言等待的时间要短很多。

  1. G1收集器,是一种面向服务器的收集器,具备以下特点:

并行与并发

分代收集

空间整合

可预测的停顿


G1收集器大致分为以下几个步骤

初始标记

并发标记

最终标记

筛选回收

内存分配与回收策略

写在最后

作为一名即将求职的程序员,面对一个可能跟近些年非常不同的 2019 年,你的就业机会和风口会出现在哪里?在这种新环境下,工作应该选择大厂还是小公司?已有几年工作经验的老兵,又应该如何保持和提升自身竞争力,转被动为主动?

就目前大环境来看,跳槽成功的难度比往年高很多。一个明显的感受:今年的面试,无论一面还是二面,都很考验Java程序员的技术功底。

最近我整理了一份复习用的面试题及面试高频的考点题及技术点梳理成一份“Java经典面试问题(含答案解析).pdf和一份网上搜集的“Java程序员面试笔试真题库.pdf”(实际上比预期多花了不少精力),包含分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货!

由于篇幅有限,为了方便大家观看,这里以图片的形式给大家展示部分的目录和答案截图!

Java经典面试问题(含答案解析)

阿里巴巴技术笔试心得

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

77)]

阿里巴巴技术笔试心得

[外链图片转存中…(img-NRKkz49E-1715666116777)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值