`
yidongkaifa
  • 浏览: 4062846 次
文章分类
社区版块
存档分类
最新评论

二.Java的初始化机制、垃圾回收机制和内存分配机制

 
阅读更多
二.Java的初始化机制、垃圾回收机制和内存分配机制

2.1初始化顺序:

public class Parent
{
	static Tipout	TIP	= new Tipout("父类 static 成员 TIP 初始化");
	Tipout	tip	= new Tipout("父类 成员 tip 初始化");
	
	public Parent()
	{
		System.out.println("父类 构造函数 调用");
	}
}

class Sub extends Parent
{
	static Tipout	SUB_TIP	= new Tipout("子类 static 成员 SUB_TIP 初始化");
	Tipout	subTip	= new Tipout("子类 成员 subTip 初始化");
	
	public Sub()
	{
		System.out.println("子类 构造函数 调用");
	}
}

class Tipout
{
	public Tipout(String s)
	{
		System.out.println(s);
	}
}

执行结果:

父类 static 成员 TIP 初始化
子类 static 成员 SUB_TIP 初始化
父类 成员 tip 初始化
父类 构造函数 调用
子类 成员 subTip 初始化
子类 构造函数 调用


由此可以总结出java初始化的顺序:
->所有静态成员初始化(父类->子类)
-->父类初始化(普通成员->构造函数)
--->子类初始化(普通成员-->构造函数)


!static成员初始化顺序只和类定义中的顺序有关。


调用静态数据和静态方法时,这个类中的所有静态成员都会被初始化(非static成员不会被初始化),前提是他们从未被初始化过。
测试代码:
public class Parent
{
	public static Tipout	TIP	= new Tipout("父类 static 成员 TIP 初始化");
	static
	{
		System.out.println("父类 static 代码块");
	}
	Tipout	tip	= new Tipout("父类 成员 tip 初始化");
	
	public Parent()
	{
		System.out.println("父类 构造函数 调用");
	}
	
	public static void outMsg(){
		System.out.println("父类 static 函数 调用");
	}
}

在Main()中调用:Parent.TIP.toString();
结果:


2.2垃圾回收


java中并不需要清除对象,也不存在C++中的析构函数,java的垃圾回收机制会自动释放无用的变量。
一个对象,可以有一个或多个引用变量指向它。当一个对象不再有任何一个引用变量指向它时,这个对象可以被垃圾回收机制回收了。
但是,并不是对象被抛弃后当即被回收的。JVM进程做空间回收有较大的系统开销。如果每当某应用进程丢弃一个对象,就立即回收它的空间,
势必会使整个系统的运转效率非常低下。


!不能操纵垃圾回收
使对象值为null,或者调用System.gc()
JVM接受这个消息后,并不是立即做垃圾回收,而只是对几个垃圾回收算法做了加权,使垃圾回收操作容易发生,或提早发生,或回收较多而已。

!垃圾回收器的运行时间是不固定的,清理工作的实际运行时间也是不能预知的。


2.3内存分配机制


2.3.1Java 把内存划分成两种:
1.栈内存,
基本类型的变量和对象的引用变量(存取速度比堆要快,仅次于寄存器)
2.堆内存。
堆内存用来存放由 new 创建的对象和数组。

!类跟数组一样,都是属于引用类型,引用类型就是指一堆对内存可以同时被多个栈内存指向。

java中主要存在4块内存空间:

栈内存空间:保存所有的对象名称(更准确地说是保存了引用的堆内存空间的地址)
堆内存空间:保存每个对象的具体属性内容。
全局数据区:保存static类型的属性。
全局代码区:保存所有的方法定义。


2.3.2 String缓冲池
缓冲池是java为了节省内存空间,会在内存中创建一个专门为String设计的缓冲池,用来保存已经存在的字符串,
如果2个字符串是一样的,则使用池中的字符串,不再创建新的对象
用下边的代码测试:
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
结果为true,说明str1和str2指向同一个对象


String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
用new则在堆中创建了2个对象


2.4应该注意的问题:



1.使用以下方式创建字符串
String str = "hello";
上面这种方式会创建一个"hello"字符串,而且JVM的字符缓存池还会缓存这个字符串。
String str = new String("hello");
此时程序除创建字符串外,str所引用的String对象底层还包含一个char[]数组,这个char[]数组依次存放了h,e,l,l,o


2.尽量减少对变量的重复计算
for(int i=0;i<list.size();i++)
应该改为
for(int i=0,len=list.size();i<len;i++)
并且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。


3.避免在循环体中声明创建对象

for (int i = 0; i < 10000; i++) {  
    Object obj = new Object();  
}
虽然性能上差别不大,但这样的代码会浪费栈内存空间,上边提到过引用变量会存放在栈内存,这样会在内存中产生大量的对象引用。

应该写成下边的:

Object obj;
for (int i = 0; i < 10000; i++) {  
    obj = new Object();  
}



分享到:
评论

相关推荐

    java虚拟机2021面试题第二季

    2. 内存管理:JVM负责内存的分配和垃圾回收。它会自动为Java应用程序分配内存,并在对象不再被引用时自动释放内存。 3. 字节码验证和安全性检查:JVM对字节码进行验证,以确保它符合Java语言规范,并且没有潜在的...

    java虚拟机2021面试题第三季

    2. 内存管理:JVM负责内存的分配和垃圾回收。它会自动为Java应用程序分配内存,并在对象不再被引用时自动释放内存。 3. 字节码验证和安全性检查:JVM对字节码进行验证,以确保它符合Java语言规范,并且没有潜在的...

    java虚拟机2021面试题第一季

    2. 内存管理:JVM负责内存的分配和垃圾回收。它会自动为Java应用程序分配内存,并在对象不再被引用时自动释放内存。 3. 字节码验证和安全性检查:JVM对字节码进行验证,以确保它符合Java语言规范,并且没有潜在的...

    c#如何用好垃圾回收机制GC

    2、初始化内存 3、使用资源 4、清理资源 5、释放内存 应用程序对资源(内存使用)管理的方式,常见的一般有如下几种: 1、手动管理:C,C++ 2、计数管理:COM 3、自动管理:.NET,Java,PHP,GO… 但是,手动管理和计数...

    疯狂JAVA讲义

    1.7 垃圾回收机制 20 1.8 何时开始使用IDE工具 21 学生提问:老师,我想学习Java编程,到底是学习Eclipse好呢,还是学习JBuilder好呢? 21 1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 ...

    深入了解 JVM 虚拟机(超详细入门攻略)

    7. 简述 Java 垃圾回收机制8. 简述 Java 类加载机制9. 类加载器双亲委派模型机制10. 什么是类加载器,类加载器有哪些?11. 简述 java 内存分配与回收策率以及 Minor GC 和Major GC 1. 内存模型以及分区 JVM 分为堆区...

    java虚拟机精讲(电子工业出版社出版)

    HotSpot VM是目前市面上高性能JVM的代表作之一,它采用解释器+JIT 编译器的混合执行引擎,使得Java ...第6 章 内存分配与垃圾回收 / 147 第7 章 类加载机制 / 185 第8 章 剖析HotSpot 的架构模型与 执行引擎 / 209

    Java的GC机制

    但也有特殊情况:假定你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道该如何释放该对象的这块“特殊”内存区域,为了应对这种情况,java允许在类...

    操作系统(内存管理)

    malloc_init 将是初始化内存分配程序的函数。它要完成以下三件事:将分配程序标识为已经初始化,找到系统中最后一个有效内存地址,然后建立起指向我们管理的内存的指针。这三个变量都是全局变量: 清单 1. 我们的...

    java 面试题 总结

    GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存...

    AIC的Java课程1-6章

     [*]了解Java内存机制:栈、堆、常量池等,理解垃圾回收机制。 第3章 面向过程(数组和方法) 4课时  理解如何声明数组、构造数组、初始化数组以及使用数组中的各个元素。  清楚数组作为...

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    第92节类加载的过程-初始化00:19:41分钟 | 第93节类加载器00:22:41分钟 | 第94节双亲委派模型00:17:03分钟 | 第95节运行时栈帧结构00:08:46分钟 | 第96节局部变量表00:20:48分钟 | 第97节操作数栈00:08:36分钟 ...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 170 第7章 虚拟机类加载机制 / 171 7.1 概述 / 171 7.2 类加载的时机 / 172 7.3 类加载的过程 / 176 7.3.1 加载 / 176 7.3.2 验证 / 178 7.3.3 准备 / 181 7.3.4 解析 / 182 7.3.5 初始化 / 186 7.4 类...

    java7hashmap源码-AndroidOffer:只为帮助您获得更好的报价

    java7 hashmap源码 AndroidOffer Java Java 进阶 HashMap 对比:Hashtable、HashMap、...垃圾回收机制和调用 System.gc()的区别? 谈谈对 java 状态机的理解。 反射 多线程和线程池 线程有哪些状态, Synchronized的原

    Java虚拟机

    7.3.5 初始化 7.4 类加载器 7.4.1 类与类加载器 7.4.2 双亲委派模型 7.4.3 破坏双亲委派模型 7.5 本章小结 第8章 虚拟机字节码执行引擎 8.1 概述 8.2 运行时栈帧结构 8.2.1 局部变量表 8.2.2 操作数栈 ...

    深入理解JVM内存结构及运行原理全套视频加资料.txt

    包括JVM执行过程、虚拟机类加载机制、运行时数据区、GC、类加载器、内存分配与回收策略等,全套视频加资料高清无密码  第1讲 说在前面的话 免费 00:05:07  第2讲 整个部分要讲的内容说明 免费 00:06:58  第3讲...

    超级有影响力霸气的Java面试题大全文档

    GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存...

    《剑指offer》JVM面试题总结.pdf

    初始化 使用 卸载 在 JVM 中,对象是如何创建的? 内存分配方式有哪些呢? 请你说一下对象的内存布局? 对象头 Header 实例数据 Instance Data 对齐 Padding 对象访问定位的方式有哪些? 如何判断对象已经死亡? ...

    JVM 面试题总结.md

    - 初始化 - 使用 - 卸载 - 在 JVM 中,对象是如何创建的? - 内存分配方式有哪些呢? - 请你说一下对象的内存布局? - 对象头 Header - 实例数据 Instance Data - 对齐 Padding - 对象访问定位的方式有...

    【03-流程控制与数组】

    因此,为了让垃圾回收机制回收一个数组所占的内存空间,则可以将该数组变量赋为null,也就切 断了数组引用变量和实际数组之间的引用关系,实际数组也就成了垃圾。 数组长度不可变 •只要类型相互兼容...

Global site tag (gtag.js) - Google Analytics