精华内容
下载资源
问答
  • java获取对象内存
    2021-04-18 02:22:48

    java如何获取对象占用内存大小?

    如何获取对象占用多大内存。读了一个11M的文本,分词用HashMap存起来,打印内存居然少了400M,想看看内存被谁占用了

    分享到:

    ------解决方案--------------------

    11M文本,假设每个词占10个字节都有110W个词组左右。

    比如key为词组,value为词频,算上java中对象的额外空间,以及hash结构的开销,是不是差不多要几百M。

    这个时候选择一个好的数据结构就比较合适了。比如分词使用trie树可以看看会不会达到你要的效果。

    ------解决方案--------------------

    应该是HashMap占用了比较多。一个非常简单的测试方法,在你认为消耗内存的前后打印下当前使用的内存:

    import java.util.HashMap;

    import java.util.Map;

    public class MemoryTest {

    /**

    * @param args

    */

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    System.gc();

    long total = Runtime.getRuntime().totalMemory(); // byte

    long m1 = Runtime.getRuntime().freeMemory();

    System.out.println("before:" + (total - m1));

    Map map = new HashMap();

    for(int i=0; i 

    map.put(new Object(), new Object());

    }

    long total1 = Runtime.getRuntime().totalMemory();

    long m2 = Runtime.getRuntime().freeMemory();

    System.out.println("after:" + (total1 - m2));

    System.out.println(map.toString());

    }

    }

    打印结果:

    before:494872

    after:825272

    {java.lang.Object@41fae3c6=java.lang.Object@6727734f, java.lang.Object@4506411=java.lang.Object@4f037c71, java.lang.Object@39d99a4d=java.lang.Object@6ddf073d, java.lang.Object@95c7850=java.lang.Object@4d546e25, java.lang.Object@37dd7056=java.lang.Object@620b66cc, java.lang.Object@1f24bbbf=java.lang.Object@5a8a0d5d, java.lang.Object@6ac2a132=java.lang.Object@1d73831b, java.lang.Object@44fd13b5=java.lang.Object@aa470b8, java.lang.Object@6a8814e9=java.lang.Object@31e4457d, java.lang.Object@41d5550d=java.lang.Object@18e2b22, java.lang.Object@2687816d=java.lang.Object@1cb1c5fa, java.lang.Object@16c9ba38=java.lang.Object@5b3caecd, java.lang.Object@8dd20f6=java.lang.Object@6cf84386, java.lang.Object@229ed927=java.lang.Object@1f194a4e, java.lang.Object@7bdecdec=java.lang.Object@355d56d5, java.lang.Object@4318f375=java.lang.Object@2efd552, java.lang.Object@7000a32b=java.lang.Object@4f9dfbff, java.lang.Object@27430b5c=java.lang.Object@d0b4b2f, java.lang.Object@5456a499=java.lang.Object@60750159, java.lang.Object@4310b053=java.lang.Object@21abab88, java.lang.Object@1ff9dc36=java.lang.Object@d8a7efd, java.lang.Object@6d9efb05=java.lang.Object@7f971afc, java.lang.Object@55e859c0=java.lang.Object@196cd7d5, java.lang.Object@7ca83b8a=java.lang.Object@38cdedfd, java.lang.Object@13aaa14a=java.lang.Object@57c39a2d, java.lang.Object@3d4b7453=java.lang.Object@6abf2d5e, java.lang.Object@26021b6d=java.lang.Object@2d3bad12, java.lang.Object@3d833955=java.lang.Object@28df8ff1, java.lang.Object@40a0dcd9=java.lang.Object@6d632c2d, java.lang.Object@5b86d4c1=java.lang.Object@9e97676, java.lang.Object@2b820dda=java.lang.Object@3e60420f, java.lang.Object@2da679b7=java.lang.Object@219106c7, java.lang.Object@ce102dc=java.lang.Object@38540408, java.lang.Object@7d2152e6=java.lang.Object@13d4c61c, java.lang.Object@3a3ee284=java.lang.Object@761a626f, java.lang.Object@5013582d=java.lang.Object@3e34a1fc, java.lang.Object@59de3f2d=java.lang.Object@7176c74b, java.lang.Object@4383f74d=java.lang.Object@2d16471f, java.lang.Object@7f5f5897=java.lang.Object@11975b59, java.lang.Object@2fe4cbc4=java.lang.Object@67ee3914, java.lang.Object@7d67d940=java.lang.Object@48e5855a, java.lang.Object@6c22c95b=java.lang.Object@5495fd19, java.lang.Object@11cfb549=java.lang.Object@431b9fb1, java.lang.Object@2586db54=java.lang.Object@4a913fe2, java.lang.Object@68ab95e6=java.lang.Object@5f934ad, java.lang.Object@7b11a3ac=java.lang.Object@2bf14ceb, java.lang.Object@50337d0f=java.lang.Object@6ef0eed6, java.lang.Object@4cb162d5=java.lang.Object@bd05c81, java.lang.Object@eb166b5=java.lang.Object@1c691f36, java.lang.Object@3e7ffe01=java.lang.Object@398020cc, java.lang.Object@5e743399=java.lang.Object@ae94e92, java.lang.Object@20cdfc9c=java.lang.Object@5b2558d6, java.lang.Object@15ded0fd=java.lang.Object@70eb7859, java.lang.Object@c1503a3=java.lang.Object@732a54f9, java.lang.Object@37a1c887=java.lang.Object@6030e280, java.lang.Object@2afa3ac1=java.lang.Object@296672d6, java.lang.Object@1034bb5=java.lang.Object@4fd54d6, java.lang.Object@882c01f=java.lang.Object@13ccb029, java.lang.Object@8b2fd8f=java.lang.Object@63415de6, java.lang.Object@3f0ef90c=java.lang.Object@587bd9f2, java.lang.Object@576a9d42=java.lang.Object@2b21cc40, java.lang.Object@12276af2=java.lang.Object@37e893df, java.lang.Object@60a1807c=java.lang.Object@6443226, java.lang.Object@768965fb=java.lang.Object@67386000, java.lang.Object@e05d173=java.lang.Object@2626d4f1, java.lang.Object@1ee7b241=java.lang.Object@3f662dc8, java.lang.Object@c80f4cb=java.lang.Object@4d47c5fc, java.lang.Object@64578ceb=java.lang.Object@23174b07, java.lang.Object@15e0be38=java.lang.Object@4e3eca90, java.lang.Object@664741d6=java.lang.Object@7c64dc11, java.lang.Object@70f9f9d8=java.lang.Object@41ac1fe4, java.lang.Object@1b17a8bd=java.lang.Object@b61d36b, java.lang.Object@72291aff=java.lang.Object@437f1ba3, java.lang.Object@7f12f614=java.lang.Object@4def8cf3, java.lang.Object@afa7e74=java.lang.Object@2a0ecd7e, java.lang.Object@39d8957f=java.lang.Object@31d520c4, java.lang.Object@35d9dc39=java.lang.Object@1f5a3d6b, java.lang.Object@38a97b0b=java.lang.Object@5d764be1, java.lang.Object@4ce86da0=java.lang.Object@16fd0b7, java.lang.Object@33837697=java.lang.Object@53ef9f1d, java.lang.Object@3cb89838=java.lang.Object@18b753f8, java.lang.Object@2e471e30=java.lang.Object@2be9cb75, java.lang.Object@5fd1acd3=java.lang.Object@22c84d9, java.lang.Object@2ce83912=java.lang.Object@38c5c3ac, java.lang.Object@58fe64b9=java.lang.Object@3fb16e52, java.lang.Object@3ea981ca=java.lang.Object@19c1ea29, java.lang.Object@24c21495=java.lang.Object@9f436f5, java.lang.Object@187a84e4=java.lang.Object@4413ee, java.lang.Object@60723d7c=java.lang.Object@75786e64, java.lang.Object@a422ede=java.lang.Object@3597a37c, java.lang.Object@40133796=java.lang.Object@766e3d60, java.lang.Object@72093dcd=java.lang.Object@3f7fa65e, java.lang.Object@1cc2ea3f=java.lang.Object@558385e3, java.lang.Object@675b7986=java.lang.Object@2dcb25f1, java.lang.Object@36867e89=java.lang.Object@742808b3, java.lang.Object@55fdc96c=java.lang.Object@70535b58, java.lang.Object@2f754ad2=java.lang.Object@70922804, java.lang.Object@7ecd2c3c=java.lang.Object@b815859, java.lang.Object@79616c7=java.lang.Object@58cf40f5, java.lang.Object@fe51060=java.lang.Object@eb1c260}

    更多相关内容
  • Java获取对象内存地址

    万次阅读 多人点赞 2020-10-09 21:50:38
    haseCode()方法获取并非对象内存地址 hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,获取对象散列的地址,并非实际内存地址。 java直接打印对象,结果是十六进制的散列地址值 public class Object...

    haseCode()方法获取并非对象内存地址

    hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,获取对象散列的地址,并非实际内存地址。

    java直接打印对象,结果是十六进制的散列地址值

    public class ObjectTest {
        public static void main(String[] args) {
            Object obj = new Object();
            System.out.println(obj);
            System.out.println(Integer.toHexString(obj.hashCode();
        }
    }
    

    在这里插入图片描述

    haseCode()方法无法证明两个对象是否为同一个对象

    public class ObjectTest {
        public static void main(String[] args) {
            String s1 = "hello";
            String s2 = new String("hello");
            System.out.println(s1.hashCode());
            System.out.println(s2.hashCode());
        }
    }
    

    打印的值都相等,无法区分两个不同的对象
    在这里插入图片描述

    Java 如何获取对象内存地址

    maven引入jol工具包

    <dependency>
        <groupId>org.openjdk.jol</groupId>
        <artifactId>jol-core</artifactId>
        <version>0.9</version>
    </dependency>
    

    示例代码

    public class ObjectTest {
        public static void main(String[] args) {
            String s1 = "hello";
            String s2 = new String("hello");
            System.out.println(s1==s2);
            System.out.println(s1.equals(s2));
            System.out.println("--获取内存地址--");
            System.out.println(VM.current().addressOf(s1));
            System.out.println(VM.current().addressOf(s2));
        }
    }
    

    在这里插入图片描述

    展开全文
  • Java获取对象内存地址

    千次阅读 2021-08-02 21:42:52
    我们知道在Java中对于synchronized对于同步方法锁的是当前的实例对象。 例如以下这段代码: import java.util.concurrent.TimeUnit; public class Test { public static void main(String[] args) { Test test = ...

    前言

    我们知道在Java中对于synchronized对于同步方法锁的是当前的实例对象。
    例如以下这段代码:

    import java.util.concurrent.TimeUnit;
    
    public class Test {
        public static void main(String[] args) {
            Test test = new Test();
            test.helper();
        }
    
        public synchronized void helper() {
            try {
                System.out.println("hello");
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    

    通过dump后我们可以得到以下信息:

    "main" #1 prio=5 os_prio=0 tid=0x00c46c00 nid=0x1d60 waiting on condition [0x00ddf000]
       java.lang.Thread.State: TIMED_WAITING (sleeping)
    	at java.lang.Thread.sleep(Native Method)
    	at java.lang.Thread.sleep(Thread.java:340)
    	at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
    	at Test.helper(Test.java:16)
    	- locked <0x09db48c0> (a Test)
    	at Test.main(Test.java:10)
    

    Test的实例 test的内存地址为 <0x09db48c0>。我们如何验证这个地址就是我们的内存地址?

    正文

    引入依赖

    在pom.xml中添加依赖:

            <dependency>
                <groupId>org.openjdk.jol</groupId>
                <artifactId>jol-core</artifactId>
                <version>0.10</version>
            </dependency>
    

    使用

    使用很简单:

    VM.current().addressOf(test)
    

    放到我们这个代码中就是:

    import org.openjdk.jol.vm.VM;
    
    import java.util.concurrent.TimeUnit;
    
    public class Test {
        public static void main(String[] args) {
            Test test = new Test();
            System.out.println("The memory address is " + VM.current().addressOf(test));
            System.out.println("The memory address is " + Long.toHexString(VM.current().addressOf(test)));
            test.helper();
        }
    
        public synchronized void helper() {
            try {
                System.out.println("hello");
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    

    在控制台我们可以看到输出:

    The memory address is 165365952
    The memory address is 9db48c0
    hello
    

    结论

    通过引入org.openjdk.jol我们可以快速的得到对象的内存地址。大致看下相关的源码可以发现底层是使用unsafe类进行判断的。

    JOL (Java Object Layout) is the tiny toolbox to analyze object layout schemes in JVMs. These tools are using Unsafe, JVMTI, and Serviceability Agent (SA) heavily to decoder the actual object layout, footprint, and references. This makes JOL much more accurate than other tools relying on heap dumps, specification assumptions, etc.

    (Java对象布局)是在jvm中分析对象布局方案的小工具箱。这些工具大量使用Unsafe、JVMTI和Serviceability Agent (SA)来解码实际的对象布局、内存占用和引用。这使得JOL比其他依赖堆转储、规范假设等的工具更精确。

    展开全文
  • java取得对象占用的内存大小

    千次阅读 2020-05-19 14:34:51
    一、通过Instrumentation获取内存java工程中添加如下代理类: package com.nineya.memorymeasurs; import java.lang.instrument.Instrumentation; public class MemoryMeasurs { static Instrumentation ...

    本文环境

    1. win 10
    2. jdk 1.8.0_241
    3. IntelliJ 2019.1.3

    一、通过Instrumentation获取内存

    1. 在java工程中添加如下代理类:
    package com.nineya.memorymeasurs;
    import java.lang.instrument.Instrumentation;
    
    public class MemoryMeasurs {
    
        static Instrumentation inst;
    
        // 由jvm注入
        public static void premain(String agentArgs, Instrumentation inst) {
            MemoryMeasurs.inst = inst;
        }
    
        // 取得对象大小
        public static long sizeOf(Object o) {
            if(inst == null) {
                throw new IllegalStateException("请在java的“-javaagent”命令行参数中运行。");
            }
            return inst.getObjectSize(o);
        }
    }
    

    上面的代理类能够实现基础的测量类对象内存占用的功能,在网上找到的更完整的版本如下,能够递归测量类对象引用的对象的占用的内存。

    package com.nineya.memorymeasurs;
    
    import java.lang.instrument.Instrumentation;
    import java.lang.reflect.Array;
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    import java.util.IdentityHashMap;
    import java.util.Map;
    import java.util.Stack;
    /**
     * @author linsongwang
     * @date 2020/4/27
     */
    
    public class MemoryMeasurs {
        static Instrumentation inst;
    
        // 由jvm注入
        public static void premain(String agentArgs, Instrumentation instP) {
            inst = instP;
        }
    
        // 计算对象内存占用
        public static long sizeOf(Object o) {
            if(inst == null) {
                throw new IllegalStateException("请在java的“-javaagent”命令行参数中运行。");
            }
            return inst.getObjectSize(o);
        }
        /**
         * 递归计算当前对象占用空间总大小,包括当前类和超类的实例字段大小以及实例字段引用对象大小
         */
        public static long fullSizeOf(Object obj) {//深入检索对象,并计算大小
            Map<Object, Object> visited = new IdentityHashMap<Object, Object>();
            Stack<Object> stack = new Stack<Object>();
            long result = internalSizeOf(obj, stack, visited);
            while (!stack.isEmpty()) {//通过栈进行遍历
                result += internalSizeOf(stack.pop(), stack, visited);
            }
            visited.clear();
            return result;
        }
    
        //判定哪些是需要跳过的
        private static boolean skipObject(Object obj, Map<Object, Object> visited) {
            if (obj instanceof String) {
                if (obj == ((String) obj).intern()) {
                    return true;
                }
            }
            return (obj == null) || visited.containsKey(obj);
        }
    
        private static long internalSizeOf(Object obj, Stack<Object> stack, Map<Object, Object> visited) {
            if (skipObject(obj, visited)) {//跳过常量池对象、跳过已经访问过的对象
                return 0;
            }
            visited.put(obj, null);//将当前对象放入栈中
            long result = 0;
            result += sizeOf(obj);
            Class <?>clazz = obj.getClass();
            if (clazz.isArray()) {//如果数组
                if(clazz.getName().length() != 2) {// skip primitive type array
                    int length =  Array.getLength(obj);
                    for (int i = 0; i < length; i++) {
                        stack.add(Array.get(obj, i));
                    }
                }
                return result;
            }
            return getNodeSize(clazz , result , obj , stack);
        }
        //这个方法获取非数组对象自身的大小,并且可以向父类进行向上搜索
        private static long getNodeSize(Class <?>clazz , long result , Object obj , Stack<Object> stack) {
            while (clazz != null) {
                Field[] fields = clazz.getDeclaredFields();
                for (Field field : fields) {
                    if (!Modifier.isStatic(field.getModifiers())) {//这里抛开静态属性
                        if (field.getType().isPrimitive()) {//这里抛开基本关键字(因为基本关键字在调用java默认提供的方法就已经计算过了)
                            continue;
                        }else {
                            field.setAccessible(true);
                            try {
                                Object objectToAdd = field.get(obj);
                                if (objectToAdd != null) {
                                    stack.add(objectToAdd);//将对象放入栈中,一遍弹出后继续检索
                                }
                            } catch (IllegalAccessException ex) {
                                assert false;
                            }
                        }
                    }
                }
                clazz = clazz.getSuperclass();//找父类class,直到没有父类
            }
            return result;
        }
    }
    
    1. 修改META-INF\MANIFEST.MF文件,添加如下行,引用上面的代理类
    Premain-Class: com.nineya.memorymeasurs.MemoryMeasurs
    
    1. 在其他地方可以自由使用这个MemoryMeasurs代理类了。

    2. 编译工程为jar包,使用如下命令执行:

    java -javaagent:XXX.jar main方法所在的类
    
    // 示例
    java -javaagent:ObjectSize.jar  ObjectSizeTest
    

    二、通过jol包

    1.maven导包

            <dependency>
                <groupId>org.openjdk.jol</groupId>
                <artifactId>jol-core</artifactId>
                <version>0.9</version>
            </dependency>
    

    2.使用api

    import org.openjdk.jol.info.ClassLayout;
    
    // 取得map占用的空间
    Map<String, String> map = new HashMap<>();
    ClassLayout.parseInstance(map).instanceSize();
    

    3.jol只是获取对象占用的内存空间,不会递归获取对象引用的其他对象占用的内存空间,稍微修改上面的MemoryMeasurs类进行封装。

    package com.cl.graph.util;
    
    import org.openjdk.jol.info.ClassLayout;
    
    import java.lang.reflect.Array;
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    import java.util.IdentityHashMap;
    import java.util.Map;
    import java.util.Stack;
    
    /**
     * @author linsongwang
     * @date 2020/4/27
     */
    
    public class ObjectShallowSize {
    
        // 计算对象内存占用
        public static long sizeOf(Object o) {
            return ClassLayout.parseInstance(o).instanceSize();
        }
    
        /**
         * 深入检索对象,递归计算当前对象占用空间总大小,包括当前类和父类类的实例字段大小以及实例字段引用对象大小
         */
        public static long fullSizeOf(Object obj) {//深入检索对象,并计算大小
            Map<Object, Object> visited = new IdentityHashMap<Object, Object>();
            Stack<Object> stack = new Stack<Object>();
            long result = internalSizeOf(obj, stack, visited);
            while (!stack.isEmpty()) {//通过栈进行遍历
                result += internalSizeOf(stack.pop(), stack, visited);
            }
            visited.clear();
            return result;
        }
    
        //判定哪些是需要跳过的
        private static boolean skipObject(Object obj, Map<Object, Object> visited) {
            if (obj instanceof String) {
                if (obj == ((String) obj).intern()) {
                    return true;
                }
            }
            return (obj == null) || visited.containsKey(obj);
        }
    
        private static long internalSizeOf(Object obj, Stack<Object> stack, Map<Object, Object> visited) {
            if (skipObject(obj, visited)) {//跳过常量池对象、跳过已经访问过的对象
                return 0;
            }
            visited.put(obj, null);//将当前对象放入栈中
            long result = 0;
            result += sizeOf(obj);
            Class<?> clazz = obj.getClass();
            if (clazz.isArray()) {//如果数组
                if (clazz.getName().length() != 2) {// skip primitive type array
                    int length = Array.getLength(obj);
                    for (int i = 0; i < length; i++) {
                        stack.add(Array.get(obj, i));
                    }
                }
                return result;
            }
            return getNodeSize(clazz, result, obj, stack);
        }
    
        //这个方法获取非数组对象自身的大小,并且可以向父类进行向上搜索
        private static long getNodeSize(Class<?> clazz, long result, Object obj, Stack<Object> stack) {
            while (clazz != null) {
                Field[] fields = clazz.getDeclaredFields();
                for (Field field : fields) {
                    if (!Modifier.isStatic(field.getModifiers())) {//这里抛开静态属性
                        if (field.getType().isPrimitive()) {//这里抛开基本关键字(因为基本关键字在调用java默认提供的方法就已经计算过了)
                            continue;
                        } else {
                            field.setAccessible(true);
                            try {
                                Object objectToAdd = field.get(obj);
                                if (objectToAdd != null) {
                                    stack.add(objectToAdd);//将对象放入栈中,一遍弹出后继续检索
                                }
                            } catch (IllegalAccessException ex) {
                                assert false;
                            }
                        }
                    }
                }
                clazz = clazz.getSuperclass();//找父类class,直到没有父类
            }
            return result;
        }
    
        public static long getGraphMemory(String graphName){
            Graph graph = GraphManage.getGraph(graphName);
            if (graph==null){
                System.out.println("图 "+graphName+" 不存在!");
                return 0;
            }
            System.out.println("递归获取内存中,该过程将非常长!");
            return fullSizeOf(graph);
        }
    }
    

    4.使用ObjectShallowSize获取对象内存占用

    Map<String, String> map = new HashMap<>();
    // 取得map占用的空间
    ObjectShallowSize.sizeOf(map);
    // 递归取得map占用的空间
    ObjectShallowSize.fullSizeOf(map);
    

    三、通过计算jvm内存空间取得

    // gc操作
    System.gc();
    // startMemory=totalMemory(总内存)-freeMemory(剩余内存)
    long startMemory = Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory();
    
    // 在这里new需要测试内存占用的对象
    ...
    
    // gc操作
    System.gc();
    // endMemory=totalMemory(总内存)-freeMemory(剩余内存)
    long endMemory = Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory();
    
    Log.info("内存占用:"+ (endMemory-startMemory));
    
    展开全文
  • 本文讲述4种查看java对象所占内存大小的方法
  • java内存中的对象地址是可变的,所以获得内存地址有可能会变化。要获得内存地址也只能通过Unsafe的方法来获得,如下代码片段: package com.bijian.study; import java.lang.reflect.Field; import sun....
  • JAVA获取对象内存地址

    千次阅读 2018-08-21 17:18:53
    为了观察JVM的GC过程中各个对象所处的位置,需要观察JVM各个对象内存地址,与年轻代与老年代进行比对,确定对象位置。 package com.memory.tools; import sun.misc.Unsafe; import java.lang.reflect.Field; ...
  • Java对象内存分配

    千次阅读 2022-03-15 09:33:25
    文章目录Java对象的内存分配对象的创建流程类加载检查对象内存分配对象的内存布局对象头区域实例数据区域填充对齐区域对象的访问定位方式句柄访问直接指针访问 Java对象的内存分配 对象的创建流程 虚拟机收到new...
  • 获得java对象内存地址

    千次阅读 2019-03-18 12:21:17
    package com.example.demo.othertest; import java.lang.reflect.Field; import sun.misc.Unsafe; public class Addresser { private static Unsafe unsafe; static { try { Field ...
  • java获取对象内存地址

    千次阅读 2021-02-27 10:56:42
    import java.util.ArrayList;import java.util.List;import java.util.Stack;import sun.misc.Unsafe;import java.util.Collections;import java.lang.reflect.Field;public static void main(String[] args) {Strin...
  • java 查看对象内存占用大小

    千次阅读 2022-04-27 17:18:02
    1、POM 依赖 <dependency> <groupId>com.carrotsearch</groupId> <artifactId>java-sizeof<.../2、java 代码通过RamUsageEstimator 查看内存占用大小 String str = "xxx";
  • Java中打印对象内存地址

    千次阅读 2021-10-03 17:24:36
    既然Java对象内存地址不能获取到,所以这篇文章就应该变为“Java中如何获取对象的真实hashCode,而不受hashCode()方法被覆盖的影响”,接着下文: Object的hashCode()默认是返回内存地址的,但是hashCode()可以...
  • 查看java对象内存占用

    千次阅读 2022-03-21 15:33:03
    } } 结果: JVM 要求对象所占的内存空间大小是8字节的整数倍,而对象本来占17字节,加上补齐的 7 字节,一共占24字节(8字节 * 3) myTest:MyTest(a=0, b=false) # WARNING: Unable to attach Serviceability Agent....
  • 内存:一种通用的内存池(也位于RAM区),用于存放所有的Java对象,运行速度要比栈内存花费更多的时间。 概念是抽象的,不是很好理解,接下来通过一个具体的小案例,来揭开内存分配的神秘面纱。假如我们要设计一...
  • 如何获取一个Java对象所占内存大小

    千次阅读 2021-02-26 12:51:59
    如下图: 项目的JDK设置为1.8,如下图: 编写获取Java对象内存的工具方法 import java.lang.instrument.Instrumentation; import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang....
  • 如何获取JAVA对象所在的内存地址

    千次阅读 2021-02-12 18:48:17
    展开全部1、首先打开java构造方法代码。2、接下来就可以获得网卡物理地址方法代码。3、然32313133353236313431303231363533e4b893e5b19e31333431363639后得到获得机器IP地址方法代码。4、然后得到获得机器子网掩码...
  • 在面试官的因势利导下,很多人对jvm的内存模型已经耳熟能详,但是对我们经常new 出来的对象,比如new Object(),你了解它的内存模型吗?本篇文章将带你走进对象内部,真正去了解这个你最熟悉,也最不熟悉的的对象。 ...
  • 统计缓存大小(查看java对象所占的内存大小).
  • Java堆外内存的使用

    2021-01-21 17:09:50
    近经常有人问我在Java中使用堆外(off heap)内存的好处与用途何在。我想其他面临几样选择的人应该也会对这个答案感兴趣吧。  堆外内存其实并无特别之处。线程栈,应用程序代码,NIO缓存用的都是堆外内存。事实上...
  • java中查看对象使用内存大小

    千次阅读 2019-08-06 22:19:33
    首先设定内存最大和最小一样: public static void main(String[] args){ //查看jvm空闲内存大小,单位字节 long start = Runtime.getRuntime().freeMemory(); Map<String,String> map = new HashMap<>...
  • Java获得对象的几种方式

    千次阅读 2021-11-24 17:54:19
    使用new创建对象2. 通过反射的方式3. 通过clone的方式4. 通过反序列化的方式 Demo代码地址 User.java UserTest.java 1. 使用new创建对象 User user = new User(); 2. 通过反射的方式 try { // 1.使用Class类的...
  • Java Unsafe-获取对象内存地址

    千次阅读 2016-09-29 00:10:28
    Java Unsafe获取对象内存地址   public class UnsafeTestKlass {    private int value;    public UnsafeTestKlass() {  this(99);  }    public UnsafeTestKlass(int value) {  ...
  • 会调用对象的finalize方法来释放对象占据的内存空间~java中垃圾回收以前听老师讲好像是内存满了他才去做一次整体垃圾回收,在回收垃圾的同时会调用finalize方法....
  • Java 获取对象的唯一标识符

    千次阅读 2020-12-14 11:23:18
    public class Test { //如果覆盖了hashCode,则toString返回的@后数值以返回的HashCode为准 @Override ... * @param obj 需要取得唯一标识符的对象 * @return className@hashcode 形式的唯一标识符。
  • Java获取对象引用的地址

    千次阅读 2021-08-06 16:55:59
    You may add this JAR as -javaagent manually, or supply -Djdk.attach.allowAttachSelf # WARNING: Unable to attach Serviceability Agent. sun.jvm.hotspot.memory.Universe.getNarrowOopBase() s1的内存地址:...
  • Java怎么获取对象地址

    千次阅读 2021-07-29 15:58:19
    但是 Java 内存地址还是有一个应用场景,就是判断两个字符串内存地址是否相等来判断是否是同一个对象,用双等号 = 来比较的。参考代码如下: public class Test01 { public static void main(String[] args) { ...
  • 如何计算Java对象所占内存的大小

    万次阅读 多人点赞 2018-05-24 11:42:12
    摘要:本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型、锁原理、分代GC、OOP-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 694,807
精华内容 277,922
关键字:

java获取对象内存