java 内存类_Java学习——类的生命周期和内存
常识是本能,有足够的常识便是天才。——肖伯纳
一、类的生命周期
类的生命周期:1.加载:将二进制流加载进来.class
2.连接:
验证:确保加载进来的数据不会损害虚拟机
准备:为类变量分配内存,附默认值
解析:符号引用转化为直接引用3.初始化:将静态信息赋值
静态代码块在类初始化时执行,类初始化只初始化一次
4.对象实例化:
4种方法:
new()创建
clone()创建,需要类实现 Cloneable 接口
通过反射机制创建
将一个对象实例化后,进行序列化,再反序列化
创建对象的过程:
Student s1=new Student();
1.加载类
2.在堆中为对象分配一块内存
3.为各个属性赋默认值
4.为各个属性附具体的值
5.执行构造块
6.执行构造器
7.s1与对象连接上
5.垃圾收集(GC):
发现无用信息对象;
回收被无用对象占用的内存空间,使该空间可被程序再次使用。
finalize():垃圾回收前做一些重要工作
System.gc():启动一个垃圾回收器,但是java语言规范并不保证GC一定会执行
6.卸载:
当类对象不再被引用,对象就会结束生命周期,类在方法区内的数据也会被卸载, 从而结束类的声明周期。
这里着重看一下类的初始化:
静态代码块(类加载时就执行)
初始化块(类对象创建后,就执行)
构造方法(创建相对应类对象·,就执行)
实践代码,搓搓小手动起来(=!=):
public class ChuShiHua {
int c;
static int a=10;//静态属性
//静态代码块(类加载时就执行)
static {
System.out.println("hello"+a);//hello10
a++;
}
static int b=9;
//初始化块(类对象创建后,就执行)
{
System.out.println("b++:"+ b++);
System.out.println("b:"+b);
System.out.println("++b:" + ++b);
System.out.println("d:"+d);
}
static int d=11;
//无参构造方法(创建无参类对象·,就执行)
public ChuShiHua(){
System.out.println("c+a :" + c+a);
}
//主函数
public static void main(String[] args) {
System.out.println("ChuShiHua.a :"+ ChuShiHua.a);
ChuShiHua t1=new ChuShiHua();
}
}
输出结果图片:
二、内存
不管你是要创建变量还是对象在内存里面都会开辟内存空间。
JVM的内存可分为:堆(heap)、虚拟机栈(stack)和方法区(静态区),程序计数器,本地方法栈堆:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息(class的目的是得到操作指令)
2.jvm只有一个堆区(heap),且被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身和数组本身;
虚拟机栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型本身和自定义对象的引用;
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问;
3.栈分为3个部分:局部变量表、执行环境上下文、操作指令区(存放操作指令);
方法区(静态区):
被所有的线程共享,方法区包含对Class的引用,
类变量,常量,方法。常量池和运行时常量池。
本地方法栈:
功能与虚拟机栈类似,不过虚拟机栈是为java服务的,而本地方法栈是为native方法服务的。
程序计数器:
记录的是当前线程所执行的字节码的行号指示器。
不管你是要创建变量还是对象在内存里面都会开辟内存空间
他们之间的关联是通过内存地址进行关联的
变量:
int a = 10;
1.为变量a在栈区开辟一个内存空间
2.将常量10存放在常量池中并创建内存地址0x0031
3.将常量10的内存地址赋值给变量a的内存空间
4.变量a指向常量10
如下图:
对象:
Student s = new Student();
1.将Student.class文件加载进内存
2.为变量a在栈中开辟一个内存空间
3.为对象在堆中开辟内存空间并分配内存地址
4.将属性放到堆中,并进行默认初始化
5.调用对应的构造方法进行对象初始化,并初始化完毕
6.将对象的内存地址赋值给a,让变量a指向对象
如下图:
今天学习分享的内容到此为止了,本是想要激励自己学下去,但发现快乐更是知识在于分享!
作为初学者对于Java的理解实在浅薄,如有错误请指正,万分感谢!
java 内存类_Java学习——类的生命周期和内存相关推荐
- java中线程的生命周期_Java中的线程生命周期– Java中的线程状态
java中线程的生命周期 Understanding Thread Life Cycle in Java and Thread States are very important when you a ...
- Java中的垃圾回收与对象生命周期
转载自 Java中的垃圾回收与对象生命周期 1. 垃圾回收 垃圾回收是Java程序设计中内存管理的核心概念,JVM的内存管理机制被称为垃圾回收机制. 一个对象创建后被放置在JVM的堆内存中,当永远 ...
- Java并发编程|第二篇:线程生命周期
文章目录 系列文章 1.线程的状态 2.线程生命周期 3.状态测试代码 4.线程终止 4.1 线程执行完成 4.2 interrupt 5.线程复位 5.1interrupted 5.2抛出异常 6. ...
- day4 vue 学习笔记 组件 生命周期 数据共享 数组常用方法
系列文章目录 day1学习vue2笔记 vue指令 day2 学习vue2 笔记 过滤器 侦听器 计算属性 axios day3 vue2 学习笔记 vue组件 day4 vue 学习笔记 组件 生命 ...
- Java 多线程(三) 线程的生命周期及优先级
Java 多线程(三) 线程的生命周期及优先级 线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: ...
- java 类加载生命周期_Java类的加载与生命周期
一.概要: 类的生命周期从类的 加载.连接.初始化 开始,到类的 卸载结束: 二.几个阶段: 加载:查找并加载类的二进制数据.(把类的.class文件的二进制数据读入内存,存放在运行时数据区的方法区: ...
- java calendar赋值_Java calendar类学习笔记
Java Calendar类 calendar类是abstract类,实际使用时实现特定的子类对象 创建一个代表当前日期的Calendar对象 Calendar ss=Calendar.getlnst ...
- java 抽象类 模板_Java学习day21-抽象类(abstract class)和模板设计模式(TemplateMethod)...
一.抽象类(abstract class) 1.随着继承层次中一个个新子类的定义,类变的越来越具体,而父类则更一般.更通用.类的设计应该保证父类和子类能够共享特征.有时需要将一个父类设计的非常抽象,以 ...
- java常用class类_java常用类
java常用类 内部类 1.成员内部类:在一个类的内部定义一个完整的类 例如:外部类public class Body{ 内部类class Header{ } } 内部类可以直接访问外部类的私有成员, ...
最新文章
- jquery 总结
- ECCV 2018 | 美图云联合中科院提出基于交互感知注意力机制神经网络的行为分类技术...
- ef mysql db first_Net Core使用EF之DB First
- Linux RAID磁盘阵列
- tomcat中conf\Catalina\localhost目录下的J2EE项目META-INF配置文件
- eas之Uuid和BOSUuid 区别
- 因多年不受重视,研究员公开2个未修复 Tor 0day且承诺再放3个
- if....else的基本用法
- Linux文本处理(grep,sed)
- 利用c语言编制1个程序,实现对给定语法句子的递归下降分析.,递归下降语法分析 - osc_3ubrwgtm的个人空间 - OSCHINA - 中文开源技术交流社区...
- c语言实验作业,C语言实验报告experience_c语言实验报告结果分析
- CMPP3.0状态报告状态码
- 单细胞分析:细胞聚类(十)
- TC275——04Blinky-LED
- 【iOS】—— 懒加载
- 书生电子合同_部编版一年级语文上册写字表生字组词汇总【有电子版】
- RT-Thread 入门学习笔记 - 熟悉邮箱rt_mailbox的使用
- 程序员的鄙视链,写得竟然有些真实!|每日趣闻
- 北大igem生物计算机,北京大学iGEM团队在国际大赛中取得优异成绩
- Vijos 1166题:木牛流马
热门文章
- UBUNTU无法播放mp4格式电影的烦恼-是否可行待验证
- MySQL存储过程之代码块、条件控制、迭代
- python3.6执行pip3时 Unable to create process using ''
- PAT甲级1009 Product of Polynomials:[C++题解]多项式乘法、高精度乘法
- 中国人民大学_《组织行为学》_15如何降低集体决策的风险?
- php如何获取js文本框内的内容,js获取input标签的输入值(实例代码)
- 用计算机怎么开5次方,用科学计算器来求三的五次方的值,按键顺序是( )?
- java paint方法哪个周期调用_关于一段java程序的小问题,paint函数是什么时候执行的,没有调用啊...
- rabbitmq python amqp user_python 与rabbitmq
- z390可以装服务器系统吗,z390主板如何装win10系统 有什么方法