java 运行管理-基础

  • OS层管理
  • JVM层管理
  • java 安全策略


JVM将.class文件加载到JVM Memory中,然后JVM里的执行机获取内存里的内容 — 获取字节码指令,并将其翻译为本地方法。然后执行。

java运行逻辑架构可以抽象为:
多个class文件在JVM上运行 -> 多个JVM在操作系统上运行。
因此java程序可以分为OS管理和JVM管理。

OS层管理

  • 进程级别的管理(黑盒),不知具体程序内部情况。
  • 管理CPU/内存/IO等具体的性能监控。

Linux平台上:

  1. top命令,查看系统中最占资源的那部分。
  2. vmstat命令,查看系统整体的CPU、内存、IO、Swap等信息。
  3. iostat命令,查看系统详细的IO信息。
    各个命令后面跟相应的参数,可以满足不同要求的查询。

Windows平台上的任务管理器和在cmd中输入perfmon启动性能监视器,跟踪进程。

JVM层管理

1. JDK管理工具

java最新运行时_java最新运行时


程序运行管理工具,中各个工具命令的具体使用使用时在查看即可。

2. 可视化管理工具

  • JConsole
  • Visual VM
  • Mission Control
    这些工具都在java/…/Contents/Home/bin/目录下。其中 Mission Control通过该目录下的jmc启动。
    可对java本地进程和远程进程进行监管。

3. 堆文件分析

  • jmap为JDK自带的命令,可以统计堆内的对象实例数据。
jmap -histo 12054 > /Users/kyan/Desktop/jmap.txt
将进程号为12054的java进程,以直方图的形式输出保存到桌面上。

还可以先使用jmap生成dump文件:文件后缀为.hprof。用Visual VM进行装入分析堆文件。

jmap -dump:format=b,file=/Users/kyan/Desktop/jmap.hprof 12054
可以生成堆内存dump文件。
  1. JMX:Java Management eXtensions
  • JMX是一个应用程序植入管理的框架。
  • 用户可以在任何java应用程序中使用这些代理和服务实现管理。
  • JMX架构:

1). Instrumentation Level(Mbean):
MBean:代表一个被管理的对象,对外暴露一个接口,即一些可以读写的属性,可操作的方法。
1-1. standerd MBean:最普通的MBean,定义一个接口和其实现类。
1-2. dynamic MBean
1-3. open MBean
1-4. model MBean
2). Agent Level(MBeanServer):
Agent:
一个MBean容器,代表一群被管理的对象,外界通过Agent可以访问到MBean。
Agent核心为MBeanServer,MBean在MBeanServer上注册。
3). Remote Management Level。


简单例子

  1. standerd MBean:
    接口:
public interface helloMBean{
    public void say();
    public String getName();
    public String getCacheSize();
    public void setCacheSize(int a);
    public int add(int a, int b);
}

实现类:

public hello implements helloMBean{
    private static final int DEFUALT = 200;
    private int CacheSize = DEFAULT;
    private Sting name = "register";

    public void say(){
        System.out.println("hello world");
    }
    public String getName(){
        return name;
    }
    public String getCacheSize(){
        return CacheSize;
    }
    public void setCacheSize(int a){
        this.CacheSize = a;
        System.out.println("CacheSize is " + CacheSize);
    }
    public int add(int a, int b){
        return a+b;
    }
}
  1. (Agent)MBeanServer:
public class test{
    public static void mian(String[] args){
        //获取平台默认的MBeanServer。
         MBeanServer mbs = ManagementFactory.getPlatFormMBeanServer();
        //定义对象名字。
        ObjectName name = new ObjectName("type=hello");
        //创建对象。
        hello mbean = new hello();
        //将对象注册到MBeanServer中。
        mbs.registerMBean(mbean, name);
    }
}

运行该程序后,使用JConsole进调用。

java 安全策略

由于java字节码文件来源广泛,使用时存在安全隐患,因此java提供安全管理器来对程序进行安全判定。默认情况下,普通程序不加载安全策略文件。

  • 启动安全管理器的两种方法
  1. 在程序代码中添加:
System.setSecurityManager(new SecurityManager());
  1. 在程序运行时,添加启动参数:
java - Djava.security.nanager - Djava.security.policy=Mypolicy HelloWorld
  • 安全策略文件:
  1. 建立代码来源和访问权限的关系。
  2. 代码来源:代码位置,证书集。
  3. 权限:由安全管理器负责加载安全属性。
    在策略文件中配置对tmp目录下文件的读写策略。
permission java.io.FilePermission "/tmp/*", "read,write"

在文件中定义:
FilePermission p = new FilePermission("/tmp/*", “read, write”);

System.setProperty("java.security.policy","paths/mypolicy.policy");
		System.setSecurityManager(new SecurityManager());
		
		File f = new File("paths/tmp/1.txt");
		if(f.exists()){
			f.delete();
			//FilePermission p = new FilePermission("/tmp/*", "read, write");
			//安全策略文件中定义了不可以删除,所以删除失败。
		}