自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 常见jvm调优命令

jinfo -flag 可以查看或修改具体进程某些参数信息。jps 显示当前java进程信息;jstat 查看虚拟机性能统计信息。jstack 查看进程中死锁的信息。jmap -heap 查看堆信息。

2024-11-05 11:43:34 111

原创 常见垃圾回收算法

4.查找标记存活空间;清除垃圾-将标记复制和移动复制结合;将占少量空间的数据,可以向一端移动,合并为长的连续空间。3.查找标记存活空间;清除垃圾->移动复制;标记存活空间时,将内容向一段移动复制,同时整理内存。2.查找标记存活空间;清除垃圾->标记复制;在使用内存时,只使用一半,在标记存活时,将内容直接复制到另一半空间,改变引用地址即可;清除时直接清除整片已使用过的区域,清除速度快;当需要连续内存空间时,仍然容易造成内存不足,重新查找整理空间;1.查找标记存活空间;清除垃圾->直接清除;

2024-11-05 11:37:53 119

原创 java对象生命周期

终结:没有相应的finalize方法实现,或finalize已经执行。此时可以对对象进行终结销毁了。收集:垃圾回收之前处理finalize方法中的操作。可以让引用重新建立,可以回收其他内存空间等。不可见:将对象的引用对象设置为空,无法通过引用对象找到对象,但引用指向仍然存在。重新分配空间:对象所在地址空间,被其他对象重新使用,对象在内存里就彻底不存在了。不可达:通过垃圾回收机制可达性算法确定对象无法通过引用对象回收,不可达。应用:对对象进行各种读写变换引用操作。创建:通过new或反射机制创建对象。

2024-11-05 11:04:15 225

原创 java运行时数据区有哪些?

java虚拟机方法栈:线程私有;java方法执行时,压栈出栈层层执行;栈内存不足时,抛出StackOverFlowError;本地方法栈:线程私有;native方法执行时,压栈出栈层层执行;栈内存不足时,抛出StackOverFlowError;程序计数器:进程开启时开辟;每个线程私有,用于记录每个线程执行到哪个位置。便于线程切换时恢复继续执行。方法区:进程开启时开辟;存储类信息,静态变量,常量;内存不足时抛出OOM(Area)堆:进程开启时开辟;内存不足时抛出OOM(Heap)

2024-11-05 10:52:50 225

原创 java类加载之双亲委派机制

尝试从爸爸(BootStrapLoader)加载,加载成功,直接用,加载失败?已加载直接拿来用,未加载过?尝试从爸爸(ExtClassLoader)加载,加载成功,直接用,加载失败?尝试从爸爸(AppClassLoader)加载,加载成功,直接用,加载失败?自定义类加载器->系统类加载器->扩展类加载器->启动类加载器。

2024-11-05 10:33:25 165

原创 JVM类加载机制

链接:1.检查:元数据检查,字节码检查,符号引用检查等等运行检查。初始化所有变量的对应类型的0值或空值。3.链接:将类中引用对象符号变成直接引用地址。加载:将类信息,静态变量,常量加载到方法区;初始化:通过clinit()方法。初始化类对象属性值。

2024-11-05 10:11:57 75

原创 java中线程池执行任务时发生异常会怎么处理?

当执行任务用submit执行callable任务时,它实际上是用的futuretask里边的call方法执行任务,此时异常会被捕获,分装到outcome内部参数里边,不会向上抛出,引发线程问题,任务正常停止,线程可继续执行其他任务。当执行任务是用execute执行runnable任务时,异常会直接向上抛出,导致线程停止。

2024-11-05 09:54:03 175

原创 concurrenthashmap中红黑树为什么会保留双向列表?

concurrenthashmap在多线程时为保证并发性能,对读操作是共享的。当一个线程正在通过红黑树查找数据时,left或right节点的数据因为其他线程写入的数据,被转换到别的树杈上时,读的线程通过left或right指针就找不到了。此时通过双向链表,next指针去查询数据,比等待写线程执行完,重新查找数据性能要高。另,在扩容时,如果根据红黑树结构去进行数据复制扩容是比较麻烦的。扩容也是基于双向链表数据复制的,再相应转换成红黑树。

2024-11-05 09:42:07 126

原创 java中concurrenthashmap是怎么扩容的?

1.负载因子大于0.75;2.数组长度为8,链表长度达到64;3.用putAll方法时。最后一个线程复制完数据,检查原数组标识戳,确定原数组数据全部复制过来。5.复制数据,空数据直接复制,有数据检查链表、红黑树。1.计算扩容标识戳。避免扩容过程中的线程问题。2.计算扩容步宽,也就是每一段分多长。4.根据分段分配线程任务。

2024-11-05 09:25:25 127

原创 java中几种引用类型?

ThreadLocal中虚引用的例子:线程中ThreadLocal引用对象1->内存ThreadLocal对象2,而对象2->ThreadLocalmap中的key,key->指向entralue。则key指向的value还存在,此时,需要在回收对象2同时,调用remove方法,将entry<key,value>删除掉。对象2->ThreadLocalmap中的key因为是弱引用,就可以保证对象2被回收掉。弱引用:引用对象不在了,当jvm垃圾回收机制被执行时,被引用对象就会被回收掉。

2024-11-02 18:17:17 155

