JVM--偏向锁

定义在对象的对象头信息里。所以它也最轻。

当线程获取对象的偏向锁时,对象头的Mark word中会记录当前偏向的线程,所以mark word里存在线程信息,偏向方式是没有竞争时取消当前线程的同步操作。但又不能因为偏向失去锁的意义,所以竞争时,重新偏向其他线程。所以偏向锁在竞争少时能提高性能,竞争多时偏向锁多线程间切换,起不到偏向的作用。

 

书本解释

偏向锁mark word格式

 

23位偏向锁线程|2位偏向锁时间戳|4位对象年龄|1(偏向锁固定位)|01(表示可偏向/未锁定)

 

核心思想

 

线程获取锁时没有线程间竞争,那么则取消获取锁的同步操作。即获取锁的线程后续操作不会走同步操作。

 

参数

-XX:+/-UseBiasedLocking 启动/禁用偏向锁,默认虚拟机启动4秒后启动偏向锁

-XX:BiasedLockingStartupDelay 虚拟机启动后,立刻启动偏向锁

 

偏向锁Mark Word记录了获取锁的线程,而且核心思想是同一线程多次访问,去除同步操作,所以偏向锁适用于竞争不激烈的场景,可以避免多余的同步操作。

当处于竞争激烈的场景下,偏向锁在多线程的切换,并不能一直处于偏向模式,达不到优化效果。

### 如何禁用 Java 偏向及其相关配置 在 Java 的 JVM 中,偏向是一种优化机制,默认情况下启用。它旨在减少无竞争情况下的同步开销。然而,在某些场景下,可能需要禁用偏向以满足特定需求。 可以通过设置 `-XX` 类型的 JVM 参数来控制偏向的行为。具体来说,可以使用以下参数禁用偏向: #### 禁用偏向JVM 参数 要完全禁用偏向,可以在启动 JVM 时添加如下参数: ```bash -XX:-UseBiasedLocking ``` 此参数会告诉 JVM 不使用偏向机制[^4]。一旦设置了该参数,JVM 将不会尝试为任何对象应用偏向,而是直接进入轻量级或重量级的状态。 #### 控制偏向撤销的时间间隔 除了完全禁用偏向外,还可以调整偏向的撤销时间间隔。默认情况下,偏向会在一定时间内保持有效状态。如果希望缩短这一时间窗口,可以使用以下参数: ```bash -XX:BiasedLockingStartupDelay=0 ``` 上述参数表示取消偏向的延迟初始化时间(默认为 4 秒)。这使得 JVM 在启动后立即允许偏向生效[^5]。 需要注意的是,虽然可以调整 `BiasedLockingStartupDelay` 来改变偏向的行为,但这并不会彻底禁用偏向功能。 #### 示例:完整的 JVM 参数配置 假设有一个 Java 应用程序需要禁用偏向并查看详细的垃圾回收日志,可以这样配置 JVM 参数: ```bash java -XX:-UseBiasedLocking -Xlog:gc* -jar myapp.jar ``` 在此命令中: - `-XX:-UseBiasedLocking` 完全禁用了偏向- `-Xlog:gc*` 添加了垃圾收集器的日志输出以便调试。 #### 性能影响分析 偏向的设计初衷是为了提高单线程环境下的性能表现。因此,在多线程高并发的情况下,禁用偏向可能会带来一定的性能提升。这是因为避免了频繁的偏向撤销操作以及相关的元数据更新成本。 另一方面,对于大多数应用程序而言,默认开启偏向通常是更优的选择,因为它能够显著降低无争用条件下的定开销。只有在经过充分测试和验证之后,才建议修改这些高级参数。 ```python # 示例代码展示如何通过命令行传递 JVM 参数 import subprocess command = [ "java", "-XX:-UseBiasedLocking", # 禁用偏向 "-Xms512m", # 设置初始堆大小 "-Xmx1g", # 设置最大堆大小 "-jar", # 运行 jar 文件 "myapplication.jar" ] subprocess.run(command) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值