java杂记1

1.switch的底层实现基于跳表,所以switch本质就是goto,case就是一个标签,根据变量的值跳到对应的标签处开始顺序往下执行,所以如果要想只执行对应case中的代码需要在后面加break;

2.java中的数组是对象。Java中二维数组并不“二维“。

java杂记1_第1张图片

所以java中可以int[][] a=new int[5][];这样创建二维数组。只需对a初始化,而并不用管a中存储的一维数组对象的初始化。


3.java的内存模型:参考资料《深入理解java虚拟机》

讲java的内存模型之前先简单讲一下.class文件的数据结构:

.class文件和.java文件有很大的区别,编译器对java文件中的信息进行了提取分解转化,然后按照特定的分类和顺序存储到.class文件中。

Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格的按照顺序紧凑的排列在Class文件中,中间没有任何的分隔符。Class文件采用类似c语言结构体的结构存储数据,这种结构只有两种数据类型:无符号数和表。无符号数可以用来描述数字,索引引用,按UTF-8编码构成的字符串值等信息。表则用来表示有层次关系的复合型结构的数据信息。

按class文件中存储顺序介绍class文件中存储的信息:

1.magic(无符号数,4字节) 魔数。 用于区分当前文件是否是一个class文件。

2.minor_version(无符号数,2字节),major_version(无符号数,2字节) 版本号。

3.constant_pool_count(无符号数,2字节)表示常量池中存储的常量个数,constant_pool(表)常量池,存放字面量和符号引用。

4.access_flags(无符号数,2字节)表示访问标志,用于识别这个class是类还是接口,是public还是什么,是否abstract,是否final等

5.this_class(无符号数,2字节) 类索引,用于确定这个类的全限定名。

6.super_class(无符号数,2字节) 父类索引,用于确定父类的全限定名。

7.interfaces_count(无符号数,2字节) implements了的接口数

8.interfacses(无符号数,2字节) 接口索引 (多个,按照implements的顺序依次排列,每个都是2字节)

9.fields_count(无符号数,2字节)

10.fields

11.methods_count(无符号数,2字节)

12.methods

13.attributes_count(无符号数,2字节)

14.attributes

(上面没写完的以后再补充)


   java的内存模型:

 java杂记1_第2张图片


1.程序计数器:可以看作当前线程所执行的字节码行号指示器。作用:在线程切换后能恢复到正确的位置继续执行。

2.java虚拟机栈:java方法执行的内存结构。他的生命周期与线程相同。

每个方法在执行的时候都会创建一个栈帧。栈帧里面存储了局部变量表,操作数栈,动态链接等信息。每一个方法的调用到执行完,对应着一个栈帧的入栈与出栈。

局部变量表中存放了编译期可知的各种基本数据类型,引用类型(reference)和returnAddress类型(指向一条字节码指令的地址)。

java虚拟机规定了此区域两种异常:1.StackOverflowError异常:当线程请求的栈深度大于虚拟机所允许的深度时抛出。

2.OutOfMemoryError异常:当没有超出允许的深度,但是内存不足以开辟一个新的方法栈时抛出

本地方法栈:和方法栈没区别,只不过本地方法栈是为native方法服务,而方法栈是为java方法服务。


3.堆:此区域唯一的目的就是存放实例。java堆是垃圾收集器管理的主要区域。java堆只要逻辑上是连续的即可,当堆无法扩展,且没有内存完成实例存储时会抛出OutOfMemoryError异常

4.方法区:java虚拟机规范中把方法区描述为堆的一个逻辑分区。它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。(类的信息,方法,常量等都是存储在这里)。当方法区无法满足内存分配时,将抛出OutOfMemoryError异常

运行时常量池:是方法区的一部分,存放class文件中的常量池中的数据(常量,符号引用)。当常量池无法满足雷村分配时,将抛出OutOfMemoryError异常。


类的加载

   类的加载就是将磁盘中class文件的二进制流加载到内存(运行时数据区)中。

类加载过程:

java杂记1_第3张图片


1.装载:

该阶段的任务是获取类的二进制字节流,转化为方法区的数据结构存储到方法区中,最后生成代表这个类的lava.lang.Class对象作为方法区这些数据的访问入口。我通常所说的静态方法,静态变量其实也是对象的属性与方法,都是Class对象的属性与方法。

类的装载过程:首先虚拟机只加载程序执行时所需的类文件。如果

(上面没写完的以后再补充)




   

你可能感兴趣的:(java杂记1)