2019年3月

垃圾回收的过程首先就是要确定对象是否是垃圾对象,如果是垃圾对象,垃圾回收器才会进行回收。垃圾回收主要又两种算法:引用计数算法和可达性分析算法。

一、引用计数算法
引用计数算法就是在对象中添加了一个引用计数器,当有地方引用这个对象时,引用计数器的值就加1,当引用失效的时候,引用计数器的值就减1。当引用计数器的值为0时,jvm就开始回收这个对象。

简单的来说,在JVM中的栈中,如果栈帧中指向了一个对象,那么堆中的引用计数器的值就会加1,当栈帧这个指向null时,对象的引用计数器就减1。

这种方法虽然很简单、高效,但是JVM一般不会选择这个方法,因为这个方法会出现一个问题:当对象之间相互指向时,两个对象的引用计数器的值都会加1,而由于两个对象时相互指向,所以引用不会失效,这样JVM就无法回收。

二、可达性分析算法
针对引用计数算法的BUG,JVM采用了另一种方法:定义一个名为"GC Roots"的对象作为起始点,这个"GC Roots"可以有多个,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,即可以进行垃圾回收。

在上图中可以看到,如果时选用引用计数算法,object5, object6, object7之间互相引用,所以无法被回收。但是如果选用了可达性分析算法,虽然他们之间时相互引用,但是他们没有任何引用链和GC Roots连接,所以是可回收对象。

GC Roots对象一般包括有:
1.虚拟机栈(栈帧中本地变量表)中引用的对象;
2.方法区中类静态属性引用的对象;
3.方法区中常量引用的对象;
4.本地方法栈中JNI(Native方法)引用的对象。

三、拓展
对象被回收前的挣扎
在可达性分析算法中不可达的对象,并不是直接被回收,这时它们处于缓刑状态,至少需要进行两次标记才会确定该对象是否被回收:
 第一次标记:如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记;
 第二次标记:第一次标记后接着会进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法(该方法可将此对象与GC Roots建立联系)。在finalize()方法中没有重新与引用链建立关联关系的,将被进行第二次标记。

 第二次标记成功的对象将真的会被回收,如果对象在finalize()方法中重新与引用链建立了关联关系,那么将会逃离本次回收,继续存活。如果没有建立联系, 在finalize()方法中执行该对象必须要执行的代码(因为该对象马上就要被回收),例如释放资源,这与try finally中finally的作用是一样的

方法区如何判断是否需要回收
方法区存储内容是否需要回收的判断可就不一样咯。方法区主要回收的内容有:废弃常量和无用的类。对于废弃常量也可通过引用的可达性来判断,但是对于无用的类则需要同时满足下面3个条件:

该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例;
加载该类的ClassLoader已经被回收;
该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
————————————————
版权声明:本文为CSDN博主「-小酒窝-」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zx1293406/article/details/104535414

通过一系列的称为GC Roots的对象作为起始点,从这些节点开始往下搜索,搜索所走过的路径叫做引用链,当一个对象到GC Roots没有任何引用链相连的时候,则证明此对象是不可用的。

在java中,可作为GC Roots的对象有以下几种:
虚拟机栈(栈帧中的本地变量表)中引用的对象。
方法区中类静态属性引用的对象。
方法区中常量引用的对象。
本地方法栈中JNI引用的对象。

对象是什么?类是什么?
对象是一个自包含的实体,用一组可识别的特性和行为来标识。
类是具有相同的属性和功能的对象的抽象的集合。

什么叫实例化?
实例,就是一个真实的对象。实例化就是创建对象的过程。

什么是构造方法?
构造方法,又叫构造函数,即对类进行初始化。构造方法和类同名,无返回值,也不需要void,在new时候调用。
所有类都有构造方法,如果没有自定义的构造方法,系统会默认生成空的构造方法。

什么是方法重载?
方法重载提供了创建同名的多个方法的能力,但这些方法需不同的参数类型。
方法重载时,两个方法必须方法名相同,但参数类型或个数必须有所不同。
方法重载可在不改变原方法的基础上,新增功能。

