JAVASE基础知识(十)内存---构造器

内存分配图

jvm:
逻辑上的划分:栈内存,堆内存,方法区
栈内存:局部变量或变量名称,栈结构,空间较小。用完后自动销毁
堆内存:存放对象,空间较大:垃圾回收器(GC)【garbage collection】回收垃圾
方法区:存放类信息,方法信息,常量
从main 方法入手分析代码

垃圾回收机制

程序运行期间,所有对象实例存储在运行时数据区域的堆中,当一个对象不再被引用(使用),他就需要被回收,在GC过程中,这些不需要被使用的对象从heap中回收,这样就会有空间循环被利用。

GC算法

  • 引用计数法
    简单但是速度很慢,缺陷是不能处理循环引用的情况。
    原理:此对象有一个引用,既增加一个计数器,删除一个引用减少一个计数器,垃圾回收时,只回收计数器为0的对象,此算法最致命的是无法处理循环引用的情况。
  • 标记-清除算法
    标记清除算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
    之所以说他是最基础的收集算法,是因为后续的收集算法都是基于这种思路并且对其不足进行改进而得到的

它的主要不足有两个:

一个是效率问题:标记和清除两个过程的效率都不高
另一个是空间问题:标记清除后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后再程序运行过程中需要分配较大对象时,无法找到足够的连续的内存而不得不提前触发另一次垃圾收集动作。

  • 分代收集算法
    这种算法并没有什么新的思路,只是根据对象的存活周期的不同,将内存划分为几块。一般是把java堆分成新生代和老年代,这样就可以根绝各个年代的特点采取最适当的收集算法。在新生代中,每次垃圾回收时都发现大批对象的死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高,没有额外空间对它进行分配担保,就必须使用*"标记-清理”或者“标记-整理”算法**来进行回收。*

  • 系统线程划分
    串行收集器
    使用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高。但是,也无法使用多处理器的优势。所以此收集器适合单处理器的机器。当然,此收集器也可以用在小数量(100M左右)情况下的多处理器机器上,可以使用-XX:+UseSerialGC打开。
    并行收集器
    对年轻代进行并行垃圾回收,因此可以减少垃圾回收的时间,一般在多线程多处理器上使用,使用-XX:+UseParallelGC打开。年老代进行并行收集。如果年老代不使用并发收集的话,是使用单线程进行垃圾回收,因此会制约扩展能力,使用-XX:+UseParallelOldGC打开。

使用-XX:ParallelGCThreads=设置并行垃圾回收的线程数,此值可以设置与机器处理数量相等。
此收集器可以进行如下配置:
最大垃圾回收暂停:指定垃圾回收时的最大暂停时间,通过-XX:MaxGCPauseMillis=指定。为毫秒数,如果指定了这个值的话,堆大小和垃圾回收相关参数会进行调整以达到指定值。此值可能会减少应用的吞吐量。吞吐量:吞吐量为垃圾回收时间与非垃圾回收时间的比值。通过-XX:GCTimeRatio=来设定,公式为1/(1+N),例如,-XX:GCTimeRatio=19时,表示5%的时间用于垃圾回收,默认情况为99,既1%的时间用于垃圾回收。

并发收集器
可以保证大部分工作都并发执行(应用不停止),垃圾回收只暂停很少的时间,此收集器适合对响应时间要求比较高的中,大型应用,使用-XX:+UseConcMarkSweepGC打开。

并发收集器主要减少年老代的暂停时间,他在应用不停止的情况下使用独立的垃圾回收线程,跟踪可达对象,在每个年老代垃圾回收周期中,在收集初期并发收集器会对整个应用进行简短的暂停,在收集中还会再暂停一次,第二次暂停会比第一次长,在此过程中多个线程同时进行垃圾回收工作。
并发收集器使用处理器换来短暂的停顿时间,在一个N个处理器的系统上,并发收集部分使用K/N个可用处理器进行回收,一般情况下1<=K<=N/4

在只有一个处理器的主机上使用并发收集器,设置为incremental mode模式也可以获得较短的停顿时间。
浮动垃圾:由于在应用运行的同时进行垃圾回收,所以有些垃圾回收可能在垃圾回收完成时产生,这样就造成了“floating Garbage”,这些垃圾需要在下次垃圾回收周期时才能回收掉,所以并发收集器一般需要20%的预留空间用于这些浮动垃圾。
Concurrent Mode Failure:并发收集器在应用程序运行时进行收集,所以需要保证堆在垃圾回收的这段时间有足够的空间供程序使用,否则,垃圾回收还未完成,堆空间先充满了,这种情况下将会发生“并发模式失败”,此时整个应用将会暂停。进行垃圾回收。
启动并发收集器:因为并发收集在应用运行时进行收集,睡衣必须保证收集完成之前有足够的内存空间供程序使用,否则会出现“Concurrent Mode Failure”,通过设置-XX:CMSinitiatingOccupancyFraction=指定还有多少剩余堆时开始执行并发收集。
并行:多个事件同一时间发生,同时做多件事
并发:多个事件在同一个时间间隔内发生。每年11.11日狂欢节,一天内接受的最大人数。

GC,垃圾回收机制详解

构造器(构造方法)

构造器用于构建对象使用,通过new关键字调用构造器
构造器的特点:
构造器只能在new 对象 的时候被调用一次,对象一旦创建无法在调用
构造器的名字一定要和类的名字一致;
构造器不能声明返回值(语法要求)实际上,构造器返回当前类型的真实对象
构造器 也可以像普通方法一样重载 。
java 默认会给所有的类提供一个空构造器。如果程序员提供了自定义的构造器,java 就不会在提供默认构造器了。

/**
 * 人类
 * 静态特征,属性(成员变量):姓名,性别,年龄
 * 动态行为 :方法:吃饭,说话,睡觉
 * @author lenovo
 *
 */
public class Person {
	// 属性
	String name;
	String gender;
	int age;
	//空构造器
	public Person() {
		System.out.println("创建了person 对象");
	}
	public Person(String name, String gender, int age) {
		super();
		this.name = name;
		this.gender = gender;
		this.age = age;
	}
	// 方法
	public void eat() {
		System.out.println("开始 吃饭。。。");
	}
	public void sleep() {
		System.out.println("我要睡觉。。。。。");
	}
	public String say() {
		return "肚子饿了";
	}
	public void introduce() {
		System.out.println("我叫" + name + ",性别" + gender + "今年" + age);
	}
}
public class Test {

	public static void main(String[] args) {
		 Person person = new Person("张杰","男",12);
		 person.introduce();
	}
}

发布了23 篇原创文章 · 获赞 4 · 访问量 377

猜你喜欢

转载自blog.csdn.net/weixin_44804206/article/details/105224589