java代码内存监控,Java内存监控

请问用Java代码,怎样测试一段程序占用了多少内存?

你可以先用内存监控工具,进行监控,看看这个功能到底用多少内存。如果不多,其实都不需要实现你说的代码监控的。如果你要使用代码监控,你可是使用Runtime类的几个属性,MaxMemory、FreeMemory、TotalMemory。然后实现个线程,在下载pdf功能前开启线程,然后完毕时关闭线程,如果内存即将溢出(设定个阈值,比如说15%),就报错,跳转到错误页面。

成都创新互联2013年开创至今,是专业互联网技术服务公司,拥有项目成都网站建设、做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元佳县做网站,已为上家服务,为佳县各地企业和个人服务,联系电话:18982081108

如何对java进行内存监控

自动生成 Java 应用逻辑架构

OneAPM 可以智能探知 Java 应用之间的相互调用关系,通过串联复杂的后台组件,动态生成 J2EE 应用整体架构视图。在图中通过简单的点击钻取您可以逐级深入,查看对代码级别的诊断数据。

监控 JVM 性能和健康状况

实时监控 JVM 运行状态,通过图表展示 JVM 内存分配情况、内存使用情况、垃圾收集信息、类加载数量、JVM 线程信息以及会话信息。

快速发现 Java 异常和瓶颈

通过拓扑图直观了解分布式或 SOA 架构应用的运行状态,准确定位系统问题。同时监控后台事务和 Web 事务。

支持自定义报警策略,一旦触发报警通知必达,助您快速发现并修复时间。

java 如何实现即时监控内存

在 \jdk1.6.0_10\demo\management\MemoryMonitor 下得示例程序,可以去学习哈

import java.awt.*;

import java.awt.event.*;

import java.awt.image.BufferedImage;

import java.awt.geom.Line2D;

import java.awt.geom.Rectangle2D;

import java.util.Date;

import javax.swing.*;

import javax.swing.border.EtchedBorder;

import javax.swing.border.TitledBorder;

import java.lang.management.*;

import java.util.*;

