1 JVM内存

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

  1.1 堆

    JVM在其内存空间开辟一个称为”堆”的存储空间,这部分空间用于存储使用new关键字所创建的对象。

  1.2 栈

    JVM在其内存空间开辟一个称为”栈”的存储空间,这部分空间用于存储程序运行时在方法中声明的所有局部变量。

  1.3 方法区

    方法区用于存放类的信息,Java程序运行时,首先会通过类装载器载入类文件的字节码信息,经过解析后将其装入方法区,类的各种信息(包括方法)都在方法区存储。

2 对象的生命周期

  2.1 使用new运算符创建对象

    2.1.1 Java虚拟机先检查类是否加载, 如果没有加载就加载类信息到方法区

    2.1.2 根据类信息中的属性定义在堆内存中开辟存储空间, 并且每个属性有默认值

    2.1.3 调用构造器, 执行构造器中属性初始化过程, 构造器结束时候, 释放构造器中全部的局部变量

    2.1.4 new运算返回对象的引用(即:对象在堆中的地址)

  2.2 利用引用操作使用对象 - 使用引用操作对象: 访问对象的属性和方法. - 可以反复更改对象的属性状态.

  2.3 对象在不被引用时候被垃圾回收器回收 - 当一个对象不再被引用时候, 对象就称为内存垃圾. 内存垃圾在适当时候被垃圾回收器回收.

  2.4 注意

    2.4.1 对象生存期中构造器只能执行一次. 在对象生存期间, 可以反复调用其方法, 反复访问其属性.

    2.4.2 对象的属性随着对象在堆中分配.

  2.5 图片示意图

    

  2.6 代码实现

 public class Demo {
public static void main(String[] args) {
//对象的生命周期
Circle c1 = new Circle(3, 4, 5);
System.out.println(c1);
Circle c2 = new Circle(3, 4, 6);
System.out.println(c2);
//将引用赋值为null, 对象不再被引用
//对象变成内存垃圾, 将被垃圾回收器回收.
c1=null;
c2=null;
}
}
class Circle{
int x,y,r; public Circle(int x, int y, int r) {
this.x = x;
this.y = y;
this.r = r;
} public String toString() {
return x+","+y+","+r;
}
}

3 内存泄漏

  尽管Java的垃圾回收器可以回收堆内存, 但是当Java程序员操作对象不当时候, Java也会发生内存泄漏.

  3.1 什么情况下会发生内存泄漏

    应用程序大量创建对象, 并且保持这些对象的引用, 进而造成垃圾回收器不能有效释放对象占用的堆内存空间, 最终内存耗尽出现内存泄漏.

  3.2 避免内存泄漏的方法

    对象使用以后,及时将引用对象的引用变量赋值为null, 使对象变成垃圾对象, 及时被回收并且释放堆内存, 就可以避免内存泄漏.

  3.3 代码实现

 package cn.fury.day11;

 public class MemoryLeakDemo01 {
public static void main(String[] args) {
Foo[] ary = new Foo[40000000];
for(int i=0; i<ary.length; i++){
Foo f = new Foo();
// f = null;
ary[i] = f; // 创建了许多对象,并且将对象的引用(即:地址)放到了一个数组里面
}
}
}
class Foo{
int a;
int b;
int c;
}
/*
尽管Java的垃圾回收器可以回收堆内存, 但是当Java程序员操作对象不当时候, Java也会发生内存泄漏.
》何时发生内存泄漏: 应用程序大量创建对象, 并且保持这些对象的引用,
进而造成垃圾回收器不能有效释放对象占用的堆内存空间, 最终内存耗尽出现内存泄漏.
》避免内存泄漏的办法: 对象使用以后,及时将引用对象的引用变量赋值为null,
使对象变成垃圾对象, 及时被回收并且释放堆内存, 就可以避免内存泄漏.
*/

