`

day_36Java对象内存管理

阅读更多

星期二, 十二月 08, 2015  21:20:12

 

对象内存管理

 

一、对象内存管理

       1.编译好的java程序需要运行在jvm中。

       2.程序,无论代码还是数据,都需要存储在内存中。

           jvm为java程序提供并管理所需要的内存空间。

        3.jvm内存分为“堆”、“栈”、“方法区”三个区域,分别用于存储不同的数据。

 

二、堆内存

 

    1.对象存储在堆中

         1.1 jvm在其内存空间开辟一个称为“堆”的存储空间;

         1.2这部分空间用于存储使用new关键字所创建的对象。

    2.成员变量的生命周期

         2.1 访问对象需要依靠引用变量

         2.2当一个对象没有任何引用时,被视为废弃的对象,属于被回收的范围。

              该对象中的所有成员变量也随之被收回。

    2.3成员变量的生命周期为:

         从对象在堆中创建开始到对象从堆中被收回结束。

         Cell c = new Cell();

         c = null;//不再指向刚分配的对象空间,成员变量失效。

 

   3.垃圾回收机制

 

        3.1垃圾回收器GC,是jvm自带一个线程(自动运行着的程序),用于回收没有任何指向的对象。

        3.2java程序员不用担心内存管理,因为垃圾收集器会自动进行回收管理。

 

    4.java程序中的内存泄露问题

          4.1内存泄露是指: 不再使用的内存没有被及时回收。严重的内存泄露会因过多的内存占用而导致程序的崩溃。

          4.2GC线程判断对象是否可以回收的依据是否有引用指向,因此,当确定该对象不再使用时,

           应该及时将其引用设置为null。

 

   5.System.gc()方法

        5.1 GC的回收对程序员来说是透明的,并不一定一发现有无引用的对象,就立刻回收。

        5.2 一般情况下,当我们需要GC线程即刻回收无用对象时,可以调用System.gc()方法。

        5.3System.gc()用于建议虚拟机马上调度GC线程回收资源,具体的实现策略取决于不同的JVM系统。

 

三、栈

 

1.栈用于存放方法中的局部变量

         1.1 JVM在其内存空间开辟一个称为"栈"的存储空间;

          1.2这部分空间用于存储程序运行时在方法中声明的所有局部变量。

        例如:main()方法中有以下代码:

          Cell c = new Cell();

          int num = 5;

        栈内存: 5,40DF   堆内存:被40DF指向的对象

 

2.局部变量的生命周期

        2.1一个运行的java程序从开始到结束会有多次方法的调用,

        jvm会为每一个方法的调用在栈中分配一个对应的空间,这个空间被称为该方法的栈帧。

        2.2一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数、局部变量等数据。

        当某一个方法调用完成后,其对应的栈帧将被清除,局部变量失效。

 

3成员变量和局部变量

        3.1差别:

            3.1.1 局部变量

              定义在方法中; 没有默认值,必须自行设定初始值;方法调用时,存在栈中,方法调用结束,从栈中清除。

            3.1.2成员变量

             定义在类中,方法外;有默认初始值,可以不显示初始化;所在类被实例化后,存在堆中,对象被回收时,成员变量失效。

 

四、方法区

 

1. 方法区用于存放类的信息

          1.1方法区用于存放类的信息,java程序运行时,首先会通过类装载器载入类文件的字节码信息,经过解析后将其装入方法区。

                  类的各种信息(包含方法)都在方法区存储。

         1.2.Cell c = new Cell();Cell类首先被装载到jvm的方法区,其中包括类的基本信息和方法定义等。

 

2.方法只有一份

         2.1当类的信息被加载到方法区时,除了类的类型信息以外,同时类内的方法定义也被加载到方法区;

         2.2类在实例化对象时,多个对象会拥有各自在堆中的空间,但所有实例化对象时共用在方法区中的一份方法定义的。

 

星期二, 十二月 08, 2015  21:56:31 

 

0
0
分享到:
评论

相关推荐

    corejava笔记

    Core Java Day01 2011/10/9 ==================== 1 面向对象(OO) 2 Java 类型, 引用变量 与 堆对象 案例: 平面绘图坐标系中的一个点(Point),定义合理的属性 坐标是int类型. O+-----------------------------...

    javaee_tedu_day09.zip

    ==比较两个对象的内存地址 如果想表示对象的内容相同,返回true,则重写此方法 hashCode 返回一个hash code码,Integer,内存地址有关的hash算法 如果equal返回true的话,hashCode相同,重写hashCode方法

    python基础学习day02.txt

    python 的自动化的内存管理用'引用计数'(refrence count) is / is not 作用: 判断两个对象是否是同一个对象 id(obj) 返回对象的内存地址 del 语句 删除变量 复合赋值运算符 a += 10

    杰普学习corejava总结笔记

    2.构造器执行顺序 1.类加载,同时初始化类中静态... 3:toUpperCase()方法是String对象的一个方法,作用是将字符串的内容全部转换为大写并返回转换后的结果(String类型)。 4:String类型不能进行减(-)运算,错误。

    java经典面试2010集锦100题(不看你后悔)

    C) Java中的封装就是将对象的数据和操作数据的方法相结合,通过方法将对象的数据和实现细节保护起来。 D) Java语言中的多态的含义可以表达为:对外一个接口,内部多种实现。Java语言支持两种多态:运行时多态和编译...

    整理后java开发全套达内学习笔记(含练习)

    Object [java] 对象 ['ɒbdʒekt] Overload [java] 方法的重载(不同参数列表的同名方法) [,әuvә'lәud] Override [java] 方法的覆盖(覆盖父类的方法) [,әuvә'raid] polymiorphism[java] 多态 (polymorphism ...

    python学习day06.txt

    Day05回顾 1、json模块 1、json.loads() json格式(对象、数组) -> Python(字典、列表) 2、json.dumps() Python(字典、元组、列表) -> json(对象、数组) 2、Ajax动态加载 1、抓包工具抓参数 :WebForms -> ...

    day020-继承加强和设计模式代码和笔记.rar

    将生产和消费分离(解耦),即创建对象和使用对象的功能分离,便于管理 缺点: 1.扩展性弱,如果添加了新的产品,则需要修改工厂方法 使用场景: 适用于产品数量较少,且不经常改变的情况 ...

    day018-File类代码以及笔记.rar

    从内存到硬盘就是输出流Output 从硬盘到内存就是输入流Input IO操作的最基础的是文件File 2. File 1. 概念:就是java中的一个文件或者文件夹。如果没有后缀就表示是一个文件夹,如果有后缀就表示文件...

    python多线程DAY03.txt

    1. 进程对象属性 p.pid p.name p.is_alive() p.daemon 2. 自定义进程类 继承Process 重写run 3. 进程池 大量进程事件需要频繁创建删除进程 Pool() apply_async() close() join() map() 4.进程间通信 ...

    Oracle9i的init.ora参数中文说明

    说明: 与 NLS_TIME_TZ_FORMAT 相似, 其中的一对值指定 TIMESTAMP 数据类型的默认值, 该类型除存储 YEAR, MONTH 和 DAY 日期值, HOUR, MINUTE 和 SECOND 时间值, 还存储 TIMEZONE_HOUR 和 TIMEZONE_MINUTE。...

    Day02JavaSE基础(前言+基础语法)

    没有内存管理(可自行释放,不过速度较慢) 真正的可移植性,编写一次,到处运行(借助于JVM虚拟机)Write once, run anywhere. 面向对象 类型安全 高质量的类库 高性能、分布式、动态性(反射机制)、多线程、健壮...

    2020/2/19学习笔记-day01

    java-day01 早上 第一节课 课程体系介绍 XML: 1、两个系统进行对接(如java与c++),可以通过XML。它是数据的载体,数据通过XML进行传输 2、系统的配置信息 ​ OOAD:面向对象设计分析 ​ UML:统一建模语言 用...

    ZendFramework中文文档

    3.2.2. 高级使用:持久一个 DbTable 结果对象 3.2.3. 高级用法示例 3.3. 摘要式认证 3.3.1. 简介 3.3.2. 规范(Specifics) 3.3.3. 身份(Identity) 3.4. HTTP 认证适配器 3.4.1. 简介 3.4.2. 设计回顾 ...

    Day 24反射

    Day 24 1. 反射 1.1 Java文件和.class文件的关系 Java文件 Java文件中包含代码的所有内容 .class文件 .java文件通过javac编译工具生成对应的.class字节码文件 包含 Class 完整的包名,类名 Field 成员变量...

    python学习Numpy基础,数据分析 day01.zip

    数据分析 Numpy+Scipy+Matplotlib+Pandas 基础数值算法 科学计算 数据可视化 序列高级函数 一、numpy是什么? 1.Numerical Python,数值的Python,补充了Python...将实际数据与元数据分开存放,一方面提高了内存空间

    python学习Numpy基础,数据分析 day02.zip

    数据分析 Numpy+Scipy+Matplotlib+Pandas 基础数值算法 科学计算 数据可视化 序列高级函数 一、numpy是什么? 1.Numerical Python,数值的Python,补充了Python...将实际数据与元数据分开存放,一方面提高了内存空间

    python学习Numpy基础,数据分析 day07.zip

    数据分析 Numpy+Scipy+Matplotlib+Pandas 基础数值算法 科学计算 数据可视化 序列高级函数 一、numpy是什么? 1.Numerical Python,数值的Python,补充了Python...将实际数据与元数据分开存放,一方面提高了内存空间

    python学习Numpy基础,数据分析 day05.zip

    数据分析 Numpy+Scipy+Matplotlib+Pandas 基础数值算法 科学计算 数据可视化 序列高级函数 一、numpy是什么? 1.Numerical Python,数值的Python,补充了Python...将实际数据与元数据分开存放,一方面提高了内存空间

    python学习Numpy基础,数据分析 day03.zip

    数据分析 Numpy+Scipy+Matplotlib+Pandas 基础数值算法 科学计算 数据可视化 序列高级函数 一、numpy是什么? 1.Numerical Python,数值的Python,补充了Python...将实际数据与元数据分开存放,一方面提高了内存空间

Global site tag (gtag.js) - Google Analytics