属性
属性是一个方法或一对方法,但在调用它的代码来看,它是一个字段,即属性适合于以字段的方法使用方法调用的场合。

字段
字段是存储类要满足其设计所需要的数据,字段是类相关的变量。

封装
每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装,因此对象不必依赖其他对象来完成自己的操作。

良好的封装能够减少耦合;类内部的实现可以自由的修改;类具有清晰的对外接口;

继承
继承定义了类如何相互关联,共享特性。继承的工作方式是,定义父类和子类,或叫做基类和派生类,其中子类继承父类的所有特性。子类不但继承了父类的所有特性,还可以定义新的特性。

如果子类继承于父类,一、子类拥有父类非Private的属性和功能;二、子类具有自己的属性和功能,即子类可以拓展父类没有的属性和功能;三、子类还可以以自己的方式实现父类的功能(方法重写)
子类从它的父类中继承的成员有方法、域、属性、事件、索引指示器,但对于构造方法,有一些特殊,它不能被继承,只能被调用。对于调用父类的成员,可以用base关键字。

不用继承的话,如果要修改功能,就必须在所有的重复的方法中修改,代码越多,出错的可能就越大。而继承使得所有子类公共的部分都放在了父类,使得代码得到了共享,避免了重复。此外,继承可使得修改或拓展继承而来的实现都较为容易。
继承的缺点:父类变,子类不得不变。继承会破坏包装,父类实现细节暴露给子类。

多态
多态表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。
一、子类以父类的身份出现
二、子类在工作时以自己的方式来实现
三、子类以父类的身份出现时,子类特有的属性和方法不可以使用。

为了使子类的实例完全接替来自父类的类成员,父类必须将该成员声明为虚拟的。这是通过在该成员的返回类型之前添加virtual关键字来实现。子类可以选择使用overrid关键字,将父类实现替换为它自己的实现,这就是方法重写Override,或者叫做方法覆写。

多态的原理是当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承链最末端的方法实现会被调用。也就是说,虚方法是按照其运行时类型而非编译时类型进行动态绑定调用的。

抽象类
抽象类不能实例化
抽象方法是必须被子类重写的方法
如果类中包含抽象方法,那么类就必须定义为抽象类,无论是否还包含其他一般方法。

抽象类应该有用尽可能多的共同代码,拥有尽可能少的数据。
抽象类通常代表一个抽象概念,它提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的,所以,在一个以继承关系形成的等级结构里,树叶节点应该是具体类,树枝节点均应当为抽象类。

接口
接口是把隐式公共方法和属性组合起来,以封装特定功能的一个结合。一旦类实现了接口,类就可以支持接口所指定的所有属性和成员。声明接口在语法上与声明抽象类完全相同。实现接口的类必须实现接口中的所有方法和属性。
一个类可以支持多个接口,多个类也可以支持相同的接口。

泛型
泛型是具有占位符(类型参数)的类、结构、结构和方法,这些占位符是类、结构、接口和方法所储存或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所储存的对象的类型的占位符;类型参数作为其字段的类型和其方法的参数类型出现。

官网https://secure.eveonline.com/
KB网 https://zkillboard.com/
合同查价 http://evepraisal.com/
goons查PAP https://adashboard.info/
goons查月均PAP https://manager.goonfleet.com/account/view/me
Frt的百科 https://frt-eve.com/viewforum.php?f=20
英汉速查 https://eve.being.moe/trn/
市场https://evemarketer.com/
goons补损https://affordablecare.goonfleet.com/home
goons快递https://www.imperialtranscontinentallogistics.com/
查矿价https://www.fuzzwork.co.uk/ore/?tdsourcetag=s_pctim_aiomsg

论如何利用代码将个人信息/军团信息改成舰船介绍格式https://mp.weixin.qq.com/s?__biz=MzU3MDY5OTE4MQ==&mid=2247483714&idx=1&sn=36927deae77611969edb3f17c82d2ed6&chksm=fcea3d80cb9db496b10af46c4620da50286a4c388ddd9b1e5f69fcc5adaf3cda250721beb9b2&token=995922459&lang=zh_CN#rd