- 博客(6)
- 收藏
- 关注
原创 Java的编译优化,锁消除
这个时候,JIT编译器可以在动态编译同步代码的时候,使用一种逃逸分析的技术,通过该技术判断程序中使用的锁对象是否只被一个线程所使用,而没有别的线程进行竞争,这个同步代码就不会生成synchronized关键字所标识锁的申请和释放的机器码,从而消除锁的使用流程。JIT编译器执行动态编译的时候,如果发现前后相邻的synchronized块使用的是同一个锁对象,那么就会把这几个锁对象合并成一个较大的同步代码块,这样线程就不用频繁申请和释放锁,达到一次就可以执行全部同步代码块,提高了性能。
2024-12-24 09:40:54
303
原创 自旋锁的意义和不足
自旋锁再避免线程切换开销的同时也带来了新的开销,需要不断去尝试获取锁,如果这把锁一直不释放,这种尝试也是无用的,会浪费处理器资源,虽然一开始开销低于线程切换,随着时间推移,开销会越来越大,甚至超过线程切换的开销。自己内部进行不停的旋转,一直到零界点触发,目标达成后获取同步资源锁。线程状态的切换需要高昂的成本,如果同步代码块中的内容不复杂,切换线程带来的开销比实际代码执行的开销还要大,如果我们的同步代码块内容不多,需要的执行时间也很短,我们可以让其自旋的尝试获取锁,就可以避免上下文切换状态。
2024-12-23 17:45:25
355
原创 java中偏向锁,重量级锁,公平锁和非公平锁
从上面信息可知,所有新建对象都是可偏向的(锁标志位为01),但都是为偏向的(是否偏向锁标志为0),当线程执行到临界区,此时会利用cas操作,将线程id插入markword中,同时修改偏向锁的标志位。自旋锁是一种简单的锁机制,当一个线程尝试获取一个已经被其他线程持有的锁时,不会立即放弃cpu(像互斥锁那样进入睡眠状态),而是当前位置“自旋”,就是忙等待,不断检查锁是否可用,这种方式适用于短时间持有锁,如果长时间持有,自旋线程会浪费cpu。两个线程都是活跃的,会发生升级,锁膨胀会变成轻量级锁。
2024-12-20 17:41:55
276
原创 java的垃圾回收
频繁创建对象和销毁对象会导致大量垃圾对象生成,会增加GC的负担,通过重用对象或使用对象池来减少对象的创建和销毁频率,full GC会导致长时间的停顿,尽量避免频繁的full GC,通过增加老年代的内存大小,调整GC的阈值等手段来减少full GC的触发频率。可以理解为标记-清除的进化版,主要解决了内存碎片的问题,在标记阶段,首先标记所有活跃对象,接着将这些对象移动到内存一端,并整理空闲空间,不仅可以清除对象垃圾,还能避免内存碎片产生。3.2:使用G1垃圾回收器,对于高吞吐量的应用,使用并行垃圾回收器。
2024-12-20 11:35:29
1110
原创 java的类加载机制
4.java中保证类加载的安全,使用双亲委派机制,优先从“启动类加载器中加载”是“父”,启动类加载器中无法加载到,再从“扩展类加载器中”加载,成为“母”,双亲委派,如果都加载不到,才会考虑从应用类加载器中加载,直到加载到为止。类加载是由类加载器完成的。3.在代码开始执行之前,会将所需要的类全部加载到jvm,通过类加载器进行加载,需要注意的是,启动类在加载时,启动类加载器专门加载JAVA_HOME中jdk的中的核心库。第一种:Class c = Class.forName("带有包名的完整类名")
2024-12-20 08:58:06
445
原创 引用和变量的区别
总:每个变量都代表一个可以存储的内存位置,对于基本数据类型对应内存的值是基本类型值,引用类型变量是对应内存所存储的值是一个引用,是对象的存储地址。将一个变量赋值给另外一个变量值,另外一个变量值就被赋予同样的值。引用类型变量就是将一个变量的引用赋值给另一个变量。转化从低级到高级:short,byte,char(同级)——>int ——>long——>float——>double。1.整数类型:byte,short,int,long。2.浮点类型:float,double。3.字符类型:char。
2024-12-19 16:08:48
487
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