虚拟机性能监控与故障处理工具

jps:虚拟机进程状况工具

它的功能就是列出正在进行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些本地虚拟机唯一ID,实在难以理解的小伙伴可以看下图,那就是在可视化界面JConsole中双击之后显示的东西,第一个映入眼帘的就是进程数,这个首先就是jps的功能,如下图:
在这里插入图片描述

jstat:虚拟机统计信息监视工具

是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形界面,它就是运行期定位虚拟机性能问题的首要工具

jinfo:java配置信息工具

作用是实时查看和调整虚拟机各项参数。

jmap:java内存映像工具

除了获取dump文件之外,它还可以查询finalize执行队列、java堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。

jhat:虚拟机堆转储快照分析工具

JConsole:java监视与管理控制台

进去之后出现的是下图所示:
在这里插入图片描述
概览是对后面四个内存、线程、类、CPU的使用情况进行的罗列。

死锁原理以及可视化虚拟机的工作

这个时候我们首先需要明白,什么是死锁?死锁发生的情况又是什么?如何避免死锁?
死锁:根据我个人的理解,就是当两个或多个进程请求对方资源的时候,由于没有恰好都进行释放,因此就出现了一个情况:都需要等待对方释放出来,但是都没有释放的时候,就需要等待,从而进入了一个死循环,就叫做死锁。
死锁产生的必要条件:

互斥条件:及当前进程在占用其资源的时候不受到其他进程的影响
请求和保持条件:为何而产生死锁?还不是因为请求资源吗,但是当你请求完资源之后仍热对其保持不放的话,那么就有可能产生
不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放
环路等待条件:那就是必须存在着进程–资源的循环

预防死锁

资源一次性都分配,这样就不会再有请求了(破坏资源请求事件)
当有一个资源得不到分配,那么也不给这个进程分配其他资源(破坏保持条件)
当进程获得了部分资源,但是得不到其他资源,则释放已占有的资源(破坏不可剥夺条件)
给每一个资源分配有序,及按照进程号递增的顺序请求资源,最小的进程号优先请求资源,最大的进程号优先释放资源

避免死锁

银行家算法:首先需要定义状态和安全状态的概念。系统的状态是当前给进程分配的资源情况。因此,状态包含两个向量Resource(系统中每种资源的总量)和Available(未分配给进程的每种资源的总量)及两个矩阵Claim(表示进程对资源的需求)和Allocation(表示当前分配给进程的资源)。安全状态是指至少有一个资源分配序列不会导致死锁。当进程请求一组资源时,假设同意该请求,从而改变了系统的状态,然后确定其结果是否还处于安全状态。如果是,同意这个请求;如果不是,阻塞该进程知道同意该请求后系统状态仍然是安全的。
接下来,我们就来列出一个写完死锁的代码

package JVM;

public class java6 implements Runnable{
    //首先我现在是要建立死锁关系,那么就是假设
      private Object ob1;
      private Object ob2;

      public java6(Object ob1,Object ob2)
      {
          this.ob1=ob1;
          this.ob2=ob2;
      }
    @Override
    public void run() {

              synchronized (ob1){//先把这个上锁,然后再对另外一个上锁
                  try {
                      Thread.sleep(100);//先让其昏睡一会儿
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }

                  synchronized (ob2)
      {
          System.out.println("核力量");
      }
  }
    }

    public static void main(String[] args) {
          Object ob1=new Object();
          Object ob2=new Object();
       Thread n=new Thread(new java6(ob1,ob2));//线程当中定义相应的实例
       n.start();
       Thread m=new Thread(new java6(ob2,ob1));//线程当中定义相应的实例
       m.start();
    }
}

这里面我们首先需要理解的就是synchronized这个函数,它表示的就是上锁。首先就是创建两个对象,然后利用implements来对这个Runnable来进行进程的一个run方法的书写,在这个方法当中,我们需要设置的就是加锁,因为前面说过了,产生一个锁的条件就是二者互斥又进行着请求。
下面来看看对于在JConsole当中进行的一个显示
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值