-
Notifications
You must be signed in to change notification settings - Fork 190
/
PerformanceMonitor.java
96 lines (86 loc) · 2.86 KB
/
PerformanceMonitor.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package com.secnium.iast.agent.monitor;
import com.secnium.iast.agent.manager.EngineManager;
/**
* 负责监控jvm性能状态,如果达到停止阈值,则停止检测引擎;如果达到卸载阈值,则卸载引擎;
*
* @author dongzhiyong@huoxian.cn
*/
public class PerformanceMonitor implements IMonitor {
private final EngineManager engineManager;
public PerformanceMonitor(EngineManager engineManager) {
this.engineManager = engineManager;
}
public double memUsedRate() {
double free = (double) Runtime.getRuntime().freeMemory();
double max = (double) Runtime.getRuntime().maxMemory();
return free / max;
}
/**
* 是否到达停止引擎的阈值
* // 内存:<80 -> >80%
* // 前置状态:2
* // 切换状态:3
*
* @return true, 需要停止;false - 不需要停止
*/
public boolean isStop(double unUsedRate, int preStatus) {
return unUsedRate < 0.2 && (preStatus == 2);
}
/**
* 是否到达启动引擎的阈值
* // 内存:>80% -> <80%
* // 前置状态:3/1
* // 切换状态:2
*
* @return true, 需要启动;false - 不需要启动
*/
public boolean isStart(double unUsedRate, int preStatus) {
return unUsedRate > 0.2 && (preStatus == 1 || preStatus == 3);
}
/**
* 是否达到卸载引擎的阈值
* // 内存:>80% -> >90%
* // 前置状态:3
* // 切换状态:4
*
* @return true, 需要卸载;false - 不需要卸载;
*/
public boolean isUninstall(double unUsedRate, int preStatus) {
return unUsedRate < 0.1 && (preStatus == 3);
}
/**
* 是否达到安装引擎的阈值
* // 内存:>90% -> >80%
* // 前置状态:4
* // 切换状态:1
*
* @return true, 需要安装;false - 不需要安装
*/
public boolean isInstall(double unUsedRate, int preStatus) {
return unUsedRate > 0.1 && (preStatus == 4);
}
/**
* 状态发生转换时,触发engineManager的操作
* <p>
* 状态维护:
* 0 -> 1 -> 2 -> 3 -> 4
*/
@Override
public void check() {
double unUserdRate = memUsedRate();
int preStatus = this.engineManager.getRunningStatus();
if (isStart(unUserdRate, preStatus)) {
this.engineManager.start();
this.engineManager.setRunningStatus(2);
} else if (isStop(unUserdRate, preStatus)) {
this.engineManager.stop();
this.engineManager.setRunningStatus(3);
} else if (isUninstall(unUserdRate, preStatus)) {
this.engineManager.uninstall();
this.engineManager.setRunningStatus(4);
} else if (isInstall(unUserdRate, preStatus)) {
this.engineManager.install();
this.engineManager.setRunningStatus(1);
}
}
}