「javaio内存」Java直接内存

博主:adminadmin 2023-01-06 19:36:08 601

今天给各位分享javaio内存的知识,其中也会对Java直接内存进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java io流是将数据全部加载在内存的流对象里才开始读的吗?

是的,但你说的不全。读取有俩种方式,一种是直接读取,一种是先放在缓冲流中,再一并读取。内存只是个中转站,在第一种方式中,数据是先加载在内存区,然后又被马上被读取出去。在第二种方式中,它会有个缓冲区,其实也就是个可以重用的内存区,它是先读取完放在缓冲区,然后一并读取出去!

Javaio缓冲区为什么不直接开辟大空间

Javaio缓冲区不直接开辟大空间原因:有效地管理系统资源,方便用户使用的程序集合。(操作系统是加在裸机上的第一层软件,是用户与计算机的接口)。

当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,如果缓冲区数据不足,才会再从文件中读取。这里的缓冲区应该是在硬盘中。

使用BufferedWriter时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。这里的缓存区应该在内存中。

原理:

Java把这些不同来源和目标的数据都统一抽象为数据流。Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象。

在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流。

怎么获取 Java 程序使用的内存

首先

创建一个Bean用来存贮要得到的信

public class MonitorInfoBean {

/** 可使用内存. */

private long totalMemory;

/** 剩余内存. */

private long freeMemory;

/** 最大可使用内存. */

private long maxMemory;

/** 操作系统. */

private String osName;

/** 总的物理内存. */

private long totalMemorySize;

/** 剩余的物理内存. */

private long freePhysicalMemorySize;

/** 已使用的物理内存. */

private long usedMemory;

/** 线程总数. */

private int totalThread;

/** cpu使用率. */

private double cpuRatio;

public long getFreeMemory() {

return freeMemory;

}

public void setFreeMemory(long freeMemory) {

this.freeMemory = freeMemory;

}

public long getFreePhysicalMemorySize() {

return freePhysicalMemorySize;

}

public void setFreePhysicalMemorySize(long freePhysicalMemorySize) {

this.freePhysicalMemorySize = freePhysicalMemorySize;

}

public long getMaxMemory() {

return maxMemory;

}

public void setMaxMemory(long maxMemory) {

this.maxMemory = maxMemory;

}

public String getOsName() {

return osName;

}

public void setOsName(String osName) {

this.osName = osName;

}

public long getTotalMemory() {

return totalMemory;

}

public void setTotalMemory(long totalMemory) {

this.totalMemory = totalMemory;

}

public long getTotalMemorySize() {

return totalMemorySize;

}

public void setTotalMemorySize(long totalMemorySize) {

this.totalMemorySize = totalMemorySize;

}

public int getTotalThread() {

return totalThread;

}

public void setTotalThread(int totalThread) {

this.totalThread = totalThread;

}

public long getUsedMemory() {

return usedMemory;

}

public void setUsedMemory(long usedMemory) {

this.usedMemory = usedMemory;

}

public double getCpuRatio() {

return cpuRatio;

}

public void setCpuRatio(double cpuRatio) {

this.cpuRatio = cpuRatio;

}

}

之后,建立bean的接口

public interface IMonitorService {

public MonitorInfoBean getMonitorInfoBean() throws Exception;

}

然后,就是最关键的,得到cpu的利用率,已用内存,可用内存,最大内存等信息。

import java.io.InputStreamReader;

import java.io.LineNumberReader;

import sun.management.ManagementFactory;

import com.sun.management.OperatingSystemMXBean;

import java.io.*;

import java.util.StringTokenizer;

/**

* 获取系统信息的业务逻辑实现类.

* @author GuoHuang

*/

