并发编程(三)-线程运行原理

一、查看进程和线程的方法

1. Windows

  • 任务管理器可以查看进程和线程,也可以杀死线程。
    在这里插入图片描述
  • tasklist 查看线程。
    在这里插入图片描述
  • taskkill 杀死线程。加/F 强制杀死。
    在这里插入图片描述

2. Java

  • jps 命令查看所有 java 进程。
    在这里插入图片描述
  • jstack 查看某个 java 进程(PID)的所有线程状态。(某一刻的快照信息)
    在这里插入图片描述
  • jconsole 查看某个 java 进程中线程的运行情况(图形界面)。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. Linux

  • ps -fe 查看所有进程。加 | grep 过滤关键字。
  • kill 杀死进程。
    在这里插入图片描述
  • ps -ft -p 查看某个进程(PID)的所有线程。
  • top 按大写 H 切换是否显示线程。
  • top -H -p 查看某个进程(PID)的所有线程。

在这里插入图片描述

二、线程运行原理

1. 栈与栈帧

  • JVM 主要由堆、栈、方法区等组成,每个线程启动后,虚拟机会为其分配一块栈内存。
  • 每个栈由多个栈帧(Frame)组成,栈帧对应着每次方法调用时所占用的内存。
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法。

在这里插入图片描述


2. 栈帧图解

  • 程序运行时,jvm会进行类加载,类的字节码指令被加载到方法区,类加载完成后,jvm会启动main主线程,并将栈内存分配给main线程,CPU中的任务调度器将会分配时间片给线程,调用线程中的方法时还会分配栈帧内存。
  • 程序计数器是每个线程私有的,记录当前需要执行的代码,CPU通过程序计数器获取需要执行的代码。
  • 栈帧创建时就会给局部变量表分配内存,而不是等到执行某行代码时再去分配内存;局部变量表存局部变量和方法参数,返回地址对应程序退出地址。
  • 每个线程的栈内存是独立的,所以栈内存不是共享的,堆和方法区是共享的。

在这里插入图片描述

三、 线程上下文切换(Thread Context Switch)

  1. 线程上下文切换场景
  • 因为以下一些原因导致 cpu 不再执行当前的线程,转而执行另一个线程的代码:
    (1)当前线程的 cpu 时间片用完,CPU去执行其他线程;
    (2)垃圾回收会暂停当前所有的工作线程,切换到垃圾回收线程工作;
    (3)有更高优先级的线程需要运行,当前线程让出CPU使用权;
    (4)当前线程主动调用 sleep、yield、wait、join、park、synchronized、lock 等方法让出CPU使用权;
  1. 频繁发生线程上下文切换会影响性能
  • 当发生线程上下文切换时,需要由操作系统保存当前线程的状态信息,并恢复另一个线程的状态信息,Java 中对应的概念就是程序计数器(Program Counter Register),是线程私有的,它的作用是记住下一条 jvm 指令的执行地址。
  • 状态信息包括程序计数器、虚拟机栈中每个栈帧的信息,如局部变量、操作数栈、返回地址等。
  • 线程数超过了CPU核心数,CPU就会在线程之间来回切换,导致线程上下文切换,所以线程数不是越多越好。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值