Java面试题5-Linux使用与问题分析
硬链接和软链接的区别
在Linux上,一个文件被分为两部分(如图一):用户数据 (user data) 与元数据 (metadata)。
inode号:即索引节点号, 它是文件元数据的一部分,也是文件的唯一标识而非文件名。
通过文件名打开文件时:
硬链接
- 文件有相同的 inode 及 data block;
- 只能对已存在的文件进行创建;
- 不能交叉文件系统进行硬链接的创建;
- 不能对目录进行创建,只可对文件创建;
- 删除一个硬链接文件并不影响其他有相同 inode 号的文件。
创建硬链接,相当于多了一个文件别名。如果创建硬链接newfilename的话,如下图:
软链接
软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。因此软链接的创建与使用没有类似硬链接的诸多限制:
- 软链接有自己的文件属性及权限等;
- 可对不存在的文件或目录创建软链接;
- 软链接可交叉文件系统;
- 软链接可对文件或目录创建;
- 创建软链接时,链接计数 i_nlink 不会增加;
- 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。
inode是什么
理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”
inode包含文件的元信息,具体来说有以下内容:
* 文件的字节数
* 文件拥有者的User ID
* 文件的Group ID
* 文件的读、写、执行权限
* 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指 文件上一次打开的时间。
* 链接数,即有多少文件名指向这个inode
* 文件数据block的位置
可以用stat命令,查看某个文件的inode信息
怎么看一个Java线程的资源耗用
1、使用top命令 ,查询java进程
比如选择86184这个进程
2、用 top -H -p 86184 ,查询该进程下的线程资源
3、使用jstack 86184 > jstack.txt ,输出 该进程下的线程信息,
4、比如,观察到86344这个线程占用cpu 大, 将十进制的86344 转换成16进制 15148
cat jstack.txt | grep -i 15148
Load过高的可能性有哪些
top命令中load average显示的是最近1分钟、5分钟和15分钟的系统平均负载。
系统平均负载被定义为在特定时间间隔内运行队列中(在CPU上运行或者等待运行多少进程)的平均进程数
排查思路:
- 首先排查哪些进程cpu占用率高。 通过命令 ps ux
- 通过第一步看到某个JAVA进程占有资源率较高,查看对应java进程的每个线程的CPU占用率。通过命令:ps -Lp 15047
- 追踪线程内部,查看load过高原因。通过命令:jstack 15047
- 其他经验:cpu load的飙升,一方面可能和full gc的次数增大有关,一方面可能和死循环有关系
/etc/hosts文件什么做用
这个文件可以配置主机ip及对应的主机名,对于服务器类型的linux系统其作用还是不可忽略的。在局域网或是INTERNET上,每台主机都有一个IP地址,它区分开每台主机,并可以根据ip进行通讯。但IP地址不方便记忆,所以又有了域名。在一个局域网中,每台机器都有一个主机名,用于区分主机,便于相互访问。
Linux主机名的相关配置文件就是/etc/hosts;这个文件告诉本主机哪些域名对应那些ip,那些主机名对应哪些ip
/etc/resolv.conf文件什么作用
该文件是DNS域名解析的配置文件
nameserver #定义DNS服务器的IP地址
domain #定义本地域名
search #定义域名的搜索列表
sortlist #对返回的域名进行排序
/etc/resolv.conf的一个示例:
domain test.com
search www.test.com test.com
nameserver 202.96.128.86
nameserver 202.96.128.166
最主要是nameserver关键字,如果没指定nameserver就找不到DNS服务器,其它关键字是可选的。
如何快速的将一个文本中所有“abc”替换为“xyz”
cat file | tr "abc" "xyz" > new_file
你常用的Linux下用来进行网络和磁盘IO分析的工具有哪些
网络 ping traceroute netstat host
IO 磁盘 iostat
你常用的Linux下用来进行内存和CPU分析的工具有哪些
内存 top
CPU top sar
负载 vmstat
发现磁盘空间不够,如何快速找出占用空间最大的文件
1.linux中在当前目录下找出占用空间最大的前10大文件
首先要了解三个常用命令:
du : 计算出单个文件或者文件夹的磁盘空间占用.
sort : 对文件行或者标准输出行记录排序后输出.
head : 输出文件内容的前面部分.
du:
-a:显示目录占用空间的大小,还要显示其下目录占用空间的大小
sort:
-n : 按照字符串表示的数字值来排序
-r :按照反序排列
head :
-n : 取出前多少行
找出文件夹下占用空间最大文件前10个: du -a | sort -n -r | head -n 10
2.find / -type f -size +5G 找到大于5G的文件
Thread dump文件如何分析(Runnable,锁,代码栈,操作系统线程ID关联)
"pool-1-thread-13" prio=6 tid=0x000000000729a000 nid=0x2fb4 runnable [0x0000000007f0f000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
- locked <0x0000000780b7e688> (a java.io.InputStreamReader)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
- locked <0x0000000780b7e688> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
* 线程名称:pool-1-thread-13 当使用java.lang.Thread类生成一个线程时,将被命名为Thred-(Number),若java.util.concurrent.ThreadFactory类,将会被命名为pool-(Number)-thread-(Number)
* 优先级: 6,默认是5
* jvm线程id:tid=0x000000000729a000,jvm内部线程的唯一标识(通过java.lang.Thread.getId()获取,通常用自增方式实现。)
* 对应系统线程id(NativeThread ID):nid=0x2fb4,和top命令查看的线程pid对应,不过一个是10进制,一个是16进制。(通过命令:top -H -p pid,可以查看该进程的所有线程信息)
* 线程状态:runnable
* 起始栈地址:[0x0000000007f0f000]
* Java thread statck trace:这是最重要的数据,Java stack trace提供了大部分信息来精确定位问题根源。
free, jmap命令简介
free
先看一下free的运行结果:
free打印出的内存信息主要分为两种,一种是安装的内存,一种是用磁盘虚拟的内存,就是这里的Swap,相信装过Linux系统的同学肯定不陌生交换分区,这里Swap大小就是我们分区的时候分配的大小。
下面来分别解释以下每个列的意思:
total:去掉为硬件和操作系统保留的内存后剩余的内存总量。许多人奇怪自己的电脑安装了一共8G的内存,
但是显示总共只有七点几G的,现在应该没什么疑惑了把,不管Linux还是Windows都会有部分内存是保留给硬件和
操作系统的!
userd:当前已使用的内存总量。
free:空闲的或可以使用的内存总量
shared:共享内存大小,主要用于进程间通信
buff(buffers):主要用于块设备数据缓冲,例如记录文件系统的metadata(目录、权限等等信息)。
cache:主要用于文件内容缓冲
available:可以使用的内存总量
jmap
jmap -heap 1234
(1234为进程号)
jmap是JDK自带的一个工具,非常小巧方便,其支持参数如下:
-heap
打印heap空间的概要,这里可以粗略的检验heap空间的使用情况。
例:
jmap -heap 12345