对象内存管理介绍

  • 编译好的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. maven项目资源导出问题

    maven由于他的约定大于配置,我们之后可以能遇到我们写的配置文件,无法被导出或者生效的问题,解决方案: <!--在build中配置resources,来防止我们资源导出失败的问题--> ...

  2. IDEA2021 在jsp文件中 写out报错

    报错原因: 是因为没有关联好服务器: 解决方案 File --> Project structure --> Modules --> 选中当前的模板 --> Dependenc ...

  3. 学习使用数据库SQLServer (一)

    小记一下学习使用数据库时遇到的问题 1.建表时未设置主键约束名,此时删表主键会遇到困难,不能简单使用 ALTER TABLE NAME DROP CONSTRAINT 约束名: 而是要先找到数据表中主 ...

  4. CF1338E JYPnation

    题意:给定一个竞赛图,且其中不包含任意一组三元环 $(a, b, c)$,满足 $a \to d$,$b \to d$,$c \to d$,求每个点两两之间的距离之和(若无法达到即为 $614n$). ...

  5. The Ultimate Guide to Dynamics 365 Pricing and Licensing

        Microsoft Dynamics 365 integrates powerful ERP and CRM capabilities in the cloud to provide busi ...

  6. 006Java程序运行机制

    006Java程序运行机制 高级程序语言分为编译型和解释型两种,Java这两种特性都具备. 编译型还是解释型取决于翻译的时机. 以看一本外语书为例: 编译型:先把整本书翻译成中文版再看. 解释型:请个 ...

  7. C#中Socket连接请求的超时设置

    C#中Socket连接请求的超时设置 <转载> C#中, 对于Socket的请求,无论是同步还是异步,都没有提供超时机制,SendTimeout,ReceiveTimeout均无用.. 对 ...

  8. JavaScript 字符串的相关方法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. LVS负载均衡 2022年4月

    1. 负载均衡技术简介 2 1.1 负载均衡类型3 1.2 LVS简介4 1.3 Keepalived简介5 2. 负载均衡搭建主要步骤 6 2.1 LVS+Keepalived的负载均衡系统搭建6 ...

  10. layui使用OSS上传

    1.首先要把aliyun-oss-sdk.js包下载下来,放到指定的目录下面  在要用的页面引入或者在index.html入口文件全局引入: <script src="util/ali ...