public class MemoryMonitor extends JPanel {

static JCheckBox dateStampCB = new JCheckBox("Output Date Stamp");

public Surface surf;

JPanel controls;

boolean doControls;

JTextField tf;

// Get memory pools.

static java.util.ListMemoryPoolMXBean mpools =

ManagementFactory.getMemoryPoolMXBeans();

// Total number of memory pools.

static int numPools = mpools.size();

public MemoryMonitor() {

setLayout(new BorderLayout());

setBorder(new TitledBorder(new EtchedBorder(), "Memory Monitor"));

add(surf = new Surface());

controls = new JPanel();

controls.setPreferredSize(new Dimension(135,80));

Font font = new Font("serif", Font.PLAIN, 10);

JLabel label = new JLabel("Sample Rate");

label.setFont(font);

label.setForeground(Color.red);

controls.add(label);

tf = new JTextField("1000");

tf.setPreferredSize(new Dimension(45,20));

controls.add(tf);

controls.add(label = new JLabel("ms"));

label.setFont(font);

label.setForeground(Color.red);

controls.add(dateStampCB);

dateStampCB.setFont(font);

addMouseListener(new MouseAdapter() {

public void mouseClicked(MouseEvent e) {

removeAll();

if ((doControls = !doControls)) {

surf.stop();

add(controls);

} else {

try {

surf.sleepAmount = Long.parseLong(tf.getText().trim());

} catch (Exception ex) {}

surf.start();

add(surf);

}

validate();

repaint();

}

});

}

public class Surface extends JPanel implements Runnable {

public Thread thread;

public long sleepAmount = 1000;

public int usageHistCount = 20000;

private int w, h;

private BufferedImage bimg;

private Graphics2D big;

private Font font = new Font("Times New Roman", Font.PLAIN, 11);

private int columnInc;

private float usedMem[][];

private int ptNum[];

private int ascent, descent;

private Rectangle graphOutlineRect = new Rectangle();

private Rectangle2D mfRect = new Rectangle2D.Float();

private Rectangle2D muRect = new Rectangle2D.Float();

private Line2D graphLine = new Line2D.Float();

private Color graphColor = new Color(46, 139, 87);

private Color mfColor = new Color(0, 100, 0);

private String usedStr;

public Surface() {

setBackground(Color.black);

addMouseListener(new MouseAdapter() {

public void mouseClicked(MouseEvent e) {

if (thread == null) start(); else stop();

}

后面还有很多代码没贴出来 自己到JDK 的demo目录下查看吧

如何监视计算机的CPU,内存和磁盘使用情况在Java中

使用sigar来监控,简单方便!

使用说明:以下代码需要配合sigar的dll文件来用,需要将dll文件放到JDK下的bin文件夹下,供sigar程序调用,还需要sigar jar包。以下程序经过测试,完全可用!

有关jar包跟dll文件  我上传不了,私信我,我发你

import java.net.InetAddress;

import java.net.UnknownHostException;

import java.util.Map;

import java.util.Properties;

import java.util.Timer;

import java.util.TimerTask;

import org.hyperic.sigar.CpuInfo;

import org.hyperic.sigar.CpuPerc;

import org.hyperic.sigar.FileSystem;

import org.hyperic.sigar.FileSystemUsage;

import org.hyperic.sigar.Mem;

import org.hyperic.sigar.NetFlags;

import org.hyperic.sigar.NetInterfaceConfig;

import org.hyperic.sigar.NetInterfaceStat;

import org.hyperic.sigar.OperatingSystem;

import org.hyperic.sigar.Sigar;

import org.hyperic.sigar.SigarException;

import org.hyperic.sigar.Swap;

import org.hyperic.sigar.Who;

public class RuntimeTest {

public static void main(String[] args) {

try { 

Timer timer = new Timer();//定时器

TimerTask task = new TimerTask(){

public void run() {

try {

memory();

} catch (SigarException e) {

e.printStackTrace();

}

}

};

try{

timer.schedule(task, 0, 3000);//每3秒取一次

}catch(Exception ex){

ex.printStackTrace();

}

// System信息,从jvm获取

// property();//根据自己的需求,都可以放到定时器中定时获取

// cpu信息

//cpu();

// 内存信息

// memory();

// 操作系统信息

//  os();

// 用户信息

//  who();

} catch (Exception e1) {

e1.printStackTrace();

}

}

private static void property() throws UnknownHostException {

Runtime r = Runtime.getRuntime();

Properties props = System.getProperties();

InetAddress addr;

addr = InetAddress.getLocalHost();

String ip = addr.getHostAddress();

MapString, String map = System.getenv();

String userName = map.get("USERNAME");// 获取用户名

String computerName = map.get("COMPUTERNAME");// 获取计算机名

String userDomain = map.get("USERDOMAIN");// 获取计算机域名

System.out.println("用户名:    " + userName);

System.out.println("计算机名:   " + computerName);

System.out.println("计算机域名:  " + userDomain);

System.out.println("本地ip地址: " + ip);

System.out.println("本地主机名:  " + addr.getHostName());

System.out.println("JVM可以使用的总内存:    " + r.totalMemory());

System.out.println("JVM可以使用的剩余内存:   " + r.freeMemory());

System.out.println("JVM可以使用的处理器个数:  " + r.availableProcessors());

System.out.println("Java的运行环境版本:    " + props.getProperty("java.version"));

System.out.println("Java的运行环境供应商:   " + props.getProperty("java.vendor"));

System.out.println("Java供应商的URL:    " + props.getProperty("java.vendor.url"));

System.out.println("Java的安装路径:  " + props.getProperty("java.home"));

System.out.println("Java的虚拟机规范版本:   " + props.getProperty("java.vm.specification.version"));

System.out.println("Java的虚拟机规范供应商:  " + props.getProperty("java.vm.specification.vendor"));

System.out.println("Java的虚拟机规范名称:   " + props.getProperty("java.vm.specification.name"));

System.out.println("Java的虚拟机实现版本:   " + props.getProperty("java.vm.version"));

System.out.println("Java的虚拟机实现供应商:  " + props.getProperty("java.vm.vendor"));

System.out.println("Java的虚拟机实现名称:   " + props.getProperty("java.vm.name"));

System.out.println("Java运行时环境规范版本:  " + props.getProperty("java.specification.version"));

System.out.println("Java运行时环境规范供应商: " + props.getProperty("java.specification.vender"));

System.out.println("Java运行时环境规范名称:  " + props.getProperty("java.specification.name"));

System.out.println("Java的类格式版本号:    " + props.getProperty("java.class.version"));

System.out.println("Java的类路径:   " + props.getProperty("java.class.path"));

System.out.println("加载库时搜索的路径列表:    " + props.getProperty("java.library.path"));

System.out.println("默认的临时文件路径:  " + props.getProperty("java.io.tmpdir"));

System.out.println("一个或多个扩展目录的路径:   " + props.getProperty("java.ext.dirs"));

System.out.println("操作系统的名称:    " + props.getProperty("os.name"));

System.out.println("操作系统的构架:    " + props.getProperty("os.arch"));

System.out.println("操作系统的版本:    " + props.getProperty("os.version"));

System.out.println("文件分隔符:  " + props.getProperty("file.separator"));

System.out.println("路径分隔符:  " + props.getProperty("path.separator"));

System.out.println("行分隔符:   " + props.getProperty("line.separator"));

System.out.println("用户的账户名称:    " + props.getProperty("user.name"));

System.out.println("用户的主目录: " + props.getProperty("user.home"));

System.out.println("用户的当前工作目录:  " + props.getProperty("user.dir"));

}

private static void memory() throws SigarException {

Sigar sigar = new Sigar();

Mem mem = sigar.getMem();

float total = mem.getTotal();

float used = mem.getUsed();

// 内存总量

System.out.println("内存总量:   " + mem.getTotal() / 1024L/1024L + "M av");

// 当前内存使用量

System.out.println("当前内存使用量:    " + mem.getUsed() / 1024L/1024L + "M used");

// 当前内存剩余量

System.out.println("当前内存剩余量:    " + mem.getFree() / 1024L/1024L + "M free");

// 当前内存使用率

System.out.println("内存使用率:    " +used/total*100+"%");

Swap swap = sigar.getSwap();

// 交换区总量

System.out.println("交换区总量:  " + swap.getTotal() / 1024L/1024L + "M av");

// 当前交换区使用量

System.out.println("当前交换区使用量:   " + swap.getUsed() / 1024L/1024L + "M used");

// 当前交换区剩余量

System.out.println("当前交换区剩余量:   " + swap.getFree() / 1024L/1024L + "M free");

}

private static void cpu() throws SigarException {

Sigar sigar = new Sigar();

CpuInfo infos[] = sigar.getCpuInfoList();

CpuPerc cpuList[] = null;

cpuList = sigar.getCpuPercList();

for (int i = 0; i  infos.length; i++) {// 不管是单块CPU还是多CPU都适用

CpuInfo info = infos[i];

System.out.println("第" + (i + 1) + "块CPU信息");

System.out.println("CPU的总量MHz:  " + info.getMhz());// CPU的总量MHz

System.out.println("CPU生产商: " + info.getVendor());// 获得CPU的卖主,如:Intel

System.out.println("CPU类别:  " + info.getModel());// 获得CPU的类别,如:Celeron

System.out.println("CPU缓存数量:    " + info.getCacheSize());// 缓冲存储器数量

printCpuPerc(cpuList[i]);

}

}

private static void printCpuPerc(CpuPerc cpu) {

System.out.println("CPU用户使用率:   " + CpuPerc.format(cpu.getUser()));// 用户使用率

System.out.println("CPU系统使用率:   " + CpuPerc.format(cpu.getSys()));// 系统使用率

System.out.println("CPU当前等待率:   " + CpuPerc.format(cpu.getWait()));// 当前等待率

System.out.println("CPU当前错误率:   " + CpuPerc.format(cpu.getNice()));//

System.out.println("CPU当前空闲率:   " + CpuPerc.format(cpu.getIdle()));// 当前空闲率

System.out.println("CPU总的使用率:   " + CpuPerc.format(cpu.getCombined()));// 总的使用率

}

private static void os() {

OperatingSystem OS = OperatingSystem.getInstance();

// 操作系统内核类型如: 386、486、586等x86

System.out.println("操作系统:   " + OS.getArch());

System.out.println("操作系统CpuEndian():    " + OS.getCpuEndian());//

System.out.println("操作系统DataModel():    " + OS.getDataModel());//

// 系统描述

System.out.println("操作系统的描述:    " + OS.getDescription());

// 操作系统类型

// System.out.println("OS.getName():    " + OS.getName());

// System.out.println("OS.getPatchLevel():  " + OS.getPatchLevel());//

// 操作系统的卖主

System.out.println("操作系统的卖主:    " + OS.getVendor());

// 卖主名称

System.out.println("操作系统的卖主名:   " + OS.getVendorCodeName());

// 操作系统名称

System.out.println("操作系统名称: " + OS.getVendorName());

// 操作系统卖主类型

System.out.println("操作系统卖主类型:   " + OS.getVendorVersion());

// 操作系统的版本号

System.out.println("操作系统的版本号:   " + OS.getVersion());

}

private static void who() throws SigarException {

Sigar sigar = new Sigar();

Who who[] = sigar.getWhoList();

if (who != null  who.length  0) {

for (int i = 0; i  who.length; i++) {

// System.out.println("当前系统进程表中的用户名" + String.valueOf(i));

Who _who = who[i];

System.out.println("用户控制台:  " + _who.getDevice());

System.out.println("用户host: " + _who.getHost());

// System.out.println("getTime():   " + _who.getTime());

// 当前系统进程表中的用户名

System.out.println("当前系统进程表中的用户名:   " + _who.getUser());

}

}

}

}

如何监控Java应用程序的Windows内存使用情况

应用程序很高兴对所有这些活动一无所知。它只知道自己的虚拟地址空间。但是,如果当前在主存中的页面集(称为 驻留集)少于实际要使用的页面集(称为 工作集),应用程序的性能很快就会显著降低。(不幸的是,本文中您将看到,我们要讨论的工具常常交换使用这两个术语,尽管它们指的是完全不同的事物。)

Task Manager 和 PerfMon

我们首先考察两种最常见的工具:Task Manager 和 PerfMon。这两个工具都随 Windows 一起提供,因此由此起步比较容易。

Task Manager

Task 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来监控内存?求具体实例代码。

其实首先你可以先使用监控内存工具,来监控下,如果内存消耗不是很大,其实就不用那么麻烦了。如果实在要加个内存监控程序,可以使用Runtime中的MaxMemory、TotalMemory、FreeMemory来实现。注意这些都是JVM的内存,请不要和系统的内存混淆。另外如果要实时监控,必须还得弄个线程类。大致思路是这样,至于内存溢出,你可以设定一个内存阈值,比如说15%的剩余内存设置,就报内存即将溢出的错误。


文章标题:java代码内存监控,Java内存监控
链接地址:http://cdiso.cn/article/hososg.html

其他资讯