public class MonitorServiceImpl implements IMonitorService {

private static final int CPUTIME = 30;

private static final int PERCENT = 100;

private static final int FAULTLENGTH = 10;

private static final File versionFile = new File("/proc/version");

private static String linuxVersion = null;

/**

* 获得当前的监控对象.

* @return 返回构造好的监控对象

* @throws Exception

* @author GuoHuang

*/

public MonitorInfoBean getMonitorInfoBean() throws Exception {

int kb = 1024;

// 可使用内存

long totalMemory = Runtime.getRuntime().totalMemory() / kb;

// 剩余内存

long freeMemory = Runtime.getRuntime().freeMemory() / kb;

// 最大可使用内存

long maxMemory = Runtime.getRuntime().maxMemory() / kb;

OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory

.getOperatingSystemMXBean();

// 操作系统

String osName = System.getProperty("os.name");

// 总的物理内存

long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb;

// 剩余的物理内存

long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / kb;

// 已使用的物理内存

long usedMemory = (osmxb.getTotalPhysicalMemorySize() - osmxb

.getFreePhysicalMemorySize())

/ kb;

// 获得线程总数

ThreadGroup parentThread;

for (parentThread = Thread.currentThread().getThreadGroup(); parentThread

.getParent() != null; parentThread = parentThread.getParent())

;

int totalThread = parentThread.activeCount();

double cpuRatio = 0;

if (osName.toLowerCase().startsWith("windows")) {

cpuRatio = this.getCpuRatioForWindows();

}

else {

cpuRatio = this.getCpuRateForLinux();

}

// 构造返回对象

MonitorInfoBean infoBean = new MonitorInfoBean();

infoBean.setFreeMemory(freeMemory);

infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize);

infoBean.setMaxMemory(maxMemory);

infoBean.setOsName(osName);

infoBean.setTotalMemory(totalMemory);

infoBean.setTotalMemorySize(totalMemorySize);

infoBean.setTotalThread(totalThread);

infoBean.setUsedMemory(usedMemory);

infoBean.setCpuRatio(cpuRatio);

return infoBean;

}

private static double getCpuRateForLinux(){

InputStream is = null;

InputStreamReader isr = null;

BufferedReader brStat = null;

StringTokenizer tokenStat = null;

try{

System.out.println("Get usage rate of CUP , linux version: "+linuxVersion);

Process process = Runtime.getRuntime().exec("top -b -n 1");

is = process.getInputStream();

isr = new InputStreamReader(is);

brStat = new BufferedReader(isr);

if(linuxVersion.equals("2.4")){

brStat.readLine();

brStat.readLine();

brStat.readLine();

brStat.readLine();

tokenStat = new StringTokenizer(brStat.readLine());

tokenStat.nextToken();

tokenStat.nextToken();

String user = tokenStat.nextToken();

tokenStat.nextToken();

String system = tokenStat.nextToken();

tokenStat.nextToken();

String nice = tokenStat.nextToken();

System.out.println(user+" , "+system+" , "+nice);

user = user.substring(0,user.indexOf("%"));

system = system.substring(0,system.indexOf("%"));

nice = nice.substring(0,nice.indexOf("%"));

float userUsage = new Float(user).floatValue();

float systemUsage = new Float(system).floatValue();

float niceUsage = new Float(nice).floatValue();

return (userUsage+systemUsage+niceUsage)/100;

}else{

brStat.readLine();

brStat.readLine();

tokenStat = new StringTokenizer(brStat.readLine());

tokenStat.nextToken();

tokenStat.nextToken();

tokenStat.nextToken();

tokenStat.nextToken();

tokenStat.nextToken();

tokenStat.nextToken();

tokenStat.nextToken();

String cpuUsage = tokenStat.nextToken();

System.out.println("CPU idle : "+cpuUsage);

Float usage = new Float(cpuUsage.substring(0,cpuUsage.indexOf("%")));

return (1-usage.floatValue()/100);

}

} catch(IOException ioe){

System.out.println(ioe.getMessage());

freeResource(is, isr, brStat);

return 1;

} finally{

freeResource(is, isr, brStat);

}

}

关于javaio内存和Java直接内存的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。