本文目錄一覽:
- 1、Java 如何監控文件目錄的變化
- 2、Java監控一個進程的執行狀態
- 3、java如何監控線程是否在運行
- 4、java遠程監控連不上
- 5、Java類應用監控應該監控哪些
- 6、JAVA怎麼監控一個對象變量是否修改
Java 如何監控文件目錄的變化
JavaSE 1.7提供了相關的API,去監視文件或者文件夾的變動,主要的API都在java.nio.file下面,其大概流程如下:
package org.xdemo.superutil.j2se.filewatch;
import static java.nio.file.LinkOption.NOFOLLOW_LINKS;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchEvent.Kind;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.HashMap;
import java.util.Map;
/**
* 文件夾監控
*
* @author Goofy a href=””;/a
* @Date 2015年7月3日 上午9:21:33
*/
public class WatchDir {
private final WatchService watcher;
private final MapWatchKey, Path keys;
private final boolean subDir;
/**
* 構造方法
*
* @param file
* 文件目錄,不可以是文件
* @param subDir
* @throws Exception
*/
public WatchDir(File file, boolean subDir, FileActionCallback callback) throws Exception {
if (!file.isDirectory())
throw new Exception(file.getAbsolutePath() + “is not a directory!”);
this.watcher = FileSystems.getDefault().newWatchService();
this.keys = new HashMapWatchKey, Path();
this.subDir = subDir;
Path dir = Paths.get(file.getAbsolutePath());
if (subDir) {
registerAll(dir);
} else {
register(dir);
}
processEvents(callback);
}
@SuppressWarnings(“unchecked”)
static T WatchEventT cast(WatchEvent? event) {
return (WatchEventT) event;
}
/**
* 觀察指定的目錄
*
* @param dir
* @throws IOException
*/
private void register(Path dir) throws IOException {
WatchKey key = dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
keys.put(key, dir);
}
/**
* 觀察指定的目錄,並且包括子目錄
*/
private void registerAll(final Path start) throws IOException {
Files.walkFileTree(start, new SimpleFileVisitorPath() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
register(dir);
return FileVisitResult.CONTINUE;
}
});
}
/**
* 發生文件變化的回調函數
*/
@SuppressWarnings(“rawtypes”)
void processEvents(FileActionCallback callback) {
for (;;) {
WatchKey key;
try {
key = watcher.take();
} catch (InterruptedException x) {
return;
}
Path dir = keys.get(key);
if (dir == null) {
System.err.println(“操作未識別”);
continue;
}
for (WatchEvent? event : key.pollEvents()) {
Kind kind = event.kind();
// 事件可能丟失或遺棄
if (kind == StandardWatchEventKinds.OVERFLOW) {
continue;
}
// 目錄內的變化可能是文件或者目錄
WatchEventPath ev = cast(event);
Path name = ev.context();
Path child = dir.resolve(name);
File file = child.toFile();
if (kind.name().equals(FileAction.DELETE.getValue())) {
callback.delete(file);
} else if (kind.name().equals(FileAction.CREATE.getValue())) {
callback.create(file);
} else if (kind.name().equals(FileAction.MODIFY.getValue())) {
callback.modify(file);
} else {
continue;
}
// if directory is created, and watching recursively, then
// register it and its sub-directories
if (subDir (kind == StandardWatchEventKinds.ENTRY_CREATE)) {
try {
if (Files.isDirectory(child, NOFOLLOW_LINKS)) {
registerAll(child);
}
} catch (IOException x) {
// ignore to keep sample readbale
}
}
}
boolean valid = key.reset();
if (!valid) {
// 移除不可訪問的目錄
// 因為有可能目錄被移除,就會無法訪問
keys.remove(key);
// 如果待監控的目錄都不存在了,就中斷執行
if (keys.isEmpty()) {
break;
}
}
}
}
}
Java監控一個進程的執行狀態
應用程序很高興對所有這些活動一無所知。它只知道自己的虛擬地址空間。但是,如果當前在主存中的頁面集(稱為 駐留集)少於實際要使用的頁面集(稱為 工作集),應用程序的性能很快就會顯著降低。(不幸的是,本文中您將看到,我們要討論的工具常常交換使用這兩個術語,儘管它們指的是完全不同的事物。)Task Manager 和 PerfMon我們首先考察兩種最常見的工具:Task Manager 和 PerfMon。這兩個工具都隨 Windows 一起提供,因此由此起步比較容易。Task ManagerTask Manager 是一種非常見的 Windows 進程監控程序。您可以通過熟悉的 Ctrl-Alt-Delete 組合鍵來啟動它,或者右擊任務欄。Processes 選項卡顯示了最詳細的信息,如圖 2 所示。圖 2. Task Manager 進程選項卡圖 2 中顯示的列已經通過選擇 View — Select Columns 作了調整。有些列標題非常含糊,但可以在 Task Manager 幫助中找到各列的定義。和進程內存使用情況關係最密切的計數器包括:Mem Usage(內存使用):在線幫助將其稱為進程的工作集(儘管很多人稱之為駐留集)——當前在主存中的頁面集。但是這個數值包含能夠和其他進程共享的頁面,因此要注意避免重複計算。比方說,如果要計算共享同一個 DLL 的兩個進程的總內存佔用情況,不能簡單地把“內存使用”值相加。Peak Mem Usage(內存使用高峰值):進程啟動以來 Mem Usage(內存使用)字段的最大值。Page Faults(頁面錯誤):進程啟動以來要訪問的頁面不在主存中的總次數。VM Size(虛擬內存大小):聯機幫助將其稱為“分配給進程私有虛擬內存總數。”更確切地說,這是進程所 提交的內存。如果進程保留內存而沒有提交,那麼該值就與總地址空間的大小有很大的差別。雖然 Windows 文檔將 Mem Usage(內存使用)稱為工作集,但在該上下文中,它實際上指的是很多人所說的駐留集(resident set),明白這一點很重要。您可以在 Memory Management Reference 術語表(請參閱 參考資料)中找到這些術語的定義。 工作集 更通常的含義指的是一個邏輯概念,即在某一點上為了避免分頁操作,進程需要駐留在內存中的那些頁面。PerfMon隨 Windows 一起提供的另一種 Microsoft 工具是 PerfMon,它監控各種各樣的計數器,從打印隊列到電話。PerfMon 通常在系統路徑中,因此可以在命令行中輸入 perfmon 來啟動它。這個工具的優點是以圖形化的方式顯示計數器,很容易看到計數器隨時間的變化情況。請在 PerfMon 窗口上方的工具欄中單擊 + 按鈕,這樣會打開一個對話框讓您選擇要監控的計數器,如圖 3a 所示。計數器按照 性能對象分成不同的類別。與內存使用關係最密切的兩個類是 Memory 和 Process。選中計數器然後單擊 Explain 按鈕,就可以看到計數器的定義。說明出現在主對話框下方彈出的單獨的窗口中。
java如何監控線程是否在運行
判斷是否在運行用isAlive方法哈。。
給你寫了個例子。。不知是不是你想要的。。
public class Thread100 {
/**
* @param args
*/
public static ThreadA ta = new ThreadA();
public static ThreadB tb = new ThreadB();
public static void main(String[] args) {
ta.start();
tb.start();
}
}
class ThreadA extends Thread {
@Override
public void run() {
int i = 0;
while(i 100) {
if(Thread100.tb.isAlive()) {
System.out.println(“B is alive”);
}
System.out.println(i);
i++;
}
}
}
class ThreadB extends Thread {
@Override
public void run() {
int i = 0;
while(i 100) {
if(Thread100.ta.isAlive()) {
System.out.println(“A is alive”);
}
System.out.println(i);
i++;
}
}
}
java遠程監控連不上
客戶端無法建立跟遠程計算機的連接。
導致這個錯誤的可能的原因是:
1) 遠程計算機上的遠程連接可能沒有啟用。
2) 已超出遠程計算機上的連接最大數。
3) 建立連接時出現了一個網絡錯誤。
具體的解決辦法:
有時候是這個錯誤提示:由於網絡錯誤,連接被中斷,請重新連接到遠程計算機
遠程連接我肯定是開啟了的,防火牆裡面3389端口也是打開的,並且連接其他的服務器就可以連接上,說明我本機沒問題,用掃描軟件,掃描了一下這個服務器,顯示IP和端口都是存在的,說明這個服務器網絡也沒問題,實在沒辦法,只有不斷的測試,後來在系統日誌裡面看到很多條系統錯誤信息。其中:嚴重錯誤“RDP 協議組件 “DATA ENCRYPTION” 在協議流中發現一個錯誤並且中斷了客戶端連接。”引起了我的主要。
Java類應用監控應該監控哪些
當有問題出現時,許多開發人員可能會比較盲目的用這些工具來試探性定位問題,而大多數情況下,這種試探會無功而返。因為這些分析工具主要是側重Java單方面的分析,比如該系統調用第三方API,如果第三方API有問題,是無法監控到的。還有像文件、DB資源的訪問也是是無法監控到的。
除了JAVA自帶的監控工具外,我們嘗試了第三方的監控工具透視寶,功能相對全面,且易操作。
在功能方面,透視寶都包括:查看執行最慢的10個元素,包括元素執行次數、持續時長和佔用時長百分比;查看HTTP請求參數,包括請求的響應狀態、鏈接頁面、具體的請求參數及返回結果;查看代碼執行堆棧的詳細樹狀信息,包括每個方法的計算時間、總耗時和被調用的次數,您能直接看到特殊標識的最慢方法;查看涉及SQL語句的總耗時排序,包括SQL執行總耗時、執行次數和具體的查詢語句;第三方API調用。
JAVA怎麼監控一個對象變量是否修改
可以通過覆寫Object類中的equals(Object obj)方法和hashCode()方法,這兩個方法是專門用來比較兩個對象是否相等的,假如你原來的類裡面有兩個屬性 name和age,那麼這段代碼就如下所示:
class Student{ String name; int age; public Student(String name,int age){ this.name = name; this.age = age; } public boolean equals(Object obj){ if(this == obj){ return true; } if(!(obj instanceof Student)){ return false; } Student student = (Student)obj; if(this.name.equals(student.name) this.age==student.age){ return true; } else{ return false; } } public int hashCode(){ return this.name.hashCode()*this.age; }}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/303895.html