JUC 并发编程 (三) JUC并发工具
JUC并发工具并发工具线程池线程是一种系统资源,每个线程都会占用一定的内存资源,过多的线程可能会导致内存溢出的情况。同时,过多的线程会导致频繁的上下文切换而降低性能。因此不能过多的创建线程,在此问题的基础上,出现了线程池。
线程池是用于管理和复用线程的机制,减少过多的内存占用和线程数量导致频繁的上下文切换,以提升性能。
自定义线程池
ThreadPool - 线程池:用于管理可以被复用的线程
BlockingQueue - 阻塞队列:用于平衡生产者生产和消费者消费速度差异
消费者:相当于线程池中的线程,获取阻塞队列中的任务并执行
生产者:相当于请求或者其他线程产生任务
当消费者线程消费速度高于生产者线程生产时,线程池中线程需要等待 阻塞队列
当生产者线程生产速度高于消费者线程消费,阻塞队列用于存储来不及消费的任务
简单时间一个最大线程数和线程工厂的自定义线程池
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 ...
JUC 并发编程 (二) JMM
JUC 并发编程并发基础共享模型JMM
多线程在访问共享变量时,需要考虑临界区执行的原子性、资源的可见性和指令的有序性问题。
JMM - Java Memory Model javan内存模型即是一个抽象的概念。它规定了在多线程环境下,不同线程之间如何访问共享内存中的变量以及这些访问的可见性、有序性等方面的规则。
JMM 将内存分为了 主内存 和 工作内存。主内存是所有线程共享的内存区域,工作内存是每一个线程私有的内存,用于存储该线程使用到的变量的拷贝(在运行时,JIT编译器不断优化会将主内存的值拷贝到线程的工作内存中,减少对主内存的访问,提高效率)。
原子性
原子性 - atomicity 是指在一次操作中,要么所有的步骤都被执行,要么都不被执行,不会出现部分执行的情况。
原子性保证了指令的执行不会受到线程上下文切换的影响。
在多线程环境中,这意味着对共享变量的指令操作要么是完全执行,要么完全不执行。
可见性
可见性 - visibility 是指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。在没有适当同步的多线程程序中,一个线程对共享变量的修改可能对其他线程不可见 ...
JUC 并发编程 (一) 基础
JUC 并发编程多线程的引入进程和线程定义
进程(process)是计算机中运行的程序一个实例。进程之间有相互独立的内存空间,每个进程有自己的地址空间、指令、数据、系统资源等。
线程(thread)是进程中的一个执行单元,一个进程中包括了多个线程,它们共享了相同的内存空间和系统资源。
现代操作系统将进程作为资源分配和保护的基本单位,将线程作为调度和执行基本单位。
内存和资源
各个进程之间拥有独立的内存空间,同一进程内的线程共享相同的内存空间和资源。
通信
进程之间的通信需要使用特定的机制,用一台计算机的进程通信称为IPC(Inter-process communication),不同计算机的之间通信需要通过网络并遵守相应的协议。
线程之间通信可以通过共享内存进行直接通信,也可以通过java提供的线程间通信机制(wait、notify等)实现通信
上下文切换
进程的上下文切换的开销要比线程的上下文切换的大很多,因此线程更加轻量。
开销
进程的创建和销毁开销相对较大,因为每个进程都要分配自己独立的内存空间和资源;
线程的创建和销毁开销相对较小,因为线程之间共享相同的内存空间和系统资 ...
jvm 原理
jvm 原理jvm 数据存储栈的数据存储局部变量表 slotjava 提供了8个基本数据类型 byte-1,short-2,integer-4,long-8,float-4,double-8,char-2,boolean-1 每个基本数据类型内存占用的字节数不同,注意这里的内存占用指的是:堆上或数组中内存分配的空间大小,栈上的内存分配实现不同。
jvm的栈中的局部变量表用于存储方法的局部变量,局部变量表中的每个槽位(Slot)都有固定的大小,一般为32位,可以容纳一个基本数据类型的值或者一个对象的引用。byte, char, short, boolean, int, float,对象引用占用一个槽位即32位,float,double占用两个槽位。
jvm的栈中的操作数栈用于存储方法执行过程中的操作数,基本数据类型或者对象引用在操作数栈的存储大小与局部变量表中的存储大小。
我们发现 byte、char、short 和 boolean 类型在局部变量表中占用一个槽位即32位,这样的设计是为权衡性能和存储的考虑:
性能:利用硬件数据对齐(避免数据类型判断)和处理优势,提高运行时性能 ...
jvm 高级
jvm 高级GraalVMGraalVM简介
GraalVM 是 Oracle 官方推出的一款高性能 JDK,它拥有比 OpenJDK 或者 OracleJDK 更好的性能。
应用程序占用更低的CPU和内存资源
应用程序启动速度快点,无需预热即可获得最好的性能
使得应用程序安全性更好,由于更小的可执行文件
支持多种框架,包括Spring Boot,Quarkus等
GraalVM 分为 社区版(Community Editon) 和 企业版(Enterprise Edition)。企业版相比于社区版,性能得到了更多的优化:
安装
linux
使用 arch 查看架构
下载 GraalVM linux x86 社区版
安装 GraalVM 并配置环境变量
123tar -xvf graalvm-jdk-21_linux-x64_bin.tar.gzvim /etc/profile # 修改配置 JAVA_HOME=/usr/lib/jvm/graalvm-jdk-21.0.1+12.1source /etc/profile # 配置生效
docker
1FROM ghc ...
jvm 实战
jvm 实战内存调优内存泄漏和内存溢出
内存泄漏(memory leak)
定义:在程序在运行时,由于一些不再使用的对象无法被垃圾回收机制及时释放,导致已不再需要的内存仍然被占用,最终可能导致系统内存溢出。
内存泄漏大多数情况是由堆内存泄漏引起的。
内存溢出(memory overflow)
定义:程序在运行时请求的内存超过了JVM所能提供的最大内存限制,导致程序无法继续执行,通常会抛出OutOfMemoryError异常。
内存溢出并不只有内存泄漏这一种原因。
解决内存溢出问题
发现问题
使用监控工具对于jvm堆内存进行监控和告警
诊断问题
通过分析工具诊断问题产生原因,定位到源代码
修复问题
测试验证
常用内存监控
使用监控工具对于jvm堆内存进行监控和告警
常用内存监控工具top命令top命令是一个在Linux系统上用于查看系统实时性能数据的命令行工具。它可以显示系统的实时运行状态,包括CPU、内存、进程等信息。
进入显示页面后,按 m 键,可以按照内存使用率进行排序。
共享内存通常包括系统库和一些共享的数据,是多个进程共享的内存,因此进程 ...
jvm 基础
jvm 基础初始jvmjvm职责
jvm - java virtual machine 即 java虚拟机,是 经过java编译器(javac)编译后的 java程序 的运行环境。
jvm 是运行在计算机上的程序,他是运行 java字节码的程序,他的职责是运行即将 已经经过java编译器(javac)编译的字节码文件(.class文件)进行加载和执行时解释,执行时通过JIT(just-in-time compilation - 即时编译技术)将字节码解释成机器码,以便于计算机能够理解和执行。
在正常项目过程中,我们会先将java工程编译并打包成jar文件(jar即是包含经过编译后的字节码,资源文件以及相关文件的打包在一起的一种文件格式),jar部署在jvm虚拟机上运行,由于jvm部署所在的计算机无法直接执行字节码(字节码是由一组针对jvm设计的指令构成 - 虚拟机指令),所以jvm需要加载并通过JIT即时编译技术将字节码解释成机器码,交给计算机理解和执行。
因此,java程序不能直接在计算机上运行的,而是编译后通过jvm加载并执行。
正是因为 针对不同程序的不同编译器所编译成的相 ...
JVM性能调优工具
JVM性能调优工具常见命令行命令jps
jps主要用于输出JVM中运行的进程状态信息
123456jps [options] [hostid]# [hostid]:不指定hostid默认当前主机或服务器# [options]: -q:不输出类名、Jar名和传人main方法的参数# -m:输出传人main方法的参数# -l:输出main类或Jar的全限名# -v:输出传人JVM的参数
jstack
jstack主要查看某个Java进程内的线程堆栈信息
12345678910111213jstack [option] <PID># [options]:-l 打印额外的锁信息 jstack -l pid# :-m 输出堆栈信息 # 首先找到进程IDtop -H# 查看线程信息ps -mp <PID> -o THREAD,tid,time# ps -Lfp <PID># top -Hp <PID># 打印出16进制的线程IDprintf "%x\n" ...
MybatisX 自定义 FreeMarker 模块
MybatisX 自定义 FreeMarker 模块
.meta.xml123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960<?xml version="1.0" encoding="utf-8" ?><templates> <template> <property name="configName" value="controller"/> <property name="configFile" value="controller.ftl"/> <property name="fileName" value="${domain.fileName ...
Linux常用命令
Linux常用命令系统服务管理systemctl
Systemctl命令是Service和chkconfig命令的组合体,可用于管理系统
输出系统各个服务的状态1systemctl list-units --type=service
查看服务的运行状态1systemctl status firewalld
关闭服务1systemctl stop firewalld
启动服务1systemctl start firewalld
重新启动服务1systemctl reload firewalld
禁止服务开机自启动1systemctl disable firewalld
开启服务开机自启动1systemctl enable firewalld
文件管理ls
列出指定目录下的所有文件
列出/目录下的文件
1ls -l /
pwd
获取目前所在工作目录的绝对路径
1pwd
cd
改变当前工作目录
1cd /
date
显示或修改系统时间与日期
1date '+%Y-%m-%d %H:%M:%S'
passwd
用于设置用户密码
1 ...