Thinking in Java:第五章-初始化与清理

来源:互联网 发布:腾牛网软件下载 编辑:程序博客网 时间:2024/05/28 15:48
1:初始化和清理是设计安全的两个问题。(内存)
2:java使用构造器在用户有能力操作对象之前初始化。
3:人类的语言具有冗余性,即使漏掉几个词,也可以根据语境推测出语义。机器的语言要求精确性。
4:重载方法:相同的函数名,不同的参数列表,不能用返回值类型来区分重载函数。
5:this关键字:表示“调用方法的那个对象”。
6:使用本地方法分配的内存块java垃圾收集器不能回收这部分内存。需要程序员自己搞定。
7:垃圾回收算法:一:回收空间。二:使得堆中对象紧凑排列,可以是实现一种高速的,有“无限空间”可以分配的堆模型。

//敲重点,垃圾回收算法

jvm体系结构


图片来源:网络,侵删


java堆内存


图片来源:网络,侵删

新生代(Young Generation)
Eden空间(Eden space,任何实例都通过Eden空间进入运行时内存区域)
S0 Survivor空间(S0 Survivor space,存在时间长的实例将会从Eden空间移动到S0 Survivor空间)
S1 Survivor空间 (存在时间更长的实例将会从S0 Survivor空间移动到S1 Survivor空间)
老年代(Old Generation)实例将从S1提升到Tenured(老年代)
永久代(Permanent Generation)包含类、方法等细节的元信息(在java se8中被移除)

1:引用计数法:(简单但很慢的垃圾回收技术)
每个对象都有一个引用计数器,当有引用连接到对象时,计数加1,当引用离开作用域或者引用被置为null(Java 编译器能选择给实例赋 null 值,从而标记实例为可回收。),计数减1。垃圾回收会在含有全部对象的列表上遍历,当发现某个对象的引用计数为0时,就释放其空间。(对象之间存在交互引用不能清理)。

2:对于所有活的对象,一定可以追溯到他在堆栈或者静态存储区的引用。所以,从堆栈或者静态存储区开始,遍历所有的引用,就能找到所有的引用。
2.1:停止-复制
先停止程序运行,然后将所存活的对象从当前堆复制到另一个堆。
有两个问题:1:需要两个堆。2:程序运行稳定后只会产生少量垃圾,很浪费。
2.2:标记-清理
如果没有新垃圾产生,一些jvm就会由“停止-复制”转换到“标记-清理”模式。
从堆栈或者静态存储区开始,遍历所有的引用,就能找到所有的引用,每当找到一个活的对象,就给对象一个标记,标记完成后,清理动作才开始。没有被标记的对象会被释放,但是这时剩下的堆空间是不连续的(内存碎片化),需要重新整理。


3:java 4中垃圾回收器
3.1串行垃圾回收器(Serial Garbage Collector)
3.2并行垃圾回收器(Parallel Garbage Collector)
3.3并发标记扫描垃圾回收器(CMS Garbage Collector)
3.4G1垃圾回收器(G1 Garbage Collector)
G1垃圾回收器:G1垃圾回收器适用于堆内存很大的情况,他将堆内存分割成不同的区域,并且并发的对其进行垃圾回收。G1也可以在回收内存之后对剩余的堆内存空间进行压缩。并发扫描标记垃圾回收器在STW情况下压缩内存。G1垃圾回收会优先选择第一块垃圾最多的区域

4:GC监控与分析:jdk自带的工具是Java VisualVM(路径:\Java\jdk1.8.0\bin)





阅读全文
0 0
原创粉丝点击