想了解Windows上每个Java进程的最大内存量?的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于java进程占用的内存的相关问题,此外,我们还将为您介绍关于dynamic设置java进程
想了解Windows上每个Java进程的最大内存量?的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于java进程占用的内存的相关问题,此外,我们还将为您介绍关于dynamic设置java进程的最大堆大小、java 程序获取 windows 内存占用 | CPU 使用率 | 启动命令 | 进程 ID | 进程名称、Java进程执行的Windows进程没有终止、Java进程调试(windows)的新知识。
本文目录一览:- Windows上每个Java进程的最大内存量?(java进程占用的内存)
- dynamic设置java进程的最大堆大小
- java 程序获取 windows 内存占用 | CPU 使用率 | 启动命令 | 进程 ID | 进程名称
- Java进程执行的Windows进程没有终止
- Java进程调试(windows)
Windows上每个Java进程的最大内存量?(java进程占用的内存)
您可以在32位Windows上为Java进程分配的最大堆大小是-Xmx
多少?
我问是因为我想在OpenMap中使用ETOPO1数据,而原始二进制浮点文件大约为910 MB。
dynamic设置java进程的最大堆大小
我有一个Java程序是由一个batch file,像这样行:
javaw -xms64m -Xmx1024m com.acme.MyProgram
但是,在某些计算机上,程序不会启动并显示以下消息:
无法为对象堆预留足够的空间。 无法创buildJava虚拟机。
这个问题似乎是内存分配池的最大尺寸大于电脑可以处理的。 将内存分配池的最大容量从1024m减less到512m似乎可以解决问题。
如何衡量目前在Linux上使用的内存带宽?
Linux上的javafx应用程序巨大的内存消耗(不是Windows)
如何在Python中使用psutil获得程序的最大内存使用率
从U-boot shell模式写入NVRAM
从C中的物理内存地址读取结构
有没有一种方法可以提前确定计算机上有多less内存(从batch file中),并确定是否在batch file调用中使用-Xmx1024m或-Xmx512m ? 请注意,这个batch file只需要在Windows上工作。
是否需要时间来释放内存?
你怎么知道一个文件是否被caching在内存中的Linux?
如何确定Linux中的进程内存限制?
为什么在TOP命令的详细列表中列出的SWAP大于摘要?
有一个命令,我可以打电话打印出malloc数据结构?
实际上Java VM已经做了类似的事情。 如果您不指定-xms或-Xmx ,则这些值是从机器上的物理内存量推断出来的。 或者至少如此说这个网页 。
您可以将-xms设置为使您的应用程序有用的最小堆大小,并让Java为-Xmx确定合适的值。
你可以看看这个页面的一些答案: 让JVM根据需要增加内存需求,达到VM限制的大小?
如果你的程序正常工作的最大堆积为512米,我会使用该值。
这就是说,我也会检查一下,看看是否有办法做你所要求的,因为这是一个有趣的问题。
您可以从您的批处理文件执行,检查退出时的错误级别,如果失败,则在较低的内存中重新启动。 我不确定错误级别是否可行 – 如果没有,你也可以检查程序执行的时间长度,小于10秒的任何事情都是免费的。
只是一些评论 –
如果你知道它不需要超过512,你应该运行一个测试,以确保1024实际上有帮助。 较大的堆可能经常使GC暂停更长时间,并且做其他事情。
如果你非常确定你会使用一定数量的内存(比如,堆将很容易地填满你分配的512),那么你应该把min设置为这个数。 如果你的程序分配了一堆东西,但是不是情境的(总是使用大约相同数量的内存),那么将最小值和最大值都设置为512是很好的。
java 程序获取 windows 内存占用 | CPU 使用率 | 启动命令 | 进程 ID | 进程名称
java 程序获取 windows 内存占用(MB)|CPU 使用率 | 启动命令 | 进程 ID | 进程名称
public class App {
// 可以设置长些,防止读到运行此次系统检查时的cpu占用率,就不准了
private static final int CPUTIME = 5000;
private static final int MB = 1024 * 1024;
public static void main(String[] args) throws IOException, InterruptedException {
// Thread.sleep(30000);
MonitorInfoBean monitorInfo = getMonitorInfoBean();
List<PerfRawData> perfRawDataList = getCpuUsage();
List<ProcessCmdLine> processCmdLineList = getProcessCmdLineList();
for (MonitorInfoBean.ProcessDetail processDetail : monitorInfo.getProcessDetailList()) {
PerfRawData perfRawData = perfRawDataList.stream().filter(d -> d.getPid() == processDetail.getPid()).findFirst().orElse(null);
if (perfRawData == null) {
processDetail.setCpuRatio(0);
} else {
processDetail.setCpuRatio(perfRawData.getCpuRatio());
}
ProcessCmdLine processCmdLine = processCmdLineList.stream().filter(d -> d.getPid() == processDetail.getPid()).findFirst().orElse(null);
if (processCmdLine != null) {
processDetail.setCmdLine(processCmdLine.getCmdLine());
}
}
monitorInfo.getProcessDetailList().sort(Comparator.comparing(MonitorInfoBean.ProcessDetail::getCpuRatio).reversed());
System.out.println("时间|进程ID|进程名称|内存占用(MB)|CPU使用率|启动命令");
for (MonitorInfoBean.ProcessDetail processDetail : monitorInfo.getProcessDetailList()) {
System.out.println(String.format("%s|%s|%s|%s|%s|%s"
, DateFormat.getDateTimeInstance().format(processDetail.time)
, processDetail.pid
, processDetail.pName
, processDetail.memUsage / 1024
, new DecimalFormat("######0.00").format(processDetail.cpuRatio)
, processDetail.cmdLine));
}
}
/**
* 获得当前的监控对象
*/
private static MonitorInfoBean getMonitorInfoBean() throws IOException {
OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
MonitorInfoBean infoBean = new MonitorInfoBean();
infoBean.setOsName(System.getProperty("os.name"));
infoBean.setTotalMemorySize(operatingSystemMXBean.getTotalPhysicalMemorySize() / MB);
infoBean.setFreePhysicalMemorySize(operatingSystemMXBean.getFreePhysicalMemorySize() / MB);
infoBean.setUsedMemory(infoBean.getTotalMemorySize() - infoBean.getFreePhysicalMemorySize());
List<String> cmdResult = execCmd("cmd.exe /c tasklist");
List<MonitorInfoBean.ProcessDetail> processDetailList = new ArrayList<>();
String line;
for (int i = 0; i < cmdResult.size(); i++) {
if (i <= 2 || StringUtils.isEmpty(cmdResult.get(i))) {
continue;
}
line = cmdResult.get(i);
if (line.length() > 0) {
MonitorInfoBean.ProcessDetail processDetail = new MonitorInfoBean.ProcessDetail();
processDetail.setTime(new Date());
processDetail.setPName(line.substring(0, 29).trim());
line = line.substring(29).trim();
line = line.replaceAll("\\s+", " ");
String[] lineArr = line.split(" ");
processDetail.setPid(Integer.parseInt(lineArr[0]));
processDetail.setMemUsage(Integer.parseInt(lineArr[3].replaceAll(",", "")));
processDetailList.add(processDetail);
}
}
infoBean.setProcessDetailList(processDetailList);
return infoBean;
}
/**
* 计算CPU使用率
*/
private static List<PerfRawData> getCpuUsage() throws IOException, InterruptedException {
List<PerfRawData> perfRawDataList1 = getPerfRawDataList();
Thread.sleep(CPUTIME);
List<PerfRawData> perfRawDataList2 = getPerfRawDataList();
for (PerfRawData perfRawData1 : perfRawDataList1) {
PerfRawData perfRawData2 = perfRawDataList2.stream().filter(d -> d.getPid() == perfRawData1.getPid()).findFirst().orElse(null);
if (perfRawData2 == null) {
perfRawData1.setCpuRatio(0);
continue;
}
long n1 = perfRawData1.getPercentProcessorTime();
long n2 = perfRawData2.getPercentProcessorTime();
long d1 = perfRawData1.getTimestamp_Sys100NS();
long d2 = perfRawData2.getTimestamp_Sys100NS();
perfRawData1.setCpuRatio(((double) (n2 - n1) / (d2 - d1)) * 100);
}
return perfRawDataList1;
}
private static List<PerfRawData> getPerfRawDataList() throws IOException {
List<PerfRawData> perfRawDataList = new ArrayList<>();
String command = "powershell.exe Get-WmiObject -Class Win32_PerfRawData_PerfProc_Process IDProcess,Name,PercentProcessorTime,TimeStamp_Sys100NS";
List<String> cmdResult = execCmd(command);
PerfRawData perfRawData = new PerfRawData();
for (String s : cmdResult) {
if (StringUtils.isEmpty(s)) {
if (perfRawData.getPid() > 0) {
perfRawDataList.add(perfRawData);
perfRawData = new PerfRawData();
}
continue;
}
String[] sArr = s.split(":");
if (s.contains("IDProcess")) {
perfRawData.setPid(Integer.parseInt(sArr[1].trim()));
} else if (s.contains("Name :")) {
perfRawData.setPName(sArr[1].trim());
} else if (s.contains("PercentProcessorTime")) {
perfRawData.setPercentProcessorTime(Long.parseLong(sArr[1].trim()));
} else if (s.contains("Timestamp_Sys100NS")) {
perfRawData.setTimestamp_Sys100NS(Long.parseLong(sArr[1].trim()));
}
}
return perfRawDataList;
}
private static List<ProcessCmdLine> getProcessCmdLineList() throws IOException {
List<ProcessCmdLine> processCmdLineList = new ArrayList<>();
String command = "powershell.exe wmic process get processID,caption,commandline,executablepath /value";
List<String> cmdResult = execCmd(command);
ProcessCmdLine processCmdLine = new ProcessCmdLine();
for (String s : cmdResult) {
if (StringUtils.isEmpty(s)) {
if (processCmdLine.getPid() > 0 && StringUtils.hasText(processCmdLine.getCmdLine())) {
processCmdLineList.add(processCmdLine);
processCmdLine = new ProcessCmdLine();
}
continue;
}
String[] sArr = s.split("=");
if (s.contains("CommandLine")) {
processCmdLine.setCmdLine(sArr.length == 2 ? sArr[1].trim() : "empty");
} else if (s.contains("ProcessId")) {
processCmdLine.setPid(Integer.parseInt(sArr[1].trim()));
}
}
return processCmdLineList;
}
/**
* 执行cmd命令,按行返回执行结果
*
* @param command cmd命令
* @return 按行返回执行结果
* @throws IOException
*/
private static List<String> execCmd(String command) throws IOException {
Process powerShellProcess = Runtime.getRuntime().exec(command);
powerShellProcess.getOutputStream().close();
List<String> lineList = new ArrayList<>();
String line;
BufferedReader stdout = new BufferedReader(new InputStreamReader(powerShellProcess.getInputStream()));
while ((line = stdout.readLine()) != null) {
lineList.add(line);
}
stdout.close();
return lineList;
}
@Data
public static class MonitorInfoBean {
// 操作系统(MB)
private String osName;
// 总的物理内存(MB)
private long totalMemorySize;
// 剩余的物理内存(MB)
private long freePhysicalMemorySize;
// 已使用的物理内存(MB)
private long usedMemory;
private List<ProcessDetail> processDetailList;
@Data
public static class ProcessDetail {
private Date time;
private String pName;
private int pid;
// 占用内存(KB)
private int memUsage;
// CPU使用率(百分比)
private double cpuRatio;
private String cmdLine;
}
}
@Data
public static class PerfRawData {
private int pid;
private String pName;
private long PercentProcessorTime;
private long Timestamp_Sys100NS;
/**
* CPU使用率百分比*100
*/
private double cpuRatio;
}
@Data
public static class ProcessCmdLine {
private int pid;
private String cmdLine;
}
}
打印结果为:
时间|进程ID|进程名称|内存占用(MB)|CPU使用率|启动命令
2021-7-13 17:48:50|14752|java.exe|30|8.93|empty
2021-7-13 17:48:50|4472|Memory Compression|1218|4.36|empty
2021-7-13 17:48:50|12164|idea64.exe|2569|3.57|"D:\Program Files\JetBrains\IntelliJ IDEA 2020.1.2\bin\idea64.exe"
2021-7-13 17:48:50|2296|ekrn.exe|146|2.18|empty
2021-7-13 17:48:50|4|System|0|1.79|empty
2021-7-13 17:48:50|6176|softmon.exe|8|1.59|empty
2021-7-13 17:48:50|6940|svchost.exe|24|1.39|C:\Windows\system32\svchost.exe -k UnistackSvcGroup
2021-7-13 17:48:50|1248|dwm.exe|150|1.19|empty
2021-7-13 17:48:50|792|csrss.exe|5|0.99|empty
2021-7-13 17:48:50|7136|WmiPrvSE.exe|21|0.60|empty
2021-7-13 17:48:50|564|svchost.exe|23|0.40|empty
2021-7-13 17:48:50|5796|tmcsvc.exe|6|0.40|empty
2021-7-13 17:48:50|6700|CGESA.exe|9|0.40|empty
Java进程执行的Windows进程没有终止
import java.io.IOException; public class Test { /** * @param args * @throws IOException * @throws InterruptedException */ public static void main(String[] args) throws IOException,InterruptedException { Process process = Runtime.getRuntime().exec("cmd /c dir"); process.waitFor(); } }
为了超出我的理解,这个程序永远不会完成.如果“cmd / c dir”被替换为ipconfig以及其他的东西,这是真的.
我可以看到使用ProcessExplorer,java创建了cmd进程.这个样本显然是一个简化;在我的原始程序中,我发现如果我在一段时间后调用process.destroy(),并检查cmd进程输出,那么该命令将被成功执行.
我已经尝试过与Java 1.5和1.6的各种版本.我的操作系统是Windows XP Pro,SP 2.
解决方法
public static void main(String[] args) throws IOException,InterruptedException { String[] cmd = new String[] { "cmd.exe","/C","dir","2>&1" }; Process process = Runtime.getRuntime().exec(cmd); InputStream stdout = process.getInputStream(); while( stdout.read() >= 0 ) { ; } process.waitFor(); } }
Java进程调试(windows)
1、下载openjdk的debug版本。
2、jre/bin下的diz文件,用unzip解压,得到pdb文件。
3、进行调试。
今天关于Windows上每个Java进程的最大内存量?和java进程占用的内存的讲解已经结束,谢谢您的阅读,如果想了解更多关于dynamic设置java进程的最大堆大小、java 程序获取 windows 内存占用 | CPU 使用率 | 启动命令 | 进程 ID | 进程名称、Java进程执行的Windows进程没有终止、Java进程调试(windows)的相关知识,请在本站搜索。
本文标签: