码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • java对象以及引用方式


    目录

    java对象组成部分

    JOL(java object layout)java对象布局

    java中的四种引用

    java设计这四种引用的主要目的

    强引用

    软引用

    弱引用

    虚引用

    java对象组成部分

    对象头:(由2部分组成)

    • 第一部分:存储对象自身的运行时数据:哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一般占32/64 bit)。
    • 第二部分:是指针类型:指向对象的类元数据类型(即对象代表哪个类)。如果是数组对象,则对象头中还有一部分用来记录数组长度。

    实例数据:实例数据用来存储对象真正的有效信息(包括父类继承下来的和自己定义的)
    对齐填充:JVM要求对象起始地址必须是8字节的整数倍(8字节对齐)

    JOL(java object layout)java对象布局

    使用:导包

    1. org.openjdk.jol
    2. jol-core
    3. 0.16

    1.解析这个对象,将其转变为可以打印的格式在把他打印出来(查看对象内部信息)

    1. Object o=new Object();
    2. System.out.println(ClassLayout.parseInstance(o).toPrintable());

    控制台打印: 

    1. java.lang.Object object internals:
    2. OFF SZ TYPE DESCRIPTION VALUE
    3. 0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)
    4. 8 4 (object header: class) 0x200001e5
    5. 12 4 (object alignment gap)
    6. Instance size: 16 bytes
    7. Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

     2.查看对象外部信息(包括引用对象)

    System.out.println(GraphLayout.parseInstance(o).toPrintable());

    控制台打印

    1. java.lang.Object@60e53b93d object externals:
    2. ADDRESS SIZE TYPE PATH VALUE
    3. d6382698 16 java.lang.Object (object)
    4. Addresses are stable after 1 tries.

    查看对象占用空间总大小

    System.out.println(GraphLayout.parseInstance(o).totalSize());

    java中的四种引用

    1. 强引用(开发中用到最多)
    2. 软引用
    3. 弱引用
    4. 虚引用

    java设计这四种引用的主要目的

    1. 可以让程序员通过代码的方式来决定某个对象的生命周期
    2. 有利于垃圾回收 

    强引用

    格式:Student student = new Student();

    理解:

    • 只要某个对象被强引用关联,那么jvm在内存不足的情况下宁愿抛出outofmemoryerror异常也不会回收此类对象
    • 若我们想要jvm回收此类被强引用关联的对象,我们可以显式的将其设置成null,那么jvm就会在合适的时间回收此类对象
    1. public class Test {
    2. public static void main(String[] args) {
    3. Student student = new Student();
    4. System.out.println(student.name);
    5. student=null;//只有将该对象置为null时才会被回收
    6. System.gc();
    7. }
    8. }
    9. class Student{
    10. String name="lili";
    11. //该方法用于回收资源,当System.gc();之后由垃圾回收器调用,用来回收垃圾
    12. @Override
    13. protected void finalize() throws Throwable {
    14. System.out.println("垃圾已被回收");
    15. }
    16. }
    1. lili
    2. 垃圾已被回收

    软引用

    格式:SoftReference sr = new SoftReference<>(new Student());

    获得软引用包裹的对象:Student student = sr.get();

    注意:java中使用softReference来表示软引用,如果某个对象与软引用关联,那么jvm只会在内存不足的情况下回收该对象,利用这个特性,软引用适合做缓存

    弱引用

    格式:WeakReference weakReference = new WeakReference<>(new Student());

    获得弱引用包裹的对象:Student student = weakReference.get();

    注意:java中使用WeakReference来表示弱引用,若某对象被弱引用关联,那么不管内存是否足够,只要发生GC,都会被回收 

    1. public class Test {
    2. public static void main(String[] args) {
    3. WeakReference weakReference = new WeakReference<>(new Student());
    4. System.out.println(weakReference.get());
    5. System.gc();
    6. System.out.println(weakReference.get());
    7. }
    8. }
    9. class Student{
    10. String name="lili";
    11. //该方法用于回收资源,当System.gc();之后由垃圾回收器调用,用来回收垃圾
    12. @Override
    13. protected void finalize() throws Throwable {
    14. System.out.println("垃圾已被回收");
    15. }
    16. }
    1. jvmm.Student@1b6d3586
    2. null
    3. 垃圾已被回收

    虚引用

    创建引用队列:ReferenceQueue ro = new ReferenceQueue<>();

    格式:PhantomReference ps = new PhantomReference<>(new Student(), ro);

    获得虚引用包裹的对象为空

    理解:java中使用PhantomReference来表示虚引用,虚引用就形同虚设,就像某个对象没有引用与之关联一样,在任何时候,都可能被垃圾回收器回收

    注意:

    • 虚引用必须与ReferenceQueue一起使用,当GC准备回收一个对象,如果发现它还有虚引用,就会在回收之前,把这个虚引用加入到与之关联的ReferenceQueue中。
    • 无法通过虚引用来获取对一个对象的真实引用。
    1. public class Test {
    2. public static void main(String[] args) {
    3. ReferenceQueue ro = new ReferenceQueue<>();
    4. PhantomReference ps = new PhantomReference<>(new Student(), ro);
    5. System.out.println(ps.get());//无法通过虚引用来获得对象的真实引用
    6. System.out.println(ro.poll());
    7. System.gc();
    8. while (true) {
    9. Reference poll = ro.poll();//移除并返回队列的头部元素,若为空,返回null
    10. if (poll != null) {
    11. System.out.println(poll);
    12. }
    13. }
    14. }
    15. }
    16. class Student {
    17. String name = "lili";
    18. }
      1. null
      2. null
      3. java.lang.ref.PhantomReference@1b6d3586

      由上可知在jvm进行gc之后,虚引用的对象进入了队列,然后jvm就可以通过这个队列检测到发生了垃圾回收,再进行堆外内存的处理 

    19. 相关阅读:
      算法与数据结构【30天】集训营——时间复杂度与空间复杂度(02)
      架构风格相关内容
      [附源码]java毕业设计医院挂号管理系统
      二、主流的架构方法论
      Canvas 获取文本宽度使用ctx.measureText
      随机分布式延迟PSO(RODDPSO)+K-Means算法(Python代码实现)
      Spark 基础知识点
      【EMC专题】案例:PCB走线参考平面不完整导致辐射超标
      缓冲区溢出漏洞的原理及其利用实战
      不同环境下RabbitMQ的安装-3 操作RabbitMQ
    20. 原文地址:https://blog.csdn.net/m0_60027772/article/details/126199471
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号