原创 java中@contented注解的作用?

cpu存储数据是用三级缓存去存储的,每次操作数据需要给数据同步到三级缓存中,操作时从缓存中取值操作。变量在缓存中是以缓存行存储的。如k和j存在同一行中,操作j时有可能将k的数据修改了。所以每次操作k时都需要重新从主内存同步。为此,加上该注解后,保证该变量占满整个缓存行。在操作别的变量时不需要刷新该变量。

2024-11-02 17:42:48 146

原创 什么是cas,其优缺点?

ABA问题:即多个线程修改同一个数据时,在检查时,值和原值一样,但是该值在另一个线程中操作还未刷新。解决方法,除了比较预期值和原值,还比较当前操作状态记录。cas:即自旋锁,她是基于每次修改前对原值和预期值进行比较,如果原值和预期值不一致,就会取新的值作为原值重新做修改检查更新操作,一直自旋到它一致为止。缺点:1.高并发时,会频繁执行“自旋”过程,消耗cpu资源。解决办法:设置一个自旋次数,到了多少次,线程被挂起。优点:不用竞争锁,避免线程挂起,运行。内核态切换的时间浪费。

2024-11-02 17:28:50 223

原创 并发编程三大特性

volatile关键字实现,该关键字修饰的变量每次读都是从主内存读值,每次修改都是去同步刷新主内存的值。线程sythronise,cas等也可以实现,前者因为操作过程中不被其他线程操作,操作完之后其他线程才操作,所以保证每次获取到的都是最新值。直到修改值期间,没有其他线程操作,才最终更新,也可保证可见性。加上volatile关键字后,相当于在被修饰指令前后加上内存屏障,手动告诉系统,前后有业务逻辑,不能重新排序。原子性:指当前线程的操作是完整不可分割,不可被打断的。原子性,可见性,有序性。

2024-11-02 17:21:43 304

原创 java中sleep和wait方法区别。

2.wait方法是Object方法,任意对象可以调用,因为wait本质是对底层锁的监视器中获取锁,等待锁记录的操作。所以它必须在Systhronise中执行,也就是拿到锁之后再操作。操作完之后,释放锁资源。其他线程可获取排他锁。等其他线程notify或者notifyAll之后。线程才可重新竞争锁去执行。1.sleep方法是线程的方法,只有线程能调用。调用之前如果该线程持有锁,她会带着锁沉睡,直到沉睡时间到了,自动唤醒,竞争cpu资源。

2024-11-02 17:10:32 89

原创 java中如何停止线程?

3.线程自带的interupt方法。线程自带的共享变量,线程是可运行状态时,该变量为false.调用该方法,线程被挂起,停止。interupted方法,可还原该值为false.线程重新可竞争cpu.2.共享变量方式,在线程执行中设置一个共享变量,当共享变量执行多少次,或者执行到某个值时,跳出执行。需要额外编程,资源。1.暴力方法,Thread.stop()方法。不管你运行的程序进行到哪里了,直接终止线程。

2024-11-02 17:04:09 132

原创 java 纤程或协程的概念

另:jvm程序(jvm线程)-内存jvm进程(os线程)可以有:1-1,M>>n模型。高并发时M>>n模型一般能增加cpu效率,占内存高。但高io操作时,可能1-1效率更高。一般用java写的程序启动时,字节码文件在JVM程序上执行,具体程序操作在jvm程序进程中的线程中执行。java程序(java线程)-jvm程序(jvm线程)-内存jvm进程(os线程)其中jvm线程就称为 纤程或协程;进程:程序获取内存资源的最小空间。线程:运行程序的基本单元。

2024-10-31 21:10:40 126 1

原创 自定义线程参数理解

7.拒绝策略:一般默认有,直接拒绝,尝试获取最先执行的线程来执行,尝试获取调用线程执行等。2.最大线程数:核心线程和任务队列都满了之后,创建非核心线程执行任务。一般不用无界队列,高并发时,会让任务队列无限长,内存空间被占满,影响系统其他线程和进程。1.核心线程数:提前创建好固定数量的核心线程,任务来的时候直接执行,节约任务执行时再创建线程的时间。3.存活时间:非核心线程任务执行完空闲时间到了存活时间,就会自动销毁。6.线程工厂:自定义线程工厂,可以给生成的线程加上项目相关命名,减少排错时间。

2024-10-31 20:59:56 331

原创 一,如何理解乐观锁,悲观锁,自旋锁,读写锁,排他锁,共享锁,统一锁,分段锁。

统一锁:解决死锁常见方案,如A线程需要等待B线程锁,B线程需要等待A释放锁才拿到锁执行,就容易产生死锁,给执行AB线程的线程加上锁,就是统一锁。悲观锁:操作之前,先上锁,操作完之后再允许别人操作,也是一种排他锁,例:Synthronise锁。自旋锁:乐观锁一种,操作后检查源数据被动过,再重新读数操作,直到操作后对比操作前,源数据没有动过。乐观锁:先对A读取操作再说,操作完更新A时检查操作期间A是否有过其他操作,再相应处理。一,如何理解乐观锁,悲观锁,自旋锁,读写锁,排他锁,共享锁,统一锁,分段锁。

2024-10-31 20:50:21 360

空空如也

空空如也

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

TA关注的人

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