精华内容
下载资源
问答
  • 展开全部在java中内存中的对象地址是可变的,所以获得的内存地e68a...要获得内存地址也只能通过Unsafe的方法来获得,如下代码示例:packagecom.bijian.study;importjava.lang.reflect.Field;importsun.misc.Unsaf...

    展开全部

    在java中内存中的对象地址是可变的,所以获得的内存地e68a843231313335323631343130323136353331333363373639址有可能会变化。要获得内存地址也只能通过Unsafe的方法来获得,如下代码示例:

    package com.bijian.study;

    import java.lang.reflect.Field;

    import sun.misc.Unsafe;

    public class Addresser {

    //实例化Unsafe 类

    private static Unsafe unsafe;

    static {

    try {

    //得到field对象

    Field field = Unsafe.class.getDeclaredField("theUnsafe");

    //设置获取地址

    field.setAccessible(true);

    unsafe = (Unsafe) field.get(null);

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    public static long addressOf(Object o) throws Exception {

    Object[] array = new Object[] { o };

    long baseOffset = unsafe.arrayBaseOffset(Object[].class);

    int addressSize = unsafe.addressSize();

    long objectAddress;

    switch (addressSize) {

    case 4:

    objectAddress = unsafe.getInt(array, baseOffset);

    break;

    case 8:

    objectAddress = unsafe.getLong(array, baseOffset);

    break;

    default:

    throw new Error("unsupported address size: " + addressSize);

    }

    return (objectAddress);

    }

    //打印地址的长度

    public static void main(String... args) throws Exception {

    Object mine = "Hi there".toCharArray();

    long address = addressOf(mine);

    System.out.println("Addess: " + address);

    // Verify address works - should see the characters in the array in the output

    printBytes(address, 27);

    }

    //调用此方法得到地址

    public static void printBytes(long objectAddress, int num) {

    //循环打印得到的地址。

    for (long i = 0; i 

    int cur = unsafe.getByte(objectAddress + i);

    System.out.print((char) cur);

    }

    System.out.println();

    }

    }

    运行结果:

    d187a105dc5a7b2627696025ea5ce7e0.png

    展开全文
  • 获得内存地址也只能通过Unsafe的方法来获得,如下代码片段:package cn.outofmemory.test;import java.lang.reflect.Field;import sun.misc.Unsafe;public class Addresser{private static Unsafe unsafe...

    在java中内存中的对象地址是可变的,所以获得的内存地址有可能会变化。要获得内存地址也只能通过Unsafe的方法来获得,如下代码片段:

    package cn.outofmemory.test;

    import java.lang.reflect.Field;

    import sun.misc.Unsafe;

    public class Addresser

    {

    private static Unsafe unsafe;

    static

    {

    try

    {

    Field field = Unsafe.class.getDeclaredField("theUnsafe");

    field.setAccessible(true);

    unsafe = (Unsafe)field.get(null);

    }

    catch (Exception e)

    {

    e.printStackTrace();

    }

    }

    public static long addressOf(Object o)

    throws Exception

    {

    Object[] array = new Object[] {o};

    long baseOffset = unsafe.arrayBaseOffset(Object[].class);

    int addressSize = unsafe.addressSize();

    long objectAddress;

    switch (addressSize)

    {

    case 4:

    objectAddress = unsafe.getInt(array, baseOffset);

    break;

    case 8:

    objectAddress = unsafe.getLong(array, baseOffset);

    break;

    default:

    throw new Error("unsupported address size: " + addressSize);

    }

    return(objectAddress);

    }

    public static void main(String... args)

    throws Exception

    {

    Object mine = "Hi there".toCharArray();

    long address = addressOf(mine);

    System.out.println("Addess: " + address);

    //Verify address works - should see the characters in the array in the output

    printBytes(address, 27);

    }

    public static void printBytes(long objectAddress, int num)

    {

    for (long i = 0; i < num; i++)

    {

    int cur = unsafe.getByte(objectAddress + i);

    System.out.print((char)cur);

    }

    System.out.println();

    }

    }

    展开全文
  • 获得java对象的内存地址

    千次阅读 2018-10-24 12:17:31
    Java不能直接访问操作系统底层,而是通过本地方法来...要获得内存地址也只能通过Unsafe的方法来获得,下面类提供了获取java对象内存地址的方法 package com.example.demo.othertest; import java.lang.reflect.Fi...

        Java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,在java中内存中的对象地址是可变的,所以获得的内存地址有可能会变化。要获得内存地址也只能通过Unsafe的方法来获得,下面类提供了获取java对象内存地址的方法

    package com.example.demo.othertest;
    import java.lang.reflect.Field;
    import sun.misc.Unsafe;
    
    public class Addresser {
        private static Unsafe unsafe;
    
        static {
            try {
                Field field = Unsafe.class.getDeclaredField("theUnsafe");
                field.setAccessible(true);
                unsafe = (Unsafe) field.get(null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static long addressOf(Object o) throws Exception {
    
            Object[] array = new Object[] { o };
    
            long baseOffset = unsafe.arrayBaseOffset(Object[].class);
            //arrayBaseOffset方法是一个本地方法,可以获取数组第一个元素的偏移地址
            int addressSize = unsafe.addressSize();
            long objectAddress;
            switch (addressSize) {
                case 4:
                    objectAddress = unsafe.getInt(array, baseOffset);
                    //getInt方法获取对象中offset偏移地址对应的int型field的值
                    break;
                case 8:
                    objectAddress = unsafe.getLong(array, baseOffset);
                    //getLong方法获取对象中offset偏移地址对应的long型field的值
                    break;
                default:
                    throw new Error("unsupported address size: " + addressSize);
            }
            return (objectAddress);
        }
    
        public static void main(String... args) throws Exception {
            Object mine = "Hello world".toCharArray(); //先把字符串转化为数组对象
            long address = addressOf(mine);
            System.out.println("Addess: " + address);
    
            // Verify address works - should see the characters in the array in the output
            printBytes(address, 27);
        }
    
        public static void printBytes(long objectAddress, int num) {
            for (long i = 0; i < num; i++) {
                int cur = unsafe.getByte(objectAddress + i);
                System.out.print((char) cur);
            }
            System.out.println();
        }
    }
    

     

    展开全文
  • java中内存中的对象地址是可变的,所以获得的内存地址有可能会...要获得内存地址也只能通过Unsafe的方法来获得,如下代码片段: package cn.outofmemory.test; import java.lang.reflect.Field; import sun...

    在java中内存中的对象地址是可变的,所以获得的内存地址有可能会变化。要获得内存地址也只能通过Unsafe的方法来获得,如下代码片段:

    package cn.outofmemory.test;
    
    import java.lang.reflect.Field;
    
    import sun.misc.Unsafe;
    
    public class Addresser
    {
        private static Unsafe unsafe;
    
        static
        {
            try
            {
                Field field = Unsafe.class.getDeclaredField("theUnsafe");
                field.setAccessible(true);
                unsafe = (Unsafe)field.get(null);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    
        public static long addressOf(Object o)
        throws Exception
        {
            Object[] array = new Object[] {o};
    
            long baseOffset = unsafe.arrayBaseOffset(Object[].class);
            int addressSize = unsafe.addressSize();
            long objectAddress;
            switch (addressSize)
            {
                case 4:
                    objectAddress = unsafe.getInt(array, baseOffset);
                    break;
                case 8:
                    objectAddress = unsafe.getLong(array, baseOffset);
                    break;
                default:
                    throw new Error("unsupported address size: " + addressSize);
            }       
    
            return(objectAddress);
        }
    
        public static void main(String... args)
        throws Exception
        {   
            Object mine = "Hi there".toCharArray();
            long address = addressOf(mine);
            System.out.println("Addess: " + address);
    
            //Verify address works - should see the characters in the array in the output
            printBytes(address, 27);
    
        }
    
        public static void printBytes(long objectAddress, int num)
        {
            for (long i = 0; i < num; i++)
            {
                int cur = unsafe.getByte(objectAddress + i);
                System.out.print((char)cur);
            }
            System.out.println();
        }
    }



    转载于:https://my.oschina.net/u/1377774/blog/419281

    展开全文
  • 当我们用java创建一个带有new关键字的对象时,我们从OS获取一个内存地址。当我们写out.println(objName)时,我们可以看到一个"特殊"字符串作为输出。我的问题是:这是什么输出?如果它是操作系统给我们的内存地址:a...
  • java对象的内存地址与hashcode值关系

    千次阅读 2020-05-19 12:44:57
    为了比较java对象的内存地址与hashcode的关系,必须想办法获取这两...要获得内存地址也只能通过Unsafe的方法来获得,具体下看的代码 package com.test.democlass; import sun.misc.Unsafe; import java.lang.re...
  • 2、接下来就可以获得网卡物理地址方法代码。3、然32313133353236313431303231363533e4b893e5b19e31333431363639后得到获得机器IP地址方法代码。4、然后得到获得机器子网掩码方法代码。5、然后得到获得机器默认网关...
  • 根据JVM如何使用内存(32位地址,32位索引,32位索引与偏移量,64位地址)可能会影响对象索引的有用性。这里是一个程序,假设您在64位JVM中具有32位索引。import sun.misc.Unsafe;import java.lang.reflect.Field;...
  • 当一个对象通过new关键字或通过其他方式创建后,对象从堆中获得内存。当对象不再使用了,被当做垃圾回收掉后,这些内存又重新回到堆内存中。要学习垃圾回收,请阅读”Java中垃圾回收的工作原理”。Java堆内存(heap ...
  • java虚拟机内存布局

    2017-02-13 22:26:00
    java虚拟机运行时数据区: java虚拟机在执行java程序时,将其所管理的内存,...1.程序计数器:当前线程执行字节码的行号指示器,保存cpu执行当前指令的地址,cpu从程序计数器中获得指令的执行地址,程序计数器便...
  • 转载地址:http://www.importnew.com/1305.html 原文于2008年11月13日 ...学C/C++出身的我,对Java有一点非常困惑,那就是缺乏计算对象占用内存大小的机制。而在C++中就可以通过sizeof运算符来获得基本类型以及类...
  • Java如何获得文件在硬盘上存储的物理地址,如何获得数据在内存中的物理地址
  • 当一个对象通过new关键字或通过其他方式创建后,对象从堆中获得内存。当对象不再使用了,被当做垃圾回收掉后,这些内存又重新回到堆内存中。要学习垃圾回收,请阅读”Java中垃圾回收的工作原理”。如何增加Java堆...
  • Java对象内存结构

    2016-02-03 15:07:00
    转载地址:...学C/C++出身的我,对Java有一点非常困惑,那就是缺乏计算对象占用内存大小的机制。而在C++中就可以通过sizeof运算符来获得基本类型以及类实例的大小。C和C++中的这个...
  • java 内存机制 jvm

    2018-12-06 16:45:44
    pc寄存器:用于记录线程当前执行的内存地址 (java 是多线程的 当线程a 失去执行权后 再次获得执行权时 java 需要知道 a线程执行到了哪一步代码 也就是 内存地址)。 本地方法栈:本地方法栈 又叫做 c栈 用于 跟踪...
  • 浅谈Java内存

    2014-03-30 19:48:50
    当一个对象通过new关键字或通过其他方式创建后,对象从堆中获得内存。当对象不再使用了,被当做垃圾回收掉后,这些内存又重新回到堆内存中。   二.如何增加Java堆空间? 在大多数32位机、...
  • java内存机制

    2016-11-22 17:18:32
    java内存机制主要分为两种,一种叫做堆内存,一种叫做栈内存。那么他们分别是用来存储什么的呢? 栈内存主要是用来存储我们的引用变量的,什么是引用变量呢?很简单比如List a=new ArrayList()中a就是我们的引用...
  • Java内存的10个要点

    2019-07-29 18:09:35
    当一个对象通过 new 关键字或通过其他方式创建后,对象从堆中获得内存。当对象不再使用了,被当做垃圾回收掉后,这些内存又重新回到堆内存中。要学习垃圾回收,请阅读”Java 中垃圾回收的工作原理”。 ...
  • 内存地址可能是无序的,栈内存通常会有后进先出的规则(思考方法的执行原理).b.堆内存:使用new关键词获得的内存,c.栈内存1.类的信息(方法信息,以及静态变量)2.类实例对象中的定义的变量示例说明:ArrayList list = ...
  • 而共享内存和访问它的所有应用程序均同处于用户空间,应用进程可以通过地址映射的方式直接读写内存,从而获得非常高的通信效率。在GNU/Linux中所有的进程都有唯一的虚拟地址空间,而共享内存应用编程接口API允许一个...
  • Java内存的十个要点

    2016-12-30 10:32:00
    当一个对象通过new关键字或通过其他方式创建后,对象从堆中获得内存。当对象不再使用了,被当做垃圾回收掉后,这些内存又重新回到堆内存中。要学习垃圾回收,请阅读”Java中垃圾回收的工作原理”。 如何增加Java堆...
  • JAVA内存和垃圾回收

    2012-02-20 13:36:59
    当一个对象通过new关键字或通过其他方式创建后,对象从堆中获得内存。当对象不再使用了,被当做垃圾回收掉后,这些内存又重新回到堆内存中。要学习垃圾回收,请阅读”Java中垃圾回收的工作原理”。 如何增加Java...
  • Java虚拟机Java内存管理机制,虚拟机执行子系统,程序编译与代码优化,高效并发。...当CPU要执行指令时,需要从程序计数器中获得指令所存储单元的地址,再得到指令。由于再任意时刻,一个CPU只...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 328
精华内容 131
关键字:

java获得内存地址

java 订阅