linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧 - 掘金
进程
可重入内核
- 局部函数或锁实现
- 中断程序(设备中断,ctrc-c退出程序等)发生或异常发生,其他进程可以占用内核
进程地址空间
- 进程私有栈,数据,代码区,内核态运行时访问内核的代码区和数据,栈
同步和临界区
- 信号量
- 一个整数,一个链表,down(),up()函数
- init=1, down时-1,当为-1时将当前进程加入链表挂起,up+1,当>=0时,链表上一进程执行
- 更新数据结构,效率低
- 自旋锁
- 没有链表,一直执行获取锁
- 死锁问题
- 信号和消息队列,相当于进程间进行通信
随机内存访问(ram)
- 几兆存储内核代码和内核静态变量
- 虚拟存储器系统管理
内核内存分配器
shell
接受参数
$0 当前脚本名称
$1 第1个参数
$# 参数个数
$? 上一次命令的执行返回值
$* 所有传递给脚本或函数的参数
判断参数
文件判断参数
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行
数值比较参数
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-lt 是否小于
-le 是否等于或小于
-ge 是否大于或等于
字符串比较
= 比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空
-n 判断字符串内容是否非空
条件语句
while
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品实际价格为 0-999 之间,猜猜看是多少?"
while true
do
read -p "请输入您猜测的价格数目:" INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜您答对了,实际价格是 $PRICE"
echo "您总共猜测了 $TIMES 次"
exit
elif [ $INT -gt $PRICE ] ; then
echo "太高了!"
else
echo "太低了!"
fi
done
case
#!/bin/bash
read -p "请输入一个字符,并按 Enter 键确认:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "您输入的是 字母。"
;;
[0-9])
echo "您输入的是 数字。"
;;
*)
echo "您输入的是 空格、功能键或其他控制字符。"
esac
/dev/null 是一个被称作 Linux 黑洞的文件,把输出信息重定向到这个文件等同于删
除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁
~/.bash_history
shell history
环境变量
全局:cat /etc/profile
用户:cat ~/.bash_profile,即当前用户目录下,HOME/.bash_profile
export: 导出为全局变量
基础命令
cd - 令返回到上一次所处的目录
find -exec {} </font>
find / -user linuxprobe -exec cp -a {} /root/findresults/ \;
#在整个文件系统中找出所有归属于 linuxprobe 用户的文件并复制到/root/findresults 目录中
#{}表示 find 命令搜索出的每一个文件,并且命令的结尾必须是“\;”。
locate
yum install mlocate
updatedb
locate filename
top process cpu,内存信息
ls
ps process 所有进程信息
netstat 网络连接,端口号使用情况
ifconfig 挂载的网卡信息
lsof 系统当前打开的文件句柄
ss -tnlp | grep pid 查看进程占用端口
cat
more
# 前10行
head -n 10
# 尾部10行
tail -n 10
tail -f filename
rm
grep
kill
ctrl +c 切换到终端
ctrl +z 退出数据库
- ps -elf | grep 进程名 根据进程名查进程ID
2)netstat -nap | grep 2862 根据ID查询进程开启端口
3)netstat -nap | grep 8080 根据端口号查看使用的进程
sudo 管理员权限
free 内存使用情况
history
ctrl + r : 搜索历史命令
ctrl + p , ctrl + n : 上下翻查
file
- which 查找命令
- whereis 二进制文件,源代码,文档
- whereis ls #如果上述三者有,则三者都会显示。
ls: /bin/ls /usr/share/man/man1/ls.1.gz
whereis -m ls #只查看ls的帮助手册
ls: /usr/share/man/man1/ls.1.gz
whereis -b ls #只查找ls的二进制文件
ls: /bin/ls
whereis stdio.h #查找stdio.h头文件,和帮助手册
stdio: /usr/include/stdio.h /usr/share/man/man3/stdio.3.gz
同样地,它不能查找到内置命令
- whereis ls #如果上述三者有,则三者都会显示。
- locate
- locate -r /locate.log$ #查找以/locate.log结尾的文件
- locate -i locate.zip 忽略大小写查找
/home/hyb/workspaces/shell/locate/LOCATE.zip
- find
- find ./ -name "sort*" 当前目录下查找以sort开头的文件
- tee
-
将进程信息通过管道输出到标准输出(终端)并覆盖写入到文件中。
-
ps -ef |tee info_a.log info_b.log
- # 将进程信息通过管道输出到标准输出(终端)并追加写入到文件中。
ps -ef |tee -a info_a.log info_b.log
管道命令
【1】linux管道命令学习(一) - mrzero - 博客园
通配符
touch {AA,BB,CC}.conf
ssh
ssh
yum install -y openssh-server
vi /etc/ssh/sshd_config
PubkeyAuthentication yes
systemctl restart sshd.service
logout #quit
tmux
tmux ls
0: 1 windows (created Tue Jan 31 01:17:19 2023) [157x52] (attached)
tmux attach -t 0
exit
-- 共享ssh
-- a
ssh 192.168.10.10
tmux new -s share
-- b
ssh 192.168.10.10
tmux attach-session -t share
sftp & scp
sftp ip
get 远程服务器文件名
get -r 远程服务器文件夹名
put 本地服务器文件名
exit
scp /appl/app-schedule/aps-schedule-service.jar aps@10.98.101.45:/appl/app-schedule/new
mtux
prefix : ctrl + b
tmux
prefix % 左右创建
prefix " 上下创建
prefix o 切换
prefix x 关闭
log
journalctl
转义符
“”:保留其中的变量属性,不进行转义处理
[root@linuxprobe~]# PRICE=5
[root@linuxprobe~]# echo "Price is $PRICE"
Price is 5
$$: 显示当前进程iD
[root@linuxprobe~]# echo "Price is $$PRICE"
Price is 3767PRICE
\: 使反斜杠后面的一个变量变为单纯的字符
[root@linuxprobe~]# echo "Price is \$$PRICE"
Price is $5
``:返回其中命令执行结果
[root@linuxprobe~]# echo `uname -a`
Linux linuxprobe.com 4.18.0-80.el8.x86_64 #1 SMP Wed Mar 13 12:02:46 UTC 2019
x86_64 x86_64 x86_64 GNU/Linux
'':转义其中所有的变量为单纯的字符串
部署项目
nohup java -server -Xms256M -Xmx2048M -jar myserver.jar &> mylog.log
2>&1
// 1表示标准输出,2表示标准错误输出,2>&1表示将标准错误输出重定向到标准输出
> 从头写
>> 追加写
2> 错误内内容输出
&>> 不区分标准输出和错误输出,追加写
< 读入文件信息
- &代表在后台运行。
特定:当前ssh窗口不被锁定,但是当窗口关闭时,程序中止运行。
- nohup 意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行
当用 nohup 命令执行作业时,缺省情况下该作业的所有输出被重定向到nohup.out的文件中。
- command >out.file
command >out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。
- job
使用jobs命令查看后台任务
文件
文件结构
/boot 开机所需文件—内核、开机菜单以及所需配置文件等
/dev 以文件形式存放任何设备与接口
/etc 配置文件
/home 用户主目录
/bin 存放单用户模式下还可以操作的命令
/lib 开机时用到的函数库,以及/bin 与/sbin 下面的命令要调用的函数
/sbin 开机过程中需要的命令
/media 用于挂载设备文件的目录
/opt 放置第三方的软件
/root 系统管理员的家目录
/srv 一些网络服务的数据文件目录
/tmp 任何人均可使用的“共享”临时目录
/proc 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等
/usr/local 用户自行安装的软件
/usr/sbin Linux 系统开机时不会使用到的软件/命令/脚本
/usr/share 帮助与说明文件,也可放置共享文件
/var 主要存放经常变化的文件,如日志
/lost+found 当文件系统发生错误时,将一些丢失的文件片段存放在这里
磁盘
df -h
du -sh /*
raid
raid0
追求最大容量和速度;但是任何一块硬盘损坏,数据将全部异常
raid1
追求最大安全性,只要阵列中有一块硬盘可用,数据就不受影响
raid5
磁盘阵列中数据的奇偶校验信息并不是单独保存到某一块硬盘设备中,而是存储到除自身以外的其他每一块硬盘设备上;
Parity 部分存放的就是数据的奇偶校验信息;当硬盘设备出现问题后通过奇偶校验信息来尝试重建损坏的数据;
兼顾了硬盘设备的读写速度、数据安全性与存储成本问题
raid10
综合 RAID 1 和 RAID 0 的优点,追求硬盘的速度和安全性,允许有一半硬盘出现异常(不可发生在同一阵列中),且数据不受影响
lvm
查看文件
查看第200行
cat temp.log | sed -n '200p' //sed命令能直接用行号匹配,匹配到的行用p指令输出就行了
查看前200行
cat temp.log | head -n 200
查看第90到100行
cat temp.log | sed -n '90,100p'
查看符合行开始往后200行
cat out.log | grep -A 200 '异步调用算法'
cat 1.log | less
ctrl + F - 向前移动一屏
ctrl + B - 向后移动一屏
G - 移动到最后一行
g - 移动到第一行
h - 显示 less 的帮助文档
统计文件
find -name "*.js" | wc -l // 统计当前文件夹下 js 文件的数量
ls -l | grep "^-" | wc -l // 统计当前目录下文件的个数(不包括目录)
ls -lR| grep "^-" | wc -l // 统计当前目录下文件的个数(包括子目录)
find . -name filename | wc -l // 统计当前文件夹下叫某某的文件的数量
文件类型
Linux中第一个字符代表这个文件是目录、文件或链接文件等等。
当为[ d ]则是目录
当为[ - ]则是文件;
若是[ l ]则表示为链接文档(link file);
若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合
设置隐藏属性
chattr +a filename
lsattr filename
+ uerId+groupId
内存占用查看
ps aux | sort -k4nr | head -n 10
比如说sort -k 1 -k 2 test.txt,那么就会根据test.txt文件中的第一列和第二列进行排序。
-n:依照数值的大小排序;
-r:以相反的顺序来排序
1)USER: 行程拥有者
2)PID: 进程的ID
3)%CPU: 占用的 CPU 使用率
4)%MEM: 占用的记忆体使用率
5)VSZ: 占用的虚拟记忆体大小
6)RSS: 占用的记忆体大小
7)TTY: 终端的次要装置号码 (minor device number of tty)
8)STAT: 该行程的状态:
D: 不可中断的静止
R: 正在执行中
S: 静止状态
T: 暂停执行
Z: 不存在但暂时无法消除
W: 没有足够的记忆体分页可分配
<: 高优先序的行程
N: 低优先序的行程
L: 有记忆体分页分配并锁在记忆体内
9)START: 行程开始时间
10)TIME: 执行的时间
11)COMMAND:所执行的指令
CentOS 7 容器内替换 apt-get 源为阿里源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
echo "">sources.list
echo "deb mirrors.aliyun.com/debian stable main contrib non-free">>sources.list
echo "deb mirrors.aliyun.com/debian stable-updates main contrib non-free">>sources.list
VirtualBox扩容CentOS-7虚拟机磁盘 - Javaer1995 - 博客园
<< eof
~
~/ 表示的目录是 /home/<用户目录>/ 或者 /root/
rysnc
kswapd0 cpu 100%
安装jdk8
java -version
wget https://repo.huaweicloud.com/java/jdk/8u181-b13/jdk-8u181-linux-x64.tar.gz
tar -zvxf jdk-8u181-linux-x64.tar.gz
vim /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8 # java解压的路径
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME/jre
source /etc/profile
java -version
mvn
mvn package -DskipTests
nexus
类型
- group(仓库组类型):又叫组仓库,用于方便开发人员自己设定的仓库;
- hosted(宿主类型):内部项目的发布仓库(内部开发人员,发布上去存放的仓库)
- proxy(代理类型):从远程中央仓库中寻找数据的仓库(可以点击对应的仓库的 Configuration 页签下 Remote Storage Location 属性的值即被代理的远程仓库的路径)
- 这里就是代理的意思,代理远程中央 Maven 仓库,当 项目构建访问中央库的时候,先通过代理去远程中央仓库下载依赖包到Nexus 仓库,然后再从Nexus仓库下载到本地。私服我们部署在内网服务器,只要其中一个人从远程中央库下来了,以后相同的依赖包就都是从Nexus私服上进行下载,这样大大加快下载速度,不怕远程中央仓库出现问题
上传jar
本地仓库
mvn install:install-file
-DgroupId=org.example
-DartifactId=OssSpringBootStarter
-Dversion=1.0-SNAPSHOT -Dpackaging=jar
-Dfile=D:\1\spirng\testJAR\OssSpringBootStarter\target\OssSpringBootStarter-1.0-SNAPSHOT.jar
私服
私服仓库类型必须为hosted
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>D:\maven\ycc_repo</localRepository>
<servers>
<server>
<id>fs</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyunmaven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<profiles>
<profile>
<id>default</id>
<activation>
<jdk>1.8</jdk>
</activation>
<repositories>
<repository>
<id>fs</id>
<name>fs</name>
<url>http://192.168.137.73:8081/repository/fs/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>default</activeProfile>
</activeProfiles>
</settings>
- pom引入
<distributionManagement>
<!-- 这里可以配置多个比如snapshots快照仓库 这里只配置一个 -->
<repository>
<id>fs</id>
<name>fs-hostes</name>
<url>http://192.168.137.73:8081/repository/fs/</url>
<uniqueVersion>true</uniqueVersion>
</repository>
</distributionManagement>
- mvn deploy
mvn deploy:deploy-file
-Dfile=本地jar的路径 -DgroupId=你的jar包groupId -DartifactId=你的jar包名称
-Dversion=你的jar包版本号 -Dpackaging=jar -Durl=你的私服路径 -DrepositoryId=你的仓库ID
mvn deploy:deploy-file -Dfile=D:\1\spirng\testJAR\nexusTest\target\nexusTest-1.0-SNAPSHOT.jar
-DgroupId=com.fs -DartifactId=nexusTest -Dversion=1.0-SNAPSHOT -Dpackaging=jar
-Durl=http://192.168.137.73:8081/repository/fs/ -DrepositoryId=fs -e