一, 线程基础:
1.CPU 核心数和线程数的关系
线程数: 是同一时刻设备能并行执行的程序个数, 线程数 = CPU 个数 * 核数, 及程数 = CPU 个数(2) * 核数(2)=4;
使用了超线程技术后 ---> 1:2
2.CPU 线程数和 Java 多线程
(1) 线程是 CPU 级别的, 单个线程同时只能在单个 CPU 线程中执行
(2) java 多线程并不是由于 CPU 线程数为多个才称为多线程, 当 Java 线程数大于 CPU 线程数, 操作系统使用时间片机制, 采用线程调度算法, 频繁的进行线程切换.
(3) 线程是操作系统最小的调度单位, 进程是资源 (比如: 内存) 分配的最小单位
(4)Java 中的所有线程在 JVM 进程中, CPU 调度的是进程中的线程
**** 时间片机制: 又称 RR 调度, 会导致上下文切换
3. 什么是进程和线程
进程: 程序运行资源分配的最小单位, 进程内部有多个线程, 会共享这个进程的资源
线程: CPU 调度的最小单位, 必须依赖进程而存在.
4. 澄清并行和并发
并行: 同一时刻, 可以同时处理事情的能力
并发: 与单位时间相关, 在单位时间内可以处理事情的能力
5. 高并发编程的意义, 好处和注意事项
好处: 充分利用 CPU 的资源, 加快用户响应的时间, 程序模块化, 异步化
问题:
线程共享资源, 存在冲突;
容易导致死锁;
启用太多的线程, 就有搞垮机器的可能
6. 查看 JVM 自启动线程
- public static void main(String[] args) {
- ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
- ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
- for (ThreadInfo threadInfo : threadInfos) {
- System.out.println("[" + threadInfo.getThreadId() + "]" + " " + threadInfo.getThreadName());
- }
- }
Attach Listener: 线程是负责接收到外部的命令, 而对该命令进行执行的并且吧结果返回给发送者. 通常我们会用一些命令去要求 jvm 给我们一些反馈信息, 如: java -version,jmap,jstack 等等. 如果该线程在 jvm 启动的时候没有初始化, 那么, 则会在用户第一次执行 jvm 命令时, 得到启动.
signal dispather: 前面我们提到第一个 Attach Listener 线程的职责是接收外部 jvm 命令, 当命令接收成功后, 会交给 signal dispather 线程去进行分发到各个不同的模块处理命令, 并且返回处理结果. signal dispather 线程也是在第一次接收外部 jvm 命令时, 进行初始化工作.
Finalizer: 用来执行所有用户 Finalizer 方法的线程
Reference Handler: 它主要用于处理引用对象本身 (软引用, 弱引用, 虚引用) 的垃圾回收问题.
Java management 包
management 包中提供了比较全面的监控和管理工具, 包括 JVM 的监管 API, 监管 API 日志等等.
管理接口
PlatformManagementObject 接口: 所有的管理接口都要继承该接口, 这个接口是从 1.7 才出现的, 从其文档的注释中可以看到其存在的价值是为以后平台的扩展而设计的, 而不是为了应用程序.
BufferPoolMXBean 接口: 缓冲池管理接口包括 direct 和 mapped 类型的缓冲池.
ClassLoadingMXBean 接口: 类加载管理接口, 可以监控管理虚拟机类加载系统.
CompilationMXBean 接口: 虚拟机的编译系统的管理与监控.
GarbageCollectorMXBean 接口: 虚拟机垃圾收集的管理接口, 通过该接口可以查看垃圾收集的时间和次数.
MemoryManagerMXBean 接口: 该接口用于内存管理, 其中, 垃圾收集器属于该类型的内存管理器.
MemoryMXBean 接口: 用于虚拟机的内存管理, 执行 GC, 获取堆内存和非堆内存相关数据.
MemoryPoolMXBean 接口: 用于内存池的管理, 所谓的内存池表示的是虚拟机使用和内存管理者管理的内存资源.
OperatingSystemMXBean 接口: 操作系统管理接口, 可以查看系统的平均负载, 系统参数, 可用的进程数, 系统版本和名称等等.
PlatformLoggingMXBean 接口: 日志管理接口, 可以设置日志级别, 获取日志名称等等.
RuntimeMXBean 接口: 虚拟机运行时管理接口, 获取虚拟机的名称, 虚拟机版本, 获取 java 的 classpath, 获取系统参数等.
ThreadMXBean 接口: 虚拟机线程管理. 可以获取线程数, 获取线程 Id, 线程信息, 当前线程 CPU 时间, 当前线程用户时间, 查看死锁线程等等.
信息类实体
LockInfo: 任何的 java 锁(简单的 java 锁和 Concurrent 包中所使用的锁, AbstractOwnableSynchronizer 和 Condition 的实现类 / 子类).
MemoryUsage: 内存使用快照, 用于获取每个虚拟机或者堆或者虚拟机非堆内存池作为整体的使用信息.
MemoryNotificationInfo: 内存通知的信息.
MonitorInfo: 继承自 LockInfo, 同步代码块或者是同步方法上的锁.
ThreadInfo: 线程信息, 包括线程名称, 线程 id, 阻塞时间, 阻塞次数, 等待时间, 等待次数, 锁信息, 锁名称, 锁拥有者 id 等.
ManagementPermission: 权限管理类.
工厂类
ManagementFactory:MXBean 通过该工厂类进行获取, 使用了工厂模式管理, 经过该类获取到相应的 MXBean 类之后再调用其中的方法得到需要管理和监控的信息.
来源: http://www.bubuko.com/infodetail-3041179.html