Java底层
文章平均质量分 85
book多得
努力努力再努力
展开
-
面试官:聊一下OOM场景,有什么解决方案?
JDK8 HotSpot JVM 将移除永久区,使用本地内存来存储类元数据信息并称之为:元空间(Metaspace);这与Oracle JRockit 和IBM JVM’s很相似,如下图所示元空间Metaspace(Java7叫永久代或持久代):用于存放JDK自身携带的Class,Interface的元数据(结构信息),也就是运行环境必须的类信息。被装载进此区域的数据不会被GC,关闭JVM才会释放此区域所占用的内存对应方法区,虽然逻辑上JVM规范将方法区描述为堆的一个逻辑部分,但物理上不包含在堆里。原创 2024-03-11 10:48:20 · 1006 阅读 · 0 评论 -
接口性能优化常见12式
本文将给小伙伴们分享一下接口优化的常用方案。原创 2024-01-25 17:27:53 · 1551 阅读 · 0 评论 -
面试官:请问泛型擦除、泛型上界、泛型下界、PECS原则 是什么?
泛型的本质是 类型参数化,解决类型爆炸的问题。所谓泛型是指将类型参数化,以达到代码复用提高软件开发工作效率的一种数据类型。原创 2024-01-25 17:26:55 · 874 阅读 · 1 评论 -
在枚举类写运行代码优雅的替换了if-else
网络上有很多解决思路,有工厂模式、策略模式......,但是有的时候每一个分支只是小小的代码块,用设计模式时间成本又太高了,可以替换大量的if-else语句,且具备较好的可读性与扩展性,同时能显得轻量化,我比较推荐使用策略枚举来消除if-else。在平时的项目里总是不断地加需求,加着加着就不知不觉的多了一大堆if-else,回首一看,脑子里就一个字,这是翔吗?原创 2023-09-22 22:33:09 · 197 阅读 · 0 评论 -
BigDecimal百科全书
在需要精确的小数计算时再使用BigDecimal,BigDecimal的性能比double和float差,在处理庞大,复杂的运算时尤为明显。故一般精度的计算没必要使用BigDecimal。尽量使用参数类型为String的构造函数。BigDecimal都是不可变的(immutable)的, 在进行每一次四则运算时,都会产生一个新的对象 ,所以在做加减乘除运算时要记得要保存操作后的值。原创 2023-08-30 23:10:57 · 320 阅读 · 0 评论 -
ThreadLocal八股文
1. 为什么要⽤ ThreadLocal?答:为了解决并发编程时,公共资源数据安全问题。(也可使⽤锁的⽅式)并发编程是⼀项⾮常重要的技术,它让我们的程序变得更加⾼效。但在并发的场景中,如果有多个线程同时修改公共变量,可能会出现线程安全问题,即该变量最终结果可能出现异常。为了解决线程安全问题JDK出现了很多技术⼿段,⽐如:使⽤或Lock,给访问公共资源的代码上锁,保证了代码的 原⼦性。原创 2023-05-15 14:37:05 · 600 阅读 · 1 评论 -
ReentrantLock 原理
ReentrantLock是Lock接⼝的默认实现,是⼀种独占锁。相对synchronized⽽⾔,ReentrantLock 提供了更多的操作⽅式以及更细粒度的加锁⽅式。主要特性:1.可重⼊。ReentrantLock是可重⼊锁,因为它会记录之前获得锁线程对象,保存在exclusiveOwenerThread变量中,当⼀个线程要获取锁时,会先判断当前线程是不是已经获取锁的线程。synchronized也是可重⼊锁。12。原创 2023-05-14 15:03:17 · 698 阅读 · 2 评论 -
HashMap
对于要求查询次数特别多,查询效率比较高同时插入和删除的次数比较少的情况下,通常会选择ArrayList,因为它的底层是通过数组实现的。对于插入和删除次数比较多同时在查询次数不多的情况下,通常会选择LinkedList,因为它的底层是通过链表实现的。但现在同时要求插入,删除,查询效率都很高的情况下我们该如何选择容器呢?那么就有一种新的容器叫HashMap,他里面既有数组结构,也有链表结构,所以可以弥补相互的缺点。而且HashMap主要用法是get()和put() 。原创 2023-04-28 15:11:56 · 1015 阅读 · 0 评论 -
JVM垃圾回收GC 详解(java1.8)
目录垃圾判断算法(你是不是垃圾?)引用计数法可达性算法对象的引用强引用软引用弱引用虚引用对象的自我救赎垃圾回收算法--分代标记清除算法复制算法标记整理法垃圾处理器最容易想到的一种方式是引用计数法,啥叫引用计数法,简单地说,就是对象被引用一次,在它的对象头上加一次引用次数,如果没有被引用(引用次数为 0),则此对象可回收以上代码 ref 引用了右侧定义的对象,所以引用次数是 1 如果在上述代码后面添加一个 ref = null,则由于对象没被引用,引用次数置为 0,由于不被任何变量引用,此时即被回收,原创 2023-04-22 17:13:34 · 1406 阅读 · 0 评论 -
volatile 详解
有什么用?volatile是一个特征修饰符(type specifier). volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。 volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。一句话:主要用于解决变量在多个线程之间的可见性原创 2023-03-13 13:55:01 · 265 阅读 · 0 评论 -
线性数据结构:数组 Array
数组是数据结构还是数据类型?数组只是个名称,它可以描述一组操作,也可以命名这组操作。数组的数据操作,是通过 idx->val 的方式来处理。它不是具体要求内存上要存储着连续的数据才叫数组,而是说,通过连续的索引 idx,也可以线性访问相邻的数据。那么当你定义了数据的存储方式,也就定义了数据结构。所以它也是被归类为数据结构。原创 2023-02-24 15:24:28 · 631 阅读 · 0 评论 -
System.arraycopy详解
System.arraycopy这个方法之前用得很少,前段时间在一个项目需要对很多字节的处理,使用这个方法是非常有用的。这个方法的作用大家应该都是知道的吧:就是把一个数组中某一段字节数据放到另一个数组中。至于从第一个数组中取出几个数据,放到第二个数组中的什么位置都是可以通知这个方法的参数控制的。原创 2023-02-24 15:01:55 · 448 阅读 · 0 评论 -
线性数据结构:链表 LinkList
链表的历史于1955-1956年,由兰德公司的Allen Newell、Cliff Shaw和Herbert A. Simon开发了链表,作为他们的信息处理语言的主要数据结构。链表的另一个早期出现是由 Hans Peter Luhn 在 1953 年 1 月编写的IBM内部备忘录建议在链式哈希表中使用链表。到 1960 年代初,链表和使用这些结构作为主要数据表示的语言的实用性已经很好地建立起来。原创 2023-02-24 11:52:37 · 657 阅读 · 0 评论