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上运行或者等待运行多少进程)的平均进程数

排查思路:

  1. 首先排查哪些进程cpu占用率高。 通过命令 ps ux
  2. 通过第一步看到某个JAVA进程占有资源率较高,查看对应java进程的每个线程的CPU占用率。通过命令:ps -Lp 15047
  3. 追踪线程内部,查看load过高原因。通过命令:jstack 15047
  4. 其他经验: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 

image.png

IO 磁盘 iostat 

image.png

 

你常用的Linux下用来进行内存和CPU分析的工具有哪些

 

内存 top 

image.png

 

CPU top sar 

image.png

 

负载 vmstat

image.png

 

发现磁盘空间不够,如何快速找出占用空间最大的文件

 

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
posted @ 2020-01-20 09:47  reload  阅读(516)  评论(0编辑  收藏  举报