GVKun编程网logo

Windows上每个Java进程的最大内存量?(java进程占用的内存)

7

想了解Windows上每个Java进程的最大内存量?的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于java进程占用的内存的相关问题,此外,我们还将为您介绍关于dynamic设置java进程

想了解Windows上每个Java进程的最大内存量?的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于java进程占用的内存的相关问题,此外,我们还将为您介绍关于dynamic设置java进程的最大堆大小、java 程序获取 windows 内存占用 | CPU 使用率 | 启动命令 | 进程 ID | 进程名称、Java进程执行的Windows进程没有终止、Java进程调试(windows)的新知识。

本文目录一览:

Windows上每个Java进程的最大内存量?(java进程占用的内存)

Windows上每个Java进程的最大内存量?(java进程占用的内存)

您可以在32位Windows上为Java进程分配的最大堆大小是-Xmx多少?

我问是因为我想在OpenMap中使用ETOPO1数据,而原始二进制浮点文件大约为910 MB。

dynamic设置java进程的最大堆大小

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 内存占用 | 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进程没有终止

Java进程执行的Windows进程没有终止

我从 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.

解决方法

很可能只需要读取进程的stdout和stderr,否则它会在输出缓冲区已满时挂起.如果您将stderr重定向到stdout,这样最简单,只是为了安全起见:
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)

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)的相关知识,请在本站搜索。

本文标签: