Thinking in Java,Chapter 5,阅读笔记

  1. Java中的finalize()方法
    参考链接: https://blog.csdn.net/Justin_zhao/article/details/74358828
    垃圾回收

-Java的垃圾回收器只会释放由我们new出来的内存堆块,那些不是由new出来的“特殊内存”,垃圾回收器是不会管理的。
-所谓的特殊内存指通过JNI用C/C++向系统申请的内存,这些内存如果不手动去清除就会一直占据在内存中。
-而且,垃圾回收本身就有开销,所以虚拟机不会经常GC,只有当内存快要耗尽的时候JVM才会触发GC。
finalize()

-由上,Java中的对象并不一定会被全部垃圾回收,当你不想要该对象的时候,你需要手动去处理那些“特殊内存”,java中没有析构,所以提供了一个finalize()方法让我们来执行清理工作。
-当系统进行GC的时候会先调用finalize方法,然后再下次才会回收对象的内存。因为native中申请的内存,GC没有办法回收所以finalize被用来做垃圾回前的重要清理工作:释放特殊内存。
-所以finalize一般使用在使用了JNI的情景下,需要在finalize中调用native方法释放特殊内存,一般情况下不要使用finalize!
-如果GC不发生那么finalize也不会发生,finalize是Object的protect方法,不可以在类族外访问。
不是析构函数

-Java因为有GC机制,所以没有析构函数的概念!
-finalize不是C++中的析构函数:析构函数肯定是会销毁该对象的,但是finalize因为gc机制不会经常发生,所以其被执行的是不确定的。(不知道是不是我没理解透,没觉得这两个有什么可比性,一个主动发生一个被动发生)
其他

-调用System.gc(),可以强制让gc发生来触发finalize方法!但是GC也只是GC垃圾的对象(没有被引用的),非垃圾的对象的finalize不会被调用。程序终止和GC不是一个概念。
-正常情况下你调用finalize()都是直接super.finalize()使用父类的就行了。
-finalize一般不用!被执行的不确定性太大。不要指望使用finalize来回收你的对象,它只会在系统进行GC的时候清理特殊内存,不受你的控制!

  1. 即时编译器(JIT:Just-In-Time)
    参考链接:http://www.sohu.com/a/169704040_464084
    搜狐漫画
    参考链接2:http://www.cnblogs.com/linghu-java/p/8589843.html
    在JDK中的Java Hotspot技术中,有解释器和即时编译器配合工作。即时编译器会进行“热点检测”,看是不是需要即时编译的代码。在运行过程中会被即时编译的“热点代码”有两类,即:
    被多次调用的方法
    被多次执行的循环体

  2. Java本地方法:JNI
    参考链接:https://www.cnblogs.com/chen-jack/p/7904510.html
    参考链接2:https://www.cnblogs.com/zh1164/p/6283831.html
    参考链接3:https://www.cnblogs.com/cathyqq/p/9692067.html

  3. 静态 static
    相关链接:https://www.cnblogs.com/dolphin0520/p/3799052.html
    (1) 没有对象
    (2)静态方法不可以用非静态的东西,但反之可以
    (3) static变量:
    静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
    (4)static只在类加载的时候执行一次
    (5)static不允许用来修饰局部变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值