![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JavaEE
文章平均质量分 75
知始行末
君子有所为有所不为,为者不违心,不为者不为过。
展开
-
HashMap分析之源码分析(二)
1.链表长度大于8(红色树中至少9各个节点)并且数组长度大于64的情况下将整个链表转换为红黑树:static final int TREEIFY_THRESHOLD = 8;for (int binCount = 0; ; ++binCount) { if ((e = p.next) == null) { p.next = newNode(hash, key, value, null); if (binCount >= TREEIFY_THRESHOL原创 2021-07-17 17:36:54 · 620 阅读 · 1 评论 -
java agent技术
Agent 是一个运行在目标 JVM 的特定程序,它的职责是负责从目标 JVM 中获取数据,然后将数据传递给外部进程。加载 Agent 的时机可以是目标 JVM 启动之时,也可以是在目标 JVM 运行时进行加载,而在目标 JVM 运行时进行 Agent 加载具备动态性。基础概念JVMTI(JVM Tool Interface):是 JVM 暴露出来的一些供用户扩展的接口集合,JVMTI 是基于事件驱动的,JVM 每执行到一定的逻辑就会调用一些事件的回调接口(如果有的话),这些接口可以供开发者去扩展自原创 2021-07-17 16:56:34 · 868 阅读 · 1 评论 -
Java中序列化实现原理研究
https://blog.csdn.net/weixin_39723544/article/details/80527550转载 2021-06-12 20:15:29 · 656 阅读 · 0 评论 -
还在使用AtomicLong?
AtomicLong作为Long型数据的原子变量类,可以在高并发的场景保证数据自增的正确性。那么它是怎么实现线程安全的呢?原创 2021-06-05 18:28:40 · 940 阅读 · 5 评论 -
HashMap分析之数据结构(一)
数据结构jdk1.7时数据结构如下:由于冲突的元素过多链表过长时会导致查询速度会变慢,所以jdk1.8时增加了红黑树数据结构,在链表过长的时候会将链表装化为红黑树。红黑树特征:(1)根节点为黑色(2)红色节点的两个子节点一定是黑色(3)默认添加的节点是红色节点(4)每个节点到叶子节点的所有路径黑色节点数相同(5)所有叶子节点都为黑色节点添加变换规则总的变换规则改变节点颜色 左旋&&右旋变色规则:父亲叔叔都为红色,则...原创 2021-05-02 21:37:43 · 1430 阅读 · 0 评论 -
JVM之堆内存结构和垃圾收集算法
堆内存结构jvm将我们的堆区间各个区间默认比例是:eden:s0:s1 8:1 :1 young:old: 1:2什么是垃圾回收机制?不定时去堆内存中清理不可达对象。垃圾收集器在一个Java程序中的执行是自动的,不能强制执行。System.gc 方法来"建议"执行垃圾收集器,但其是否可以执行。这也是垃圾收集器的最主要的缺点。...原创 2021-04-22 23:31:44 · 2160 阅读 · 0 评论 -
java对象解析
对象创建的过程对象在jvm中创建过程如下:(1)给对象分配内存给对象分配内存有以下两种方式:指针碰撞我们内存分配为规整的(每次分配依靠指针位移来分配对象)(但是我们电脑给java分配的内存不一定是规整的,可能区域并不是连续的) 如图下所示空闲列表堆内部有一个列表来存储我们堆中空闲的地方。我们创建对象则去找列表中对应的空闲区域去创建我们的对象。堆是否规整有我们垃圾回收器来决定的 ,如果垃圾回收带有我们的 压缩算法,那么他会规整的分配我们的对象(2)规整分配线程.原创 2021-04-21 22:15:53 · 2038 阅读 · 0 评论 -
jvm内存结构
jvm内存结构堆、方法区是线程共享的,java方法栈、程序计数器是线程私有的。jdk1.7和jdk1.8有略微的不同,1.8移除了方法区,改为了元数据区,将其存在本地内存中;字符串长常量池放到堆中方便回收。堆:new 数组 垃圾回收、内存溢出、内存泄漏,“GC堆”,从内存回收角度来看java堆可分为:新生代和老生代(当然还有更细致的划分,在下一章会讲到)。java堆是java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例原创 2021-04-18 16:41:46 · 2052 阅读 · 3 评论 -
java之fork-join原理
ForkJoinTask就是ForkJoinPool里面的每一个任务。他主要有两个子类:RecursiveAction和RecursiveTask。然后通过fork()方法去分配任务执行任务,通过join()方法汇总任务结果,这就是整个过程的运用。他有两个子类,使用这两个子类都可以实现我们的任务分配和计算。(1)RecursiveAction 一个递归无结果的ForkJoinTask(没有返回值)(2)RecursiveTask 一个递归有结果的ForkJoinTask(有返回值).原创 2021-04-13 22:16:12 · 2403 阅读 · 0 评论 -
JMM可见性内存模型
JMMJava内存模型(JMM)定义的是一种抽象的概念,定义屏蔽java程序对不同的操作系统的内存访问差异。在多线程中为了保证共享变量的可见性:通过Lock(汇编指令)和总线锁/MESI-缓存一致性协议控制。下图是工作内存和共享主存结构:Volatile汇编lock指令将当前处理器缓存行数据立刻写入主内存中。 写的操作会触发总线嗅探机制,同步更新主内存的值。JMM八大同步规范(1)lock(锁定):作用于 主内存的变量,把一个变量标记为一条线程独占状态(2)unloc原创 2021-04-13 21:56:32 · 2330 阅读 · 2 评论 -
ThreadLocal和内存泄漏问题
ThreadLocal原理简介ThreadLocal提供了线程本地变量,它可以保证访问到的变量属于当前线程,每个线程都保存有一个变量副本,每个线程的变量都不同。ThreadLocal相当于提供了一种线程隔离,将变量与线程相绑定。Api1.New Threadlocal();---创建Threadlocal2.set 设置当前线程绑定的局部变量3.get 获取当前线程绑定的局部变量4.remove()...原创 2021-04-11 22:02:41 · 2445 阅读 · 1 评论 -
java的类加载机制
类加载的机制的层次结构每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.class”文件,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程称为类加载,这里我们需要了解一下类加载的过程,如下:Jvm执行class文件步骤一、类加载机制将class文件字节码内容加载到内存中,并将原创 2021-04-11 21:30:44 · 2847 阅读 · 0 评论 -
java线程池原理
目录什么是线程池为什么使用线程池?阻塞队列线程池分类线程池的核心参数线程池队列拒绝策略线程池的状态整个流程线程池源码分析什么是线程池线程池和数据库连接池非常类似,可以统一管理和维护线程,减少没有必要的开销。为什么使用线程池?1.降低资源消耗通过重复利用创建好的线程,来降低我们创建和销毁线程的造成资源的消耗。2.提高响应速度任务执行后,直接通过已经创建好的线程执行,提高我们的响应速度。3.提高线程的可管理性线程资源和我们服务器的cpu资源原创 2021-04-04 14:38:31 · 2799 阅读 · 1 评论 -
Java编译器对字符串拼接的优化
在编程中我们经常会使用到字符串拼接的方式,比如redis使用key的命名空间和key进行拼接,请求地址的url的拼接或者数据库多个返回字段的凭借等。那么我们平时在使用“+”进行字符串拼接的时候,我们有想过编译器会对我们的程序进行何种处理吗?到底我们的程序会怎么执行呢?今天通过反汇编指令来看看拼接后代码是怎么个样子。让我们看看最简单的拼接方式: public static void main(String[] args) { String a = "a"; String b = ".原创 2021-03-21 16:50:42 · 2835 阅读 · 0 评论