JAVA初始化与清理

news/2024/7/20 12:47:53 标签: java, 内存管理, 堆栈

1.构造器:

这是一个在创建对象时被自动调用的特殊方法,确保初始化,java会在用户有能力操作对象之前自动调用相应的构造器,由编译器调用,与类名相同,无返回值。
(1)不接受任何参数的构造器叫做默认构造器。
(2)如果你没有定义构造器,编译器自动帮你创建默认构造器,但是如果你定义了构造器,编译器就不会再去创建默认构造器。

例子:

java">class Bird2{
   Bird2(int f){}
   Bird(double d){}
}
public class NoSynthesis{
    public static void main(String[] args){
       Bird2 b=new Bird2();//报错,没有默认构造器
       Bird2 b2=new Bird2(1);
       Bird2 b3=new Bird2(1.8);
      }
}

(3)除构造器之外,编译器禁止在其他任何方法中调用构造器。

2.this:

指出当前对象的引用 如 A a=new A();指出的就是引用a。

3.垃圾回收器:

垃圾回收器只会释放那些经由new分配的内存。

4.finalize()方法:

并非使用new获得的内存区域时,使用该方法释放内存,该区域主要指在java代码中调用了非java代码。也许会调用c的malloc()函数来分配空间,要释放空间得调用free(),但该方法是c、c++中才有的,所以在java中要使用finalize()。当垃圾回收器准备好释放对象占用的存储空间,将首先调用finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。在做清理工作时,我们可以在finalize()里加入某种擦除功能,当垃圾回收发生时,finalize()得到调用,数据就会被擦除,要是垃圾回收没有发生,数据就会保留。
(1)垃圾回收只与内存有关,也就是说使用垃圾回收器的唯一原因是为了回收程序不在使用的内存。无论是垃圾回收,还是终结,都不保证一定会发生。如果jvm并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。

5.垃圾回收器如何工作:

(1)停止-复制

先暂停程序的运行,然后将所有存活的对象从当前堆复制到另一堆,没有被复制的全是垃圾,当对象被复制到新堆时,它们是一个挨着一个的,所以新堆保持紧凑排列,然后就可以按像传送带一样的方法,每分配一个新对象,就往前移动一格,这样简单、直接地分配新空间了。当把对象从一处搬到另一处时,所有指向它的引用都必须修正。
缺点:效率会降低。原因是,首先,得有两个堆,然后在这两个分离的堆之间来回捣腾,从而得维护比实际需要多一倍的空间。第二个问题,是复制,如果程序只有少量垃圾,或者没垃圾,垃圾回收器仍然会将所有内存自一处复制到另一处,这很浪费。

(2)标记-清扫

虚拟机进行检查,要是没有新垃圾产生,就会转向这一方式,该方式速度相当慢,但是当你知道只会产生少量垃圾甚至不会产生垃圾时,它的速度就很快了。
该方式所依据的思路同样是从堆栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象,每当它找到一个存活对象,就会给对象设一个标记,这个过程中不会回收任何对象。只有全部标记工作完成的时候,清理才会开始。在清理过程中,没有标记的对象将会被释放,不会发生任何复制动作,所以剩下的堆空间是不连续的,垃圾回收器要是希望得到连续空间的话,就得重新整理剩下的对象。

内存会分配较大的“块”,停止-复制要把所有存活对象复制到新堆,会造成大量内存复制行为,有了块之后垃圾回收器,就可以往废弃的块里拷贝对象了,这种好处就是先将空间分配好,执行时,就不需要现去分配空间,减少时间,典型的空间换时间。

java实际垃圾清理是“自适应技术”:java虚拟机会进行监视,如果对象都很稳定,垃圾回收器的效率降低的话,就切换到“标记-清扫”方式,同样,java虚拟机会跟踪“标记-清扫”的效果,要是堆空间出现很多碎片,就会切换回“停止-复制”方式。

6.自动初始化:

如果没给基本类型的字段赋值,编译器会给其赋一个默认值,自动初始化会在构造器被调用之前执行。


http://www.niftyadmin.cn/n/902449.html

相关文章

SpringBoot开发:模板引擎Thymeleaf

目录 1. 引入2. 什么是模板引擎?3. Thymeleaf1. 简介2. 导入Thymeleaf3. 使用Thymeleaf4. 简单测试5. thymeleaf语法1、th属性2、标准表达式语法 本文主要介绍SpringBoot给我们推荐的Thymeleaf模板引擎,这是一个高级语言的模板引擎,语法更简…

数据库事务的四大特性和隔离级别

事务的特性(ACID) **事务:**把一组密不可分的操作系列集合在一起,这些操作要么全部执行,要么全部不执行。 原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务的操作要么都发生,要么都不发生. 一致性(Consistency):事务前后数…

Spring核心功能IOC和AOP详解

1、IOC和DI IOC: 控制反转 即控制权的转移,将我们创建对象的方式反转了,以前对象的创建是由我们开发人员自己维护,包括依赖关系也是自己注入。使用了spring之后,对象的创建以及依赖关系可以由spring完成创建以及注入,反转控制就是反转了对象…

U盘安装WIN10时显示 windows无法安装到这个磁盘 选中的磁盘采用GPT分区形式

安装操作win10操作系统的时候遇到这个问题,记录一下这个错误的解决办法。 错误:windows无法安装到这个磁盘 选中的磁盘采用GPT分区形式 解决办法: win8/win10系统均添加快速启动功能,预装的win8/win10电脑默认都是UEFI引导和GPT硬…

java.sql.SQLException: Access denied for user ‘‘@‘localhost‘ (using password: NO) 出现原因和解决办法

今天我在复习mysql数据库中,写JDBC测试代码的时候,在使用Junit测试运行程序的时候,遇到了这个错误:java.sql.SQLException: Access denied for user localhost (using password: NO) ,从该报错的字面意思就可以知道是没有使用数据可密码,但是…

IDEA中代码、单词大小写切换快捷键(开发中的小技巧)

在开发中很多时候会用到的小技巧 ctrshiftu

IDEA自动导包配置总结

IDEA实用功能之----自动导包设置 自动导包是什么意思? 原本我们在eclipse中,如果要引用一个方法,发现缺少这个方法所需要的包,需要手工去输入。 比如我们要用到FileInputStream流,需要在前面输入import java.io.* 而…

IntelliJ IDEA 项目文件旁边都有0%classes,0% lines covered

IntelliJ IDEA项目文件旁边都有0%classes,0% lines covered。 不知不小心点到哪里,idea项目里面的文件都有0%classes,0% lines covered这些东西,看着很不舒服. 解决方法: 按快捷键ctrl ALT F6弹出如下框, 取消勾选–>点击…