JVM的内存管理、对象的生命周期、内存泄漏的更多相关文章

  1. JVM类加载机制与对象的生命周期

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6536048.html  虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最 ...

  2. 管中窥豹——从对象的生命周期梳理JVM内存结构、GC调优、类加载、AOP编程及性能监控

    如题,本文的宗旨既是透过对象的生命周期,来梳理JVM内存结构及GC相关知识,并辅以AOP及双亲委派机制原理,学习不仅仅是海绵式的吸收学习,还需要自己去分析why,加深对技术的理解和认知,祝大家早日走上 ...

  3. [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. 第四章 Spring.Net 如何管理您的类___对象的生命周期链

    各位,实在不好意思,因为有事,博客几天没更新了.前面有童鞋提到,配置 Objects.xml 路径的相关问题,这些东西是 IResource 接口的一些内容.在下一章会详细介绍. 传统的Net应用中, ...

  5. Java 对象的生命周期

    Java对象的生命周期 在Java中,对象的生命周期包含下面几个阶段: 1.      创建阶段(Created) 2.      应用阶段(In Use) 3.      不可见阶段(Invisib ...

  6. Java虚拟机(三)垃圾标记算法与Java对象的生命周期

    前言 这一节我们来简单的介绍垃圾收集器,并学习垃圾标记的算法:引用计数算法和根搜索算法,为了更好的理解根搜索算法,会在文章的最后介绍Java对象在虚拟机中的生命周期. 1.垃圾收集器概述 垃圾收集器( ...

  7. 【转载】Java对象的生命周期

    Java对象的生命周期 在Java中,对象的生命周期包括以下几个阶段: 1.      创建阶段(Created) 2.      应用阶段(In Use) 3.      不可见阶段(Invisib ...

  8. 《深入理解Java虚拟机》 Java对象的生命周期

    Java虚拟机运行时数据区 方法区:存储 类信息.常量.静态变量.即使编译器编译后的代码等数据,也有别名叫做非堆.  方法区其中有包含有 运行时常量池,用于存放编译期生成的各种字面量和符号引用.其中, ...

  9. hibernate 持久化对象的生命周期 2.1

    持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...

随机推荐

  1. 交换排序—冒泡排序(Bubble Sort)算法原理以及Java实现

    基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将 ...

  2. nyoj-1099-Lan Xiang's Square(几何,水题)

    题目链接 /* Name:nyoj-1099-Lan Xiang's Square Copyright: Author: Date: 2018/4/26 9:19:19 Description: 给4 ...

  3. python 编码 —— codecs 库

    1. 对文件读写 import codecs fout = codecs.open('test.html', 'w', encoding='UTF-8') fout.write('<html&g ...

  4. c# Http请求之HttpClient

    利用HttpClient进行Http请求,基于此,简单地封装了下: using System; using System.Collections.Generic; using System.Colle ...

  5. 六、python沉淀之路--int str list tuple dict 重点总结

    一.数字int(..)二.字符串replace/find/join/strip/startswith/split/upper/lower/formattempalte = "i am {na ...

  6. H5移动端下html上传图片被旋转问题

    iOS下,html方式使用<input type="file">上传图片,图片会被旋转.遇到这个问题js是无法解决的,html也没有相应的解决方案.只能放到后台去处理, ...

  7. Eclipse之Web工程探究以及格式化

    1. 关于部署 只要配置了Web Deployment Assembly,可以不需要手工拷贝引用jar到/WEB-INF/lib里面了,之前失败是因为引用工程的output路径有问题导致的,修改完成后 ...

  8. MYSQLdump参数详解(转)

    mysqldump客户端可用来转储数据库或搜集数据库进行备份或将数据转移到另一个SQL服务器(不一定是一个MySQL服务器).转储包含创建表和/或装载表的SQL语句. 如果你在服务器上进行备份,并且表 ...

  9. SVN 服务器端的搭建-及多仓库管理-OK

    1.首先安装SVN这个软件 apt-get install subversion 2.在home目录下创建一个名为svn的文件夹(文件夹的名字随便起) mkdir /kk/svn/rda8501_co ...

  10. Azure VM复制

    目前Azure上复制VM可以有多种方法: 1 创建User Image,可以快速复制多台VM,但目前托管磁盘只支持Generalized的模式,需要对User和配置进行重置. 2 从VHD或托管磁盘复 ...