对象内存管理介绍

  • 编译好的java程序需要运行在JVM中;JVM为java程序提供并管理所需要的内存空间:“栈”、“堆”、“方法区”三个区域,分别用于存储不同的数据。

  • 存储new关键字所创建的对象。存储成员变量。

  • 访问对象需要一个引用变量,当一个对象没有任何的引用时,即视为被废的对象,属于被回收的范围,该对象中所有的成员变量也随之被垃圾回收机制回收。

  • 所以成员变量的生命周期:从对象在堆中创建开始到被垃圾回收机制回收结束。

  • 当你创建一个对象的时候,对象放在堆中,栈中存放了一个地址,地址指向对象,

  • 当创建基本数据类型时,直接在栈中存放。

  • 存储局部变量(在方法中声明的变量)
  • 一个java程序从开始到结束会有多次方法的调用;JVM会为每一个方法的调用在栈中分配一个对应的内存空间--栈帧;一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数、局部变量等数据,当某个方法调用完成后,其对应的栈帧被清除,局部变量失效

方法区

  • 存放类的相关信息,java程序运行时,首先会通过类加载器载入类文件的字节码文件信息,经过解析后将其装入方法区中,类的各种信息(包括方法、类的静态成员变量)都在方法区存储。
  • 类在实例化对象时,多个对象会拥有各自在堆中的空间,但所有实例对象是共用在方法区中一份方法定义的
  • 每个对象所共享的东西。

常量池

常量池分为两种:静态常量池和运行时常量池。

静态常量池

  • 静态常量池指的是在编译期确定,保存在class文件中的一些数据。
  • 常量池主要用于存放两大类常量:字面量(Literal)和符号引用量。
    • 字面量相当于Java语言层面常量的概念,如文本字符串、声明为final的常量值等。
    • 符号引用则属于编译原理方面的概念,包括了如下三种类型的常量:

      1、类和接口的全限定名;

      2、字段的名称和描述符;

      3、方法的名称和描述符。

运行时常量池

  • 在运行时常量池是方法区的一部分,在JDK1.7之后运行时常量池从方法区中移出,放在堆中。
  • 常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。

成员变量和局部变量的区别

  1. 普通成员变量是属于对象的,声明在类中,而局部变量是属于方法的。
  2. 成员变量有默认值(基本数据类型为...,引用数据类型默认值为null),局部变量没有默认值,在第一次使用时必须初始化。
  3. 生命周期不同。成员变量的生命周期:从对象在堆中创建开始到被垃圾回收机制回收结束;局部变量的生命周期:方法被调用开始到调用完成结束。

Java对象内存管理的更多相关文章

  1. Unit03 - 对象内存管理 、 继承的意义(上)

    Unit03 - 对象内存管理 . 继承的意义(上) 1.内存管理:由JVM来管理的  1)堆:    1.1)存储所有new出来的对象(包含成员变量)    1.2)没有任何引用所指向的对象就是垃圾 ...

  2. Java的内存管理与内存泄露

    作为Internet最流行的编程语言之一,Java现正非常流行.我们的网络应用程序就主要采用Java语言开发,大体上分为客户端.服务器和数据库三个层次.在进入测试过程中,我们发现有一个程序模块系统内存 ...

  3. 让你第一次认识到Java的内存管理

    发现之前写的可读性不好,这次准备试试换风格,去掉长篇大论,觉得这个风格好的,麻烦点个赞啦 清理.JVM的妙处 大家以后都是程序员,假设你很不幸,需要自己交钱租房子. 你作为一个小穷人,租的房子到期了( ...

  4. Java对象内存布局

    本文转载自Java对象内存布局 导语 首先直接抛出问题 Unsafe.getInt(obj, fieldOffset)中的fieldOffset是什么, 类似还有compareAndSwapX(obj ...

  5. Java对象内存模型

    2 Java对象内存模型 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 在 JVM ...

  6. Objective-C 【多个对象内存管理(野指针&内存泄漏)】

    ------------------------------------------- 多个对象内存管理(野指针&内存泄漏) (注:这一部分知识请结合"单个对象内存管理"去 ...

  7. Objective-C 【单个对象内存管理(野指针&内存泄露)】

    ------------------------------------------- 单个对象内存管理 (1)野指针 ①定义了一个指针变量,但是并没有赋初值,它随机指向一个东西 ②某指针变量指向的内 ...

  8. Ehcache计算Java对象内存大小

    在EHCache中,可以设置maxBytesLocalHeap.maxBytesLocalOffHeap.maxBytesLocalDisk值,以控制Cache占用的内存.磁盘的大小(注:这里Off ...

  9. JAVA 对象内存结构

    JAVA对象内存结构 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 对象头 markWo ...

  10. oc48--多个对象内存管理练习

    // // main.m // 多个对象内存管理练习 // // ARC是Xcode帮我们生成内存释放的代码,MRC是需要我买自己写retain和release.想研究内存管理只能在MRC,管理对象就 ...

随机推荐

  1. 网络同步时钟单路耐压测试突破17V

    自动同步标准化考场时钟系统------专业LED时钟厂家![点击进入] 一.网络同步时钟耐压测试作用概述: 同步时钟耐压试验是鉴定时钟绝缘强度和稳定性最直接的方法,它对于判断NTP同步时钟设备能否投入 ...

  2. Android studio Internet跳转活动

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  3. JAVA、Tomcat服务器

    JAVA如何配置服务器 Tomcat服务器: 1.Web开发中的常见概念: (1)B/S系统和C/S系统 Brower/Server:浏览器 服务器 系统 ----- 网站 Client/Server ...

  4. 查看mmdetection中模型的配置信息

    方法一 可以直接打开mmdetection中的目录查看,/configs目录下都是对应的模型的配置 示例: 可以找到_base_目录下的这四个文件文件查看配置. 方法二 读取配置文件查看 在命令行中输 ...

  5. 【Unity】利用C#反射打印类的字段信息

    最近在用protobuf-net序列化功能生成.bytes配置文件时,遇到了需要把.bytes配置文件再另外转成Lua配置文件(Lua配置表内容举例)的需求.Lua配置文件需要记录配置类的各个字段名和 ...

  6. MySQL代替in之临时表

    如果我们正常的使用IN去查询 SELECT * FROM a JOIN b ON a.id = b.id WHERE b.tag_id IN (1,2,3,4,5,6) 这种因为in里面的参数是连续的 ...

  7. Iview Table 图片、超链接

    columns = [ { title: "照片", key: "attach_url", align:'center', width: 170, render ...

  8. 一分钟教你分清各种光纤跳线接头(SC、ST、FC、LC、MPO)

    一分钟教你分清各种光纤跳线接头(SC.ST.FC.LC.MPO)  市场上常见的光纤跳线有以下几种接头:SC.ST.FC.LC.MPO,相信很多入门者和小编一样,面对各种英文缩写也是我只认识他们,却不 ...

  9. TP5.0--5.1获取当前域名的方法

    TP5.0获取当前域名的方法 use think\Request; $request = Request::instance(); $domain = $request->domain(); 获 ...

  10. TensorFlow安装填坑之路(Windows环境)

    最近跟着简单粗暴 TensorFlow 2中的教学活动ML Study Jam 2020学习TensorFlow,记录下在Windows环境中安装TensorFlow时遇到的那些坑. TensorFl ...