0%

监控工具

  • btrace

    1
    2
    3
    4
    5
    6
    7
    8
    btrace [-I <include-path>] [-p <port>] [-cp <classpath>] <pid> <btrace-script> [<args>]
    -I BTrace支持对#define、#include这样的条件编译指令进行简单的处理,include-path用来指
    定这样的头文件目录
    -p port参数用来指定btrace agent端口,默认是2020
    -cp classpath用来指定编译所需类路径,一般是指btrace-client.jar等类所在路径
    pid 表示需要跟踪的java进程id
    btrace-script 为自定义的 btrace脚本
    args 为传递给btrace脚本的参数
  • jvm自带jps、jstate、jinfo、jstack、jmap

  • MAT内存分析

  • VisualVM

  • Jconsole

  • Jprofiler

  • Java Flight Recorder

  • GCViewer

  • GC Easy

JVM生命周期

JVM的生命周期分为启动、执行和退出

JVM启动

JVM启动是通过引导类加载器(bootstrap class loader)创建一个初始类来完成的,这个类是由虚拟机的具体实现指定的

JVM执行

java虚拟机的任务就是执行java程序,程序执行时运行,程序结束时停止,在执行程序时实际上执行的是java虚拟机进程

JVM退出

JVM退出会有以下几种情况

  • 程序正常执行结束
  • 程序在执行过程中遇到了异常或错误而异常终止
  • 由于操作系统出现错误导致java虚拟机进程终止
  • 某线程调用Runtime类或秀禾System类的exit方法,或Runtime类的halt方法,并且java安全管理器也允许这次exit或halt操作
  • JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载java虚拟机时,java虚拟机的退出情况

Git修改提交信息

有时候打字打得太快导致提交信息写错了,但是回车键已经按下去了,这时候提交信息如何修改呢

  • 首先查看所要修改的提交信息的commit是倒数第几次提交的,使用git log查看提交记录

    1
    git log
Git修改提交信息第一步
  • 我要改的是倒数第一条的提交信息,然后我要退回到倒数第n次的状态,使用git rebase进行回退,将对应的提交前面的pick改成edit,然后进行保存

    1
    git rebase -i HEAD~1
  • 执行git commit –amend后生成的commit是一个全新的commit,之前老的commit会从项目历史中被删除

    1
    git commit --amend
  • 执行git rebase –continue

    1
    git rebase --continue
  • 最后执行git push

maven打包包含第三方依赖

对于一个java项目来说,肯定会依赖大量的第三方jar包,使用maven是如何将第三方依赖的jar包进行打包,以此来使得使用方不需要再次去maven仓库中进行下载,即可直接运行

maven对此提供了两个插件,一个assembly,一个shade

assembly插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.zhanghe.study.mapreduce.wordcount.WordCountDriver</mainClass> <!-- 你的主类名 -->
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>

shade插件

1
2
3
4
5
6
7
8
9
10
11
12
13
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>

linux中的file对象

文件对象表示进程已打开的文件,该对象file(不是物理文件)由相应的open()系统调用创建,由close()系统调用销毁,因为多个进程可以同时打开和操作一个文件,所以同一个文件也可能存在多个对应的文件对象。文件对象仅仅在进程观点上代表已打开文件,它反过来指向目录项对象(反过来指向索引节点),其实只有目录项对象才表示已打开的实际文件,虽然一个文件对应的文件对象不是是唯一的,但对应的索引节点和目录项对象无疑是唯一的,另外类似于目录项对象,文件对象实际上没有对应的磁盘数据

JVM简介

java语言虽然不是最好的语言,但是JVM是最好的虚拟机,可以作为很多语言的平台,如java、scala、kotlin等,JVM是一个二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条java指令,JVM规范中都有详细定义,如何取操作数,如何处理操作数等

  • 一次编译,到处运行
  • 自动内存管理
  • 自动垃圾回收功能

java代码的执行流程

java代码执行流程
阅读全文 »

spring bean的作用域

spring容器中bean有五种作用域

  • singleton单例:这种 bean 范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个 bean 的实例,单例的模式由 bean factory 自身来维护
  • prototype原型:原型范围与单例范围相反,为每一个 bean 请求提供一个实例
  • request请求:在请求 bean 范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean 会失效并被垃圾回收器回收,仅在web的Spring WebApplicationContext环境中有效
  • session会话:与请求范围类似,确保每个 session 中有一个 bean 的实例,在 session 过期后,bean 会随之失效,仅在web的Spring WebApplicationContext环境中有效
  • application:该bean的生命周期与ServletContext的生命周期一致,仅在web的Spring WebApplicationContext环境中有效

linux中的dentry对象

dentry是Linux文件系统中某个索引节点(inode)的链接,每个dentry代表路径中的一个特定部分。这个索引节点可以是文件,也可以是目录。inode(可理解为ext2 inode)对应于物理磁盘上的具体对象,dentry是一个内存实体,没有对应的磁盘数据结构,VFS根据字符串形式的路径名现场创建,在dentry中,d_inode成员指向对应的inode。也就是说,一个inode可以在运行的时候链接多个dentry,而d_count记录了这个链接的数量。另外dentry对象有三种状态:被使用,未被使用和负状态

目录项是描述文件的逻辑属性,只存在于内存中,并没有实际对应的磁盘上的描述,更确切的说是存在于内存的目录项缓存,为了提高查找性能而设计,所以它是动态生成的,这不同于inode,inode的数据并不会随进程的消亡而消失。注意不管是文件夹还是最终的文件,都是属于目录项,所有的目录项在一起构成一颗庞大的目录树。VFS在查找的时候,根据一层一层的目录项找到对应的每个目录项的inode,沿着目录项进行操作就可以找到最终的文件

一个有效的dentry结构必定有一个inode结构,这是因为一个目录项要么代表着一个文件,要么代表着一个目录,而目录实际上也是文件。所以,只要dentry结构是有效的,则其指针d_inode必定指向一个inode结构。可是,反过来则不然,一个inode却可能对应着不止一个dentry结构;也就是说,一个文件可以有不止一个文件名或路径名。这是因为一个已经建立的文件可以被连接(link)到其他文件名。所以在inode结构中有一个队列i_dentry,凡是代表着同一个文件的所有目录项都通过其dentry结构中的d_alias域挂入相应inode结构中的i_dentry队列

linux中的inode对象

inode 是 UNIX/Linux 操作系统中的一种数据结构,其本质是结构体,它包含了与文件系统中各个文件相关的一些重要信息,例如文件及目录的基本信息,包含时间、档名、使用者及群组等。在 UNIX/Linux中创建文件系统时,同时将会创建大量的 inode 。通常,文件系统磁盘空间中大约百分之一空间分配给了 inode 表。在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个唯一的inode号,我们可以将inode简单理解成一个指针,它永远指向本文件的具体存储位置。文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文件的快速访问。系统是通过索引节点(而不是文件名)来定位每一个文件

Block 是记录文件内容数据的区域,至于 inode 则是记录 该文件的相关属性,以及文件内容放置在哪一个 Block 之内 的信息

设置ulimit

centos服务器设置ulimit,ulimit是指服务器允许的最大打开文件数目

配置文件在/etc/security/limits.conf