很高兴认识你,今天我决定重新运营我的个人网站!
本站建于2018年,写了些文章,2019年几乎没动,于是今年打算重新整理,删除了部分文章,作为2020的新开始。
本网站主要是写一些技术文章,但也会穿插一些生活中的随笔,希望可以得到你的关注哦~
单例模式的8种写法区别
适用场景:
无状态的工具类,很多工具类我们只需要一个实例,节省内存。但是大家的写法非常多,正确的写法却很少看见,希望看完这篇文章能够帮你梳理清楚。
饿汉式:不管你用的用不上,一开始就建立这个单例对象(就像一个饥饿的人)
懒汉式:是在你真正用到的时候才去建这个单例对象(就像一个懒惰的人)
解析面试难点String的intern方法
网上对于intern方法的讨论很多是不对或者不严谨的,于是我参考了大量官方资料总结了该知识点,希望可以讲清楚。这个面试考点主要考察JVM的内存模型、对String类理解的深度以及字符串常量池的了解。
一.字符串常量池介绍
在JAVA语言中有8种基本类型和一种比较特殊的类型String,其实String是引用类型,把它们归为一类是因为这些类型在运行过程中为了速度更快,更节省内存,都提供了一种常量池的概念。
Java内存模型简介
最近我准备开始写Java并发编程相关系列的文章了,网上的博客五花八门,有些还是错的。所以本人查阅了大量并发编程领域的核心书籍及官方资料,目的就是要保证内容都具有一定“权威性”,想要学习Java多线程的同学可以多多关注下哈~
首先需要区分两个概念:Java内存模型和Java内存结构。前者是和Java并发编程有关,后者是和Java虚拟机的运行时数据区有关,注意不要混淆。Java内存模型简称JMM(Java Memory Model)。
垃圾回收算法
首先,需要先搞清楚两个问题。
1.什么是垃圾?
垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。
2.为什么要进行垃圾收集?
如果不即使对内存中的垃圾进行清理,那么垃圾对象所占的内存空间会保留到应用程序结束,甚至可能导致内存溢出。
其次,垃圾收集是分阶段的,分为标记阶段和清除阶段。
标记阶段作用是区分出内存中哪些是存活对象,哪些是已经死亡的对象,一般有两种方式:引用计数算法和可达性分析算法。
清除阶段是当成功区分出内存中存活对象和死亡对象后,GC接下来的任务就是执行垃圾回收,释放掉无用对象所占用的内存空间,以便又足够的可用内存空间为新对象分配内存。目前JVM中比较常见的三种垃圾收集算法是标记-清除算法、复制算法、标记-压缩算法。
类的加载过程及注意点
类的加载过程主要分为三个阶段:加载、链接(验证,准备,解析)、初始化。
网上有很多关于这一块的介绍和概念,但是要么不准确,要么就不够具体。如果单从概念上看是很难理解的,本文更多的是解释每个步骤的相关概念以加深同学们的理解。
整体过程如下:
先说一个java的命令,方便下面反编译看字节码文件:javap -v XXX.class,不仅会输出行号、本地变量表信息、反编译汇编代码,还会输出当前类用到的常量池等信息,。(也可以通过IDEA装插件的形式看,搜jclasslib)
通过反编译看到的class文件中的常量池,加载到内存后叫运行时常量池。
跳跃表(SkipList)
跳跃表是一种基于有序链表的拓展,简称跳表。
下面正式开始了哦,跟着思路来,非常简单理解:
一.基本思想
给定一个有序链表:1->2->3->5->6->7->8
跳表的思想就是利用了类似索引的思想,提取出链表中的部分关键节点,然后再用二分查找。