zoukankan      html  css  js  c++  java
  • 对《java程序员上班那点事》笔者对数组占用内存质疑

    1.《java程序员上班那点事》笔者对数组占用内存的描述


    2.实际测试情况:


        /**
         * 测试一维数组占用内存
         */
        public static void testOneArray() {
            System.out.println("当前虚拟机的最大内存:" + Runtime.getRuntime().maxMemory() / 1024 / 1024 + "m------" + Runtime.getRuntime().maxMemory() + "byte");
            System.out.println("循环前虚拟机已占内存:" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "m====" + Runtime.getRuntime().totalMemory() + "byte");
            try {
                int len = 1024 * 1024 * 300;// 设定循环次数
                byte[] buffer = new byte[len];
                for (int i = 0; i < len; i++) {
                    buffer[i] = (byte) i;
                }
                System.out.println("循环前虚拟机已占内存:" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "m====" + Runtime.getRuntime().totalMemory() + "byte");
            } catch (Error e) {
                System.out.println("遇到错误:" + e);
            }
            /*
             * 测试结果:
               当前虚拟机的最大内存:793m------832438272byte 
               循环前虚拟机已占内存:127m====133234688byte 
               循环前虚拟机已占内存:427m====447877120byte
             */
        }
    
        /**
         * 测试二维数组占用内存
         */
        public static void testTowArray() {
            System.out.println("当前虚拟机的最大内存:" + Runtime.getRuntime().maxMemory() / 1024 / 1024 + "m------" + Runtime.getRuntime().maxMemory() + "byte");
            System.out.println("循环前虚拟机已占内存:" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "m====" + Runtime.getRuntime().totalMemory() + "byte");
            try {
                int len = 1024 * 1024;// 设定循环次数
                byte[][] buffer = new byte[len][300];
                for (int i = 0; i < len; i++) {
                    buffer[i][0] = (byte) i;
                    buffer[i][1] = (byte) i;
                }
                System.out.println("循环前虚拟机已占内存:" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "m====" + Runtime.getRuntime().totalMemory() + "byte");
            } catch (Error e) {
                System.out.println("遇到错误:" + e);
            }
            /*
             * 测试结果:
               当前虚拟机的最大内存:793m------832438272byte
              循环前虚拟机已占内存:127m====133234688byte
              循环前虚拟机已占内存:398m====417398784byte
             */
    }

    分析:个人认为,上面前辈的测试没有在循环直接输出以下jvm已占用的内存;对比我这次的测试,如果用循环之后的减去循环之前的占用的内存推翻了那位前辈的理论,正好相反,对于哪一种是正确的,有待大家的考证?!

  • 相关阅读:
    基于ZKEACMS的.Net Core多租户CMS建站系统
    使用PowerShell自动部署ASP.NetCore程序到IIS
    在Linux安装ASP.Net Core的运行时(Runtime)
    ASP .Net Core 2.0 修改默认端口
    .Net Core内存回收模式及性能测试对比
    .Net Core配置与自动更新
    Razor TagHelper实现Markdown转HTML
    用Docker自动构建纸壳CMS
    纸壳CMS 2.3,正式加入商城功能
    Linux使用私钥公钥(Public key)登录
  • 原文地址:https://www.cnblogs.com/yangkai-cn/p/4016691.html
Copyright © 2011-2022 走看看