自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 并发编程(七)

AQS 是 Java 中的一个重要的同步器框架,"AbstractQueuedSynchronizer" 的缩写,AQS提供了一种用于实现各种同步器的基础框架,例如锁(Lock)、信号量(Semaphore)、倒计数器(CountDownLatch)等等。

2023-08-21 14:50:09 67 1

原创 并发编程(六)

并行任务同步可以用于协调多个并行任务的完成情况,确保所有任务都完成后再继续执行下一步操作。多任务汇总可以用于统计多个线程的完成情况,以确定所有线程都已完成工作。资源初始化可以用于等待资源的初始化完成,以便在资源初始化完成后开始使用。

2023-08-19 10:14:04 78

原创 并发编程(五)

在死锁中,每个线程都在等待某个资源被释放,而同时又持有其他线程需要的资源,从而形成一个闭环,导致所有参与的线程都无法继续执行。这是一种简单的死锁避免方法,但在复杂的场景下可能需要更复杂的策略来避免死锁,比如通过对象的hash值排序等方法。反之,未实现线程安全的代码,表现的行为是不可预知的,有可能正确,而绝大多数的情况下是错误的。两个线程在尝试拿锁的机制中,发生多个线程之间互相谦让,不断发生同一个线程总是拿到同一把锁,在尝试拿另一把锁时因为拿不到,而将本来已经持有的锁释放的过程。锁,并尝试获取对方持有的锁。

2023-08-12 10:47:24 65 1

原创 并发编程(四)

是 Java 中的一个类,用于在多线程环境下为每个线程提供独立的变量副本。每个线程都可以访问自己的独立变量副本,而不会影响其他线程的副本。这种机制在某些情况下可以简化多线程程序的设计,特别是当多个线程需要访问一些共享的数据,但又需要保持数据的独立性时。主要解决的问题是多线程共享变量的线程安全性。在多线程环境下,共享变量可能导致数据竞争和线程不安全问题,需要通过同步机制来保护。而使用,每个线程都可以独立地操作自己的变量副本,从而避免了共享变量的线程安全问。

2023-08-10 17:11:25 50 1

原创 并发编程(三)

介绍:在 Java 中,是一种关键字,用于实现多线程之间的同步。它可以应用于方法或代码块,以确保在同一时刻只有一个线程可以访问被修饰的方法或代码块,从而避免多线程并发访问共享资源时产生的数据竞争和不一致性。的主要作用是解决多线程之间的资源竞争问题,特别是在多个线程同时修改共享数据时,可能导致数据不一致的情况。通过使用,可以确保同一时刻只有一个线程访问共享资源,从而避免竞争条件和线程安全问题。使用:synchronize 的使用方式可分为应用在代码块上和运用在方法上,代码如下// 同步代码块。

2023-08-08 16:37:17 25

原创 并发编程(二)

需要注意的是,尽管 Java 的线程模型在 Java 1.2 之后引入了 "Native Threads" 的概念,但是 Java 线程仍然属于用户线程,由 JVM 的线程调度器进行管理,而不是直接由操作系统内核管理。但是需要注意的是,这种优先级也不是完全管用的,因为线程的调度是由OS操作的。Java中的现成虽然说是用户线程但是目前版本还是和内核直接挂钩的,这样在创建大量线程时会产生很大的内存消耗,默认情况下创建一个线程的大小为1M,所以当创建线程多时会十分占用资源,好在现在。

2023-08-08 10:47:08 28

原创 并发编程(一)

安全的中止则是其他线程通过调用某个线程 A 的 interrupt() 方法对其进行中断操作,中断好比其他线程对该线程 A 打了个招呼:“A,你要中断了”,不代表线程 A 会立即停止自己的工作,同样的 A 线程完全可以不理会这种中断请求。这种情况下,使用中断会更好,因为,,但是iIntel 引入了超线程技术后,产生了逻辑处理器的概念,使核心数和线程数形成了1:2 的关系 , 我们可以用。二、检查中断位的状态和检查取消标志位没什么区别,用中断位的状态还可以避免声明取消标志位,减少资源的消耗。

2023-08-06 18:02:53 28 1

原创 关于MySQL的深度学习之索引

innodb则是存在一起的,所以我们的mysiam中的索引又称为非聚集索引,innodb中的索引我们又。我们可以发现B+Tree, 非叶子结点不存data数据,只存索引,即便这个索引是冗余的,叶子结点。我们知道MySQL的每一页的大小大约为16kb ,上图箭头所指的一个节点相当于是我们的一页,我。会变成一个类似链表的结构,当我们查询时效率会很低,所以我们不采用二叉树作为我们的索引结。B树的特点是叶子结点具有相同深度,叶子节点的指针为空,所有的索引元素不重复,节点中的数。

2023-07-19 17:06:39 48

原创 JVM 调优思路

这个因为之前已经大概知道Young GC的频率,假设是每5分钟一次,那么可以执行命令 jstat -gc pid 300000 10 ,观察每次结果eden, survivor和老年代使用的变化情况,在每次gc后eden区使用一般会大幅减少,survivor和老年代都有可能增长,这些增长的对象就是每次Young GC后存活的对象,同时还可以看出每次Young GC后进去老年代大概多少对象,从而可以推算出。知道了老年代对象的增长速率就可以推算出Full GC的触发频率了,Full GC的每次耗时可以用公式。

2023-07-17 17:26:53 50 1

原创 Java垃圾收集器(三)

(默认5%): gc过程中空出来的region是否充足阈值,在混合回收的时候,对Region回收都 是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他Region,然后这个Region中的垃圾对象全部清 理掉,这样的话在回收过程就会不断空出来新的Region,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立 即停止混合回收,意味着本次混合回收就结束了。(默认85%) region中的存活对象低于这个值时才会回收该region,如果超过这 个值,存活对象过多,回收的的意义不大。

2023-07-14 11:04:29 48 1

原创 Java垃圾收集器(二)

上期说到了CMS垃圾收集器,它在并发标记和并发清理的过程中对象的引用可能发生变化,多标和漏标的情况就可能发生。所以CMS引用了三色标记算法来解决这个问题。黑色:表示已经被垃圾收集器访问过 且这个对象的所有引用都被扫描过。

2023-07-05 18:25:53 47 1

原创 Java垃圾收集器(一)

1.什么是分代收集理论?目前虚拟机的垃圾收集采用的都是分代收集算法:根据对象存活周期的不同将内存分为几块,再根据每一块内存的特性,实行不同的垃圾收集算法进行收集。2.常见的垃圾收集算法常见的垃圾收集算法有标记-复制算法,标记-清除算法,标记-整理算法。标记-复制算法:它会将内存空间划分为大小相同的两块,每次只使用其中的一块,当这一块的内存使用完后,将还存活的对象复制到另一块去,然后再把使用完的这一块清理干净,这样每次回收内存都是对内存区域的一半进行回收。标记-清除算法:该算法分为标

2023-06-28 19:41:15 98 1

原创 浅谈Java对象的内存分配

看完上面的两个TIP我们就可以说说对象在堆中的分配了,大多数情况,对象是在新生代的Eden区分配的,当Eden区放满时会触发minor gc ,剩余存活的对象则会被挪到survior区 survior区分为 s1 , s2 区 首先会挪到s1区 ,当再次发生minor gc时 会清空 Eden 和 s1 将存活的对象挪动到 ,s2区,如果 survior区装不下,那么会提前挪动到老年代中。:分析对象的动态作用域,当一个对象在方法中被定义后,它可能被外部方法所引用,那么这种对象就不适合栈上分配。

2023-06-21 12:34:32 201

原创 浅谈Java的对象创建

通过打印的相关信息我们可以清晰的看到,对象头中存储的数据以及一些其它数据,这里的klass pointer上图中没有相应的解释,这里说明一下,这个类型指针其实是对应方法区的类信息,至于对齐这一块,我们知道 8个字节 是对象寻址的最优解,所以虚拟机会增加对应的填充。,划分内存的方法通常有,指针碰撞(Java堆中的内存绝对规整)、空闲列表(Java堆中的内存并不规整)这两种方法,我们默认的是使用指针碰撞的方式进行分配,接下来我用画图的方式来解释下指针碰撞。虚拟机采用了两种方式来解决,首先就是我们熟悉的,

2023-06-20 10:49:09 155 1

原创 浅谈JVM

此处的栈我们可以称之为线程栈当然官网上说的Java虚拟机栈,之所以称它为线程栈,是因为每当一个线程启动时,栈就会划分一片很小的空间给它使用,而这些空间里又会有很多栈帧,可以认为一个线程中每拥有一个方法,这些栈空间就会划分一个栈帧给该方法;上图用红色框框标出来数字我们就可以理解成计数器记录的数据,至于为啥要记录,大家可以想想多线程的时候,我们程序执行到某个位置后被别的线程抢占了cpu那么当重新回来执行之前没执行完的代码时,不可能从头执行,所以程序计数器就是这个作用。局部变量表,操作数栈,动态链接,方法出口。

2023-06-14 16:16:54 477

原创 浅谈Java类加载

首先我们需要知道的是上面2中所说的类加载器是有一定亲戚关系的,我们可以理解为儿子是应用程序类加载器,爸爸是扩展类加载器,爷爷是引导类加载器,至于为啥这么规定呢,源码里是这么写的。加载某个类时会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的类加载路径中查找并载入目标类。关于类加载需要注意一点,当我们运行的程序用到某个类的时候这个类才会被加载,jar包和war包的类不是一次性全部加载的,有点类似spring中的懒加载。

2023-06-09 17:57:32 99 1

空空如也

空空如也

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

TA关注的人

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