自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(17)
  • 收藏
  • 关注

原创 【JUC】并发编程 ThreadLocal 源码 解析(ThreadLocalMap 源码)(ThreadLocal 为什么使用弱引用?内存泄漏?)

ThreadLocal的内部结构,JDK最早期的`ThreadLocal` 设计,现在的设计,这样设计的好处。ThreadLocal的核心方法源码,set方法,get方法,remove方法,initialValue方法。ThreadLocalMap源码分析,基本结构,弱引用和内存泄漏,弱引用和内存泄漏。

2024-05-09 17:38:21 670

原创 【JUC】并发编程 AQS,ReentryLock,CyclicBarrier,CountDownLatch 原理总结

独占和共享的最大区别就是State的定义不同,独占模式下State只有0和1,共享资源/临界区代码 只能由一个线程来执行,但是共享模式下的State可以为多个,只要是符合条件的当前线程都可以来使用。条件队列,基于Node内部类,实现了一个单项链表,相当于Synchronized的wait和notify的一个等待唤醒机制的条件队列。补充: AQS的阻塞队列和条件队列的实现,都是通过Node节点,不过是通过Node节点的不同属性,且一个是双向 一个是单向。【尝试获取锁的方法】

2024-05-08 19:00:32 1100

原创 【JUC】并发编程 Synchronized 锁升级原理

monitorenter: 将锁对象对象头中Mark Word的前30bit替换成指向操作系统中与其关联的monitor对象,将锁记录位状态改为10monitorexit: 将锁对象对象头中Mark Word进行重置,重新恢复成原来的样子,并通过在EntryList中等待的线程来继续竞争!工作流程:开始时 Monitor 中 Owner 为 null。

2024-05-08 18:50:42 816

原创 【Redis】Redis 底层数据结构、五种数据类型

当我们执行命令setbit key 7 0的时候,相当于把字符0x33变成了0x32,这样字符串的值就变成了”22”。而value则比较复杂,为了在同⼀个dict内能够存储不同类型的value,这就需要⼀个通⽤的数据结构,这个通用的数据结构就是robj,全名是redisObject。String的内部存储结构⼀般是sds(Simple Dynamic String,可以动态扩展内存),但是如果⼀个String类型的value的值是数字,那么Redis内部会把它转成long类型来存储,从⽽减少内存的使用。

2024-05-02 21:21:06 2365 1

原创 【JVM】JMM 内存模型

Java中锁的实现每个对象都拥有一把锁,该锁存放在对象头中。锁中记录了当前对象被哪个线程所占用。对象的结构对象头:存放了一些对象本身的运行时信息,包括两部分:Mark Word: 存储了很多和当前对象运行时状态有关的数据。: 指向了堆中当前类class对象。实例数据: 属性 + 方法对齐填充字节: 为了满足对象的大小为8个字节的倍数,无实际意义。锁状态对象头的Mark Word中"锁标志位"分别对应四种锁状态:无锁01、偏向锁01、轻量级锁00、重量级锁10(重量级锁) 实现线程同步。

2024-05-02 21:07:30 2042 1

原创 【JVM】Java工具(Arthas,APM,Java Agent,JMX)

Arthas主要使用了Java Agent技术,这种技术可以让运行中的Java程序执行Agent中编写的代码。Arthas使用了Agent中的动态加载模式,可以选择让某个特定的Java进程加载Agent并执行其中的监控代码。监控方面主要使用的就是JMX提供的一些监控指标,同时使用字节码增强技术,对某些类和某些方法进行增强,从而监控方法的执行耗时、参数等内容。

2024-05-01 22:47:15 1107 1

原创 【Redis】最佳实践——Redis键值设计

Key的最佳实践固定格式:[业务名]:[数据名]:[id]足够简短:不超过44字节不包含特殊字符Value的最佳实践:合理的拆分数据,拒绝BigKey选择合适数据结构Hash结构的entry数量不要超过1000设置合理的超时时间。

2024-04-30 14:42:25 893

原创 【Java】Stream流、方法引用(Java8)

Stream流, 中间方法,distinct() 使用HashSet去重, 终结方法,toArray(),collect(),方法引用,01_引用静态方法,02_引用成员方法,03_引用构造方法,04_使用类名引用成员方法,05_引用数组的构造方法

2024-04-29 22:37:11 895 2

原创 【JVM】GC调优(优化JVM参数)、性能调优

GC调优的主要目标是避免由垃圾回收引起程序性能下降。常见的GC模式。GC调优的手段。性能调优解决CPU占用率高,接口响应时间长,线程不可用、死锁,判断方法耗时

