1、减少上下文切换的方法有

1、无锁并发编程

多线程竞争时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,将数据Id按hash算法取模来分段,不同的线程处理不同时端的数据

2、CAS算法

Java的atomic包使用CAS算法来更新数据,面不需要加锁。Atomic变量的更新可以实现数据操作的原子性及可见性。这个是由volatile 原语及CPU的CAS指令来实现的。

3、使用最少的线程

若任务少,但创建了很多线程来处理,这样会造成大量的线程处于等等状态。

4、使用协程

在单线程里实现多任务的调度,并在单线程里维持多个任务间切换。java语言级别原生并不支持协程,可以看下kilim,利用java增强字节码实现角色模型(actor)

2、查看jvm中线程的状态及执行情况

查看java的pid

ps –ef|grep java

用jstack dump 线程的信息

/usr/java/jdk1.8/bin/jstack 9102>9102.dump

统计各状态的线程数量

grepjava.lang.Thread.Stat 9102.dump |awk '{print$2$3$4$5}'|sort|uniq –c

查看上下文切换的次数

利用jstack –l pid查看线程的状态信息(在windos在任务管理器中查看java 的PID,linux用ps –ef查看)

举例

public classDeadLockDemo {private static  StringA="A";private  static String  B="B";public static void main(String[] args){new DeadLockDemo().deadLock();}private void deadLock() {Thread thread = new Thread(newRunnable() {public void run() {synchronized (A) {try {Thread.currentThread().sleep(2000);} catch(InterruptedExceptione) {e.printStackTrace();}synchronized (B) {System.out.println(1);}}}});Thread thread1 = newThread(newRunnable() {public void run() {synchronized (B) {synchronized (A) {System.out.println("2");}}}});thread.start();thread1.start();}
}

线程 信息如下:

 Java stack information for the threads listed above:
===================================================
"Thread-1":at com.thread.test.DeadLockDemo$2.run(DeadLockDemo.java:31)- waiting to lock <0x00000007c0987e08> (a java.lang.String)- locked <0x00000007c0987e38> (a java.lang.String)at java.lang.Thread.run(Thread.java:724)
"Thread-0":at com.thread.test.DeadLockDemo$1.run(DeadLockDemo.java:22)- waiting to lock <0x00000007c0987e38> (a java.lang.String)- locked <0x00000007c0987e08> (a java.lang.String)at java.lang.Thread.run(Thread.java:724)

参考:

多线程编程-减少上下文切换(1)_yxpjx的专栏-CSDN博客_如何减少上下文切换

如何减少CPU上下文切换相关推荐

  1. 性能瓶颈--CPU(上下文切换)

    CPU的性能瓶颈不仅仅是cpu负载.因为Linux的性能问题可能是牵一发而动全身的. 比如一个占用内存较高的java程序,导致问题的根本原因是内存不足,但是反映最直观的可能是cpu使用率很高.因为ja ...

  2. CPU上下文切换、进程上下文、中断上下文

    由于Linux是一个多任务操作系统,能够支持远大于CPU数量的任务同时运行.当然,这些任务实际上并不是真的在同时运行,而是由CPU进行调度,将时间分片,每个任务占用1个时间片,通过轮流的方式运行,但由 ...

  3. linux查看上下文切换命令,Linux性能优化,Linux查看CPU上下文切换

    CPU上下文切换,可能会导致CPU使用率的飙升,那当CPU到100%的时候,我们该如果定位是否是因为CPU上下文切换导致的呢? 可以通过vmstat.pidstat命令来查看. 可以看到,这个例子中的 ...

  4. cpu上下文切换(下)

    cpu上下文切换如何查看 上一篇介绍了cpu上下文切换几种场景以及数据保存恢复过程,这篇文章介绍如何查看cpu上下文切换 一.vmstat 安装:yum install -y sysstat vmst ...

  5. linux cpu上下文切换 简介

    目录 什么是CPU上下文 什么是CPU上下文切换 进程上下文切换 线程上下文切换 中断上下文切换 linux的上下文切换查看 上下文切换次数多少合理? 什么是CPU上下文 Linux是一个多任务操作系 ...

  6. Windows 技术篇-减少对视频相关服务的cpu分配,减少cpu占用率

    如果有视频相关服务的话,电脑会多分配一些cpu给过去. 我们可以通过控制这个来达到减少cpu占用率的效果. 通过Win+R打开运行,输入regedit回车打开注册表. 路径在图片的底下,我们修改的是D ...

  7. 进程用户态 上下文切换需要保存哪些_漫话性能:CPU上下文切换

    序言 表弟:CPU平均负载​zhuanlan.zhihu.com 我们理解了平均负载( Load Average),并用三个案例展示了不同场景下平均负载升高的分析方法.这其中,多个进程(或线程)竞争 ...

  8. 04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)

    上一节,我给你讲了 CPU 上下文切换的工作原理.简单回顾一下,CPU 上下文切换是保证 Linux 系统正常工作的一个核心功能,按照不同场景,可以分为进程上下文切换.线程上下文切换和中断上下文切换. ...

  9. 03 | 基础篇:经常说的 CPU 上下文切换是什么意思?(上)

    上一节,我给你讲了要怎么理解平均负载( Load Average),并用三个案例展示了不同场景下平均负载升高的分析方法.这其中,多个进程竞争 CPU 就是一个经常被我们忽视的问题. 我想你一定很好奇, ...

最新文章

  1. eta 深度学习 参数_深度学习中的参数梯度推导(一)
  2. python定义函数计算斐波那契公式前20的项_Python3算法之二:斐波那契函数
  3. 蓝牙耳机音量大解决办法_长时间使用蓝牙耳机的危害这么大?我们到底该选什么蓝牙耳机呢?...
  4. 【转载】别了,摩托罗拉(十):“战争部落”和“独立王国”
  5. html柳树动画,3D教程-柳树生长动画
  6. 构建复杂的应用程序 —— 重用与重构
  7. tkinter 实现简单登录窗
  8. JDK打印的疑问:CUPSPrinter有何用处?
  9. 验证码生成工具google authenticator
  10. 如何退出控屏软件(以极域为例)
  11. 华为机顶盒视频播放代码
  12. HTML-简单表单制作
  13. 双十一大促过后怎么维护淘宝店铺数据
  14. 知识管理系统,帮你挖掘出企业90%的隐性知识
  15. CHM文件的搜索功能帮助(摘自MSDN).
  16. 嵌入式网络的基础知识 -- 数据包的组装、拆解、各头部格式
  17. centos查看显卡型号时出现 NVIDIA Corporation
  18. Linux ftrace 1.1、ring buffer
  19. DirectX11 Direct3D初始化
  20. (五)苏世民:我的经验和教训:成功人生的十大信条

热门文章

  1. Sass和SCSS有什么区别?
  2. 为什么我的网站部署了https却没有绿色的小锁标志
  3. 一个批处理远离百度广告的骚扰
  4. 【论文写作】如何表示比较关系, compare to OR compare with?
  5. android-为手机设置全局代理
  6. gradle全局代理
  7. 《快学 Go 语言》第 11 课 —— 千军万马跑协程
  8. PowerBuilder9.0 使用xmlhttp组件调用webservice
  9. day16力扣383赎金信
  10. 给字符数组赋值java_给字符数组赋值的方法