JVM的内存管理、对象的生命周期、内存泄漏
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的内存管理、对象的生命周期、内存泄漏的更多相关文章
- JVM类加载机制与对象的生命周期
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6536048.html 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最 ...
- 管中窥豹——从对象的生命周期梳理JVM内存结构、GC调优、类加载、AOP编程及性能监控
如题,本文的宗旨既是透过对象的生命周期,来梳理JVM内存结构及GC相关知识,并辅以AOP及双亲委派机制原理,学习不仅仅是海绵式的吸收学习,还需要自己去分析why,加深对技术的理解和认知,祝大家早日走上 ...
- [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 第四章 Spring.Net 如何管理您的类___对象的生命周期链
各位,实在不好意思,因为有事,博客几天没更新了.前面有童鞋提到,配置 Objects.xml 路径的相关问题,这些东西是 IResource 接口的一些内容.在下一章会详细介绍. 传统的Net应用中, ...
- Java 对象的生命周期
Java对象的生命周期 在Java中,对象的生命周期包含下面几个阶段: 1. 创建阶段(Created) 2. 应用阶段(In Use) 3. 不可见阶段(Invisib ...
- Java虚拟机(三)垃圾标记算法与Java对象的生命周期
前言 这一节我们来简单的介绍垃圾收集器,并学习垃圾标记的算法:引用计数算法和根搜索算法,为了更好的理解根搜索算法,会在文章的最后介绍Java对象在虚拟机中的生命周期. 1.垃圾收集器概述 垃圾收集器( ...
- 【转载】Java对象的生命周期
Java对象的生命周期 在Java中,对象的生命周期包括以下几个阶段: 1. 创建阶段(Created) 2. 应用阶段(In Use) 3. 不可见阶段(Invisib ...
- 《深入理解Java虚拟机》 Java对象的生命周期
Java虚拟机运行时数据区 方法区:存储 类信息.常量.静态变量.即使编译器编译后的代码等数据,也有别名叫做非堆. 方法区其中有包含有 运行时常量池,用于存放编译期生成的各种字面量和符号引用.其中, ...
- hibernate 持久化对象的生命周期 2.1
持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...
随机推荐
- ASP.NET Core 开源项目整理
前言: 对 .NET Core 的热情一直没有下降过,新起的项目几乎都是采用 Core 来做开发. 跨平台是一个方面,另外就是 Core 很轻,性能远超很多开发语言(不坑). 一.ASP.NET Co ...
- 面试题42:翻转单词顺序VS左旋转字符串
题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理. 例如输入字符串“I am a student.",则输出"stud ...
- BZOJ - 1036 树的统计Count (树链剖分+线段树)
题目链接 #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f; ],mx[ ...
- 反编译(javap)操作和可视化界面
1.反编译(javap)操作和可视化界面 演示:
- java06-数组动手动脑
1.阅读QiPan.java示例程序了解如何利用二维数组和循环语句绘制五子棋盘. 定义了一个私有的二维数组作为棋盘.并定义了长度.之后打印符号使之连接起来作为棋盘在控制台显示.建立缓冲区用来读取输入的 ...
- [独孤九剑]Oracle知识点梳理(七)数据库常用对象之Cursor
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- centos安装教程
centos7和6.x有很大的差别,在第一次安装的时候遇到了很多坑,一共安装了三次才成功 如果是用window自带的Hyper-v装centos时 安装包在\\10.10.10.1\ShareDo ...
- 了解Unity中的多线程及使用多线程
http://blog.csdn.net/hany3000/article/details/16917571 如果你想在游戏中使用多线程,你应该看看这篇文章,线程是一个相当复杂的话题,但如果你掌握了它 ...
- SQL Sever 学习系列之一
SQL Sever 学习系列之一 本学习系列,从实际工作需要中积累,对于一个新手而言,写出几条漂亮的查询语句,应该是可以受启发的. 一.问题的需求是:员工薪酬发放,现有资金能发放多少人,哪些人应得? ...
- Qt Creator 中的段落 注释的 快捷方法【转载】
原文网址:http://jingyan.baidu.com/article/d5c4b52bc2bd1dda560dc5bb.html 作为一名合格的程序员,漂漂亮亮的注释是必须的!!怎么在Qt Cr ...