2024-04-29 13:24:43 2712

原创 【JVM】内存调优——内存泄漏、内存溢出

通过发送请求向Java应用获取数据,正常情况下数据返回后,即可释放数据。当并发量很大,同时处理数据的时间长,导致大量的数据存在于内存中,导致内存溢出。jps 查看java进程,打印main方法所在类名和进程id。jmap 生成堆内存快照;

2024-04-28 18:24:49 1202 1

原创 【Java】反射、动态代理

​​ 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;​ 对于任意一个对象,都能够调用它的任意属性和方法;​ 这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。​利用创建的对象调用类里面的内容可以跟,把要创建的对象信息和方法写在配置文件中。读取到什么类,就创建什么类的对象读取到什么方法,就调用什么方法此时当需求变更的时候不需要修改代码,只要修改配置文件即可。

2024-04-28 18:17:04 889

原创 【JVM】TLAB——Java堆内存是线程共享的?你确定吗?

分配内存时会存在并发问题,可以通过(1)CAS (2)TLAB解决。TLAB是虚拟机在堆内存的Eden区划分出来的一块专用空间,是线程专属的。TLAB: Thread Local Allocation Buffer HotSpot虚拟机带的。当分配内存的时候,TLAB内存空间不是特别大,经常会有不够的问题。虽然这两种方法都可以,但都不理想。因此,虚拟机定义了一个。引子: Java堆内存是线程共享的?的值,翻译为“最大浪费空间”。

2024-04-23 00:03:12 408 2

原创 【JVM】垃圾回收——垃圾回收算法、垃圾回收器

当获取一个对象引用时,会触发读后的屏障指令,如果对象指向的不是转移后的对象,用户线程会将引用指向转移后的对象。如果用户线程在帮忙转移时,ShenandoahGC线程也发现这个对象需要复制,那么就会去尝试写入前向指针,使用了类似CAS的方式来实现,只有一个线程能成功修改,其他线程会放弃转移的操作。如果在清理过程中发现没有足够的空间存放需要转移的对象,可能会触发Full GC(标记-整理算法),这时候会停下应用的所有线程来做清理,所以要尽量避免这种情况,保证有足够的空间。适用于较大的堆,可控暂停时间。

2024-04-23 00:01:43 631

原创 【JVM】垃圾回收——引用

弱引用并没有完全解决掉对象回收的问题,Entry对象和value值无法被回收,所以合理的做法是手动调用remove方法进行回收,然后再将threadlocal对象的强引用解除。由于是弱引用,那么在垃圾回收之后,ThreadLocal对象就可以被回收。如果软引用对象里边包含的数据已经被回收了,那么软引用对象本身其实也可以被回收了(同弱引用)。当threadlocal对象不再使用时,使用弱引用可以让对象被回收;因为仅有弱引用没有强引用的情况下,对象是可以被回收的。

2024-04-22 23:10:16 465

原创 【JVM】字节码文件

启动类加载器(Bootstrap ClassLoader) 加载核心类。扩展类加载器(Extension ClassLoader)加载扩展类。应用程序类加载器(Application ClassLoader)加载classpath中的类。自定义类加载器,重写findClass方法。

2024-04-22 02:09:13 309

原创 【JVM】运行时数据区 StringTable练习

对于Java方法,程序计数器记录的是正在执行的虚拟机字节码指令的地址。如果是本地方法,则不记录,程序计数器的值为undefined。程序计数器的大小并不是固定的,也不直接等同于CPU的位数。它的大小足以支持记录当前执行的指令位置,这通常与具体的JVM实现有关,并不直接反映物理CPU的位数。内存溢出指的是内存中某一块区域的使用量超过了允许使用的最大值,从而使用内存时因空间不足而失败,虚拟机一般会抛出指定的错误。JDK6,字符串常量池在方法区中,intern时,会在字符串常量池新创建一个。

2024-04-22 00:55:24 1050 1

原创 【JVM】双亲委派机制

双亲委派机制指的是:当一个类加载器接收到加载类的任务时,会向上交给父类加载器查找是否加载过,再由顶向下进行加载。双亲委派机制的作用:保证类加载的安全性,避免重复加载。common类加载器主要加载tomcat自身使用以及应用使用的jar包,默认配置在catalina.properties文件中。catalina类加载器主要加载tomcat自身使用的jar包,不让应用使用,默认配置在catalina.properties文件中。

2024-04-22 00:51:53 421

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除