先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
}
}
class House{
private static final Integer DOOR_NUMBER = 4000;
public Door[] doors = new Door[DOOR_NUMBER];
class Door{}
}
正常运行一段时间,内存到达耗尽的临近状态,House$Door 超过10MB左右,内存占比达到百分之七八十。
软引用的特性在数秒之后产生价值,House对象从千数量级迅速降到百数量级,内存容量迅速被释放出来。保证了程序的正常执行。
软引用SoftReference 的父类 Reference的属性: private T referent, 它指向new House()对象,而SoftReference 的get(),也是调用了super.get() 来访问父类这个私有属性。大量的House 在内存即将耗尽前,成功地一次次被清理掉。
对象buyer2虽然是引用类型,但其本身碍事占用一定内存空间的,它是被集合 ArrayList 强引用劫持的,在不断循环执行 houses.add() 后,终究会产生 OOM。
软引用、弱引用、虚引用均存在带有队列的构造方法
public SoftReference(T referent, ReferenceQueue<? super T> q) {
super(referent, q);
this.timestamp = clock;
}
可以在队列中检查哪个软引用的对象被回收了,从而把失去House 的软引用对象清理掉。
软引用一般用于在同一服务器内缓存中间结果。如果命中缓存,则提取缓存结果,否则重新计算或获取。但是,软引用肯定不是用来缓存高频数据结构的,万一服务器重启或者软引用触发大规模回收,所有的访问将直接指向数据库,导致数据库压力时大时小,甚至崩溃。
弱引用
代码如下:
public class WeakReferenceWhenIdle {
public static void main(String[] args) {
House seller = new House();
WeakReference buyer3 = new WeakReference<>(seller);
seller = null;
long start = System.nanoTime();
long count = 0;
while (true){
if(buyer3.get() == null)
{
long duration = (System.nanoTime()- start)/(1000*1000);
System.out.println("house is null and exited time = "+duration +“ms”);
break;
}else{
System.out.println(“still there.count=”+count++);
}
}
}
}
执行结果如下:
house is null and exited time = 964ms
Heap
PSYoungGen total 75776K, used 2733K [0x000000076bf80000, 0x0000000771400000, 0x00000007c0000000)
eden space 65024K, 2% used [0x000000076bf80000,0x000000076c161470,0x000000076ff00000)
from space 10752K, 7% used [0x000000076ff00000,0x000000076ffca020,0x0000000770980000)
to space 10752K, 0% used [0x0000000770980000,0x0000000770980000,0x0000000771400000)
ParOldGen total 173568K, used 8K [0x00000006c3e00000, 0x00000006ce780000, 0x000000076bf80000)
object space 173568K, 0% used [0x00000006c3e00000,0x00000006c3e02000,0x00000006ce780000)
Metaspace used 3541K, capacity 4502K, committed 4864K, reserved 1056768K
class space used 388K, capacity 390K, committed 512K, reserved 1048576K
这个示例代码在YGC下,可以轻松回收 WeakReference指向的new House() 对象,WeakReference 典型的应用是WeakHashMap中。
在刚才的房源案例中,卖家的房子对应一些列房源资料,如果卖家的房源已经售出,则中介也不需要一直保存相关信息,自动回收存储空间即可,如下代码:
public class WeakHashMapTest {
public static void main(String[] args) {
House seller1 = new House(“1号卖家房源.”);
SellerInfo sellerInfo1 = new SellerInfo();
House seller2 = new House(“2号卖家房源”);
SellerInfo sellerInfo2 = new SellerInfo();
WeakHashMap<House,SellerInfo> weakHashMap = new WeakHashMap<>();
//如果换成 HashMap ,则Key是对House对象的强引用
weakHashMap.put(seller1,sellerInfo1);
weakHashMap.put(seller2,sellerInfo2);
System.out.println(“weakHashMap before null,size=”+weakHashMap.size());
seller1 = null;
System.gc();
System.runFinalization();
//如果换成 HashMap ,size 依然等于2
System.out.println("weakHashMap after null, size = "+weakHashMap.size());
System.out.println(weakHashMap);
}
}
class SellerInfo{}
执行结果如下:
总结
上述知识点,囊括了目前互联网企业的主流应用技术以及能让你成为“香饽饽”的高级架构知识,每个笔记里面几乎都带有实战内容。
很多人担心学了容易忘,这里教你一个方法,那就是重复学习。
打个比方,假如你正在学习 spring 注解,突然发现了一个注解@Aspect,不知道干什么用的,你可能会去查看源码或者通过博客学习,花了半小时终于弄懂了,下次又看到@Aspect 了,你有点郁闷了,上次好像在哪哪哪学习,你快速打开网页花了五分钟又学会了。
从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。
人的本性就是容易遗忘,只有不断加深印象、重复学习才能真正掌握,所以很多书我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-0JKTkcmI-1713606599970)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!