疯狂java读书笔记
java内存管理分为两部分:内存的分配与内存的回收
内存的分配:指创建java对象时,jvm为该对象在堆内存中所分配的内存空间。
内存的回收:指当该java对象失去引用,变成垃圾时,jvm的垃圾回收机制自动清理该对象,并回收该对象占用的内存。
jvm的垃圾回收机制由一条后台线程完成。
实例变量和类变量
java程序的变量大体可分为成员变量和局部变量。
其中局部变量有3类:形参、方法内的局部变量、代码块内的局部变量。
局部变量被存储在方法的栈内存中,生存周期都在相应的方法和代码块中,随方法和代码块的结束而消亡。
类内定义的变量被称为成员变量。没使用static修饰的称为成员变量,用到static修饰的称为静态变量或类变量。
(static的作用就是将实例成员变为类成员。使用static修饰,这些成员就属于类本身)
实例变量和类变量的属性
在同一个jvm中,每个类只对应一个Class对象,但每个类可以创建多个java对象。
因此同一个jvm中的一个类的类变量只需要一块内存空间;但对实例变量而言,该类没创建一次实例,就需要为该实例变量分配一块内存空间。
实例变量的初始化时机
对实例变量而言,它属于java对象本身,每次创建java对象时都需要为实例变量分配内存空间,并执行初始化。
从语法角度来看,程序可在三个地方对实例变量执行初始化:
1. 定义实例变量时指定初始值
2. 非静态初始块中对实例变量指定初始值
3. 构造器中对实例变量指定初始值
其中第1、2种方式比第三种方式更早执行,第1、2种方式执行的顺序与他们在源程序中的排列位置相关,在前面的先执行。
每当程序指定构造器来创建java对象时,该构造器必然会获得执行机会。与此同时,该类所包含的非静态初始化块 和 定义实例变量指定初始值也将会获得执行机会,并且总是在构造器执行之前获得执行。
定义实例变量时指定的初始值,初始块中为实例变量指定初始值的语句的地位是平等的,当经过编译器处理后,他们都将被提取到构造器中。也就是说,对于类定义中的语句:
double weight = 2.3
实际上会被分成如下2次执行:
1.double weight;创建java对象时系统根据该语句为该对象分配内存
2.weight = 2.3;这条语句将会被提取到java类的构造器中执行
类变量的初始化时机
类变量属于java类本身,只有当程序初始化该java类时才会为该类的类变量分配内存空间,并执行初始化。
从程序运行角度看,每JVM对一个java类只初始化一次,因此java程序每运行一次,系统只为类变量分配一次内存空间,执行一次初始化。
从语法角度看,程序可在2个地方对类变量执行初始化:
1.定义类变量时指定初始值
2.静态初始化块中对类变量指定初始值。
两种方式的执行顺序与他们在源程序中排列顺序相同。同样,程序先为所有类变量分配内存空间,在按源代码中两种方法的排列顺序执行相应的初始化值。
关于javap工具
jdk提供了javap工具,javap主要用于帮助开发者深入了解java编译器的机制,语法如下:
javap ···
该工具支持如下常用选项:
-c :分解方法代码,也就是显示每个方法具体的字节码。
-l :用于指定显示行号和局部变量列表
-public | protected | package | private :用于指定显示哪种级别的类成员,对应java的4种访问权限
-verbose :用于指定显示更进一步是详细信息
例子:如有一个JavapToolTest.java 的java类。
先将JavapToolTest.java 编译成 字节码形式,JavapToolTest.class 编译语句:javac JavapToolTest.java
然后就可以使用javap命令了 :javap -c JavapToolTest.class 就可以看到java的字节码信息
阅读(3610) | 评论(0) | 转发(0) |