java 运行管理-基础
- OS层管理
- JVM层管理
- java 安全策略
JVM将.class文件加载到JVM Memory中,然后JVM里的执行机获取内存里的内容 — 获取字节码指令,并将其翻译为本地方法。然后执行。
java运行逻辑架构可以抽象为:
多个class文件在JVM上运行 -> 多个JVM在操作系统上运行。
因此java程序可以分为OS管理和JVM管理。
OS层管理
- 进程级别的管理(黑盒),不知具体程序内部情况。
- 管理CPU/内存/IO等具体的性能监控。
Linux平台上:
- top命令,查看系统中最占资源的那部分。
- vmstat命令,查看系统整体的CPU、内存、IO、Swap等信息。
- iostat命令,查看系统详细的IO信息。
各个命令后面跟相应的参数,可以满足不同要求的查询。
Windows平台上的任务管理器和在cmd中输入perfmon启动性能监视器,跟踪进程。
JVM层管理
1. JDK管理工具
程序运行管理工具,中各个工具命令的具体使用使用时在查看即可。
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文件。
- 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。
简单例子
- 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;
}
}
- (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提供安全管理器来对程序进行安全判定。默认情况下,普通程序不加载安全策略文件。
- 启动安全管理器的两种方法
- 在程序代码中添加:
System.setSecurityManager(new SecurityManager());
- 在程序运行时,添加启动参数:
java - Djava.security.nanager - Djava.security.policy=Mypolicy HelloWorld
- 安全策略文件:
- 建立代码来源和访问权限的关系。
- 代码来源:代码位置,证书集。
- 权限:由安全管理器负责加载安全属性。
在策略文件中配置对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");
//安全策略文件中定义了不可以删除,所以删除失败。
}