- 浏览: 33042 次
- 性别:
- 来自: 成都
最新评论
-
surpassdream:
你好可以把那几个包发给我吗,谢了 我qq 285917033 ...
终于又解决了一个问题--JAI安装!
文章列表
finalize()方法,垃圾收集器会在释放这个实例(所占用的内存空间)前执行这个方法一次;
finalize()方法抛出的任何异常都将被忽略;
判断动态装载的类型的class实例在正常的垃圾收集过程中是否是可触及的有两种方式:
1、如果程序保持对Class实例的明确引用,那就是可触及的;
2、如果在队中还存在一个可触及的对象,在方法区中它的类型数据指向一个Class实例,那这个Class实例就是可触及的;
动态连接和解析
驱动java连接模型的引擎是解析过程;
class文件把它所有的引用符号保存在一个地方--常量池;
每一个class文件有一个常量池,每一个被java虚拟机装载的类或者接 ...
对象生命周期之--实例化
实例化一个类有四种途径:
1、使用new操作符;
2、调用Class或者newInstance()方法;
3、调用任何现有对象的clone()方法;
4、通过java.io.ObjectInputStream类的getObject()方法反序列化;
虚拟机为实例变量赋初值会根据创建对象的方法不同采用三种技术:
1、如果对象是clone()调用创建,虚拟机把原来被克隆的实例变量中的值拷贝到新对象中;
2、如果是通过一个ObjectOutputStream的readObject()调用反序列化的,虚拟机通过从输入流中读入的值来初始化哪些非暂时性的实例变量;
3、调用对象的 ...
准备:
在准备阶段,虚拟机为类变量分配内存,设置默认初始值;
解析:
解析过程就是在类型的常量池中寻找类、接口、字段、方法的符号引用,把这些符号引用替换成直接饮用的过程;
初始化:
为类变量赋予正确的初始值,一个正确的初始值是通过类变量初始化语句或者静态初始化语句给出的;
所有的类变量初始化语句和类型的静态初始化器都被java虚拟机收集在一起,放到被称为<clinit>的方法中,此方法只能被虚拟机调用;
如果没有声明类变量也没有静态初始化语句,就不会有<clinit>()方法;
如果类仅包含静态final变量的类变量初始化语句,而且这些类变量初始化语句采用编译时常量表达式 ...
类型的声明周期
所有java虚拟机必须实现在每个类或者接口首次主动使用时初始化。以下六种情形符合主动使用要求:
1、创建某个类的新实例;
2、调用某个类的静态方法,即在字节码中执行invokestatic指令时;
3、使用某个类或者接口的静态字段,或者对静态字段赋值(在字节码中执行getstatic、putstatic指令)。用final修士的静态字段除外,他被初始化为一个编译时的常量表达式;
4、调用某些反射方法时;
5、初始化某个类的子类;
6、虚拟机起动时某个被标明为启动类的类(含main()方法的类);
只有在某个接口所声明的非常量字段被使用时,该接口才会被初始化;
装载:
三个基本 ...
特殊字符串:
常量池中容纳的符号引用包括三种特殊的字符串:权限定名、简单名称、描述符。
所有的符号引用都包括类或者接口的全限定名。
字段的符号引用除了全限定类型名外,还包含简单字段名和字段描述符。
方法的符号引用除了全限定类型名外,还包含简单方法名和方法描述符。
字段的描述符给出了字段的类型,方法描述符给出了方法的返回值和方法参数的数量、类型、顺序;
方法描述符只能包含255个字长以内的参数,传给实例方法的隐藏this参数引用占用一个字长,除long、double外的基本类型参数占用一个字长;
在类或者接口中声明的每一个字段(类变量或者实例变量)都有class文件中的一个名为field ...
Class文件:
access_flags:
access_flags为两个字节,紧跟常量池,展示了文件中定义的类或接口的几段信息。
access_flags中所有未使用的位都必须有编译器置0,而且java虚拟机必须忽略它。
this_class:
两个字节,他是一个对常量池的索 ...
每天学一点:java虚拟机6
- 博客分类:
- JAVA
Class文件:
每个文件前4个字节都被称为它的魔数(magic number):0xCAFEBABE。如果一个文件不是以这个开头,那就肯定不是java class文件。
注:CAFEBABE是咖啡品牌Peet's Coffee深受欢迎的一个产品。
版本号确定了特定的class文件格式,只有给定了主版本号和一系列次版本号后,虚拟机才弄呢狗狗读取class文件。
例:45.0:主版本号45,次版本号0
如果javac命令制定 -target 1.2 标志。1.2的编译器将产生版本号为46.0的class文件。
java虚拟机第二版修改了对class文件主、次版本号的解释,class文件的主版本 ...
每天学一点:java虚拟机5
- 博客分类:
- JAVA
java的方法调用和动态派发的频度要比C++高很多。
程序的正常运行不能依靠时间分片。
虚拟机规范中,java线程的行为是通过术语--变量、主存和工作内存--来定义的。
每一个虚拟机实例都有一个主存,用于保存所有的程序变量(对象的实例变量、数组的元素以及类变量)
每一个线程都有一个工作内存,先策划给你用它保存所使用和复制的变量的“工作拷贝”
局部变量和参数,每个线程私有,逻辑上可看作是工作内存或主存的一部分。
所有对基本类型的操作,除了double、long类型以外,都必须是原子的;
虚拟机实现的核心都是他的执行引擎,使用指令集来定义
java虚拟机指令集的每种操作码都有助记符,使用汇编风格,使用javap可以查看class文件中方法的字节码助记符
虽然java虚拟机没有保存任意值的寄存器,但每个方法都有一个局部变量集合。
指令集实际的工作方式就是吧局部变量当做寄存器,用索引来访问,局部变量使用前,必须将它压入操作数栈;
平台无关性是影响指令集设计的最大因素,保证在很多平台体系结构上都很容易实现java虚拟机;
java以栈为中心设计指令集的另一个动机是,编译器一般采用以栈为基础的结构向连接器或优化器传递编译的中间结果;
java以栈为中心的体系结构可以讲运行时进行的优化工作 ...
局部变量区被组织为一个以字长为单位,从0开始计数的数组。类型byte、short、char的值在存入数组前被转换为int值。
类型为long、double的值在数组中占据连续的两项。
静态方法被视为类方法,在其局部变量中不会隐含加入reference(引用)类型参数,此隐含类型参数表示调用该方法的对象本身。
byte、short、char、boolean在局部变量区都被转换成了int,即在帧栈中适当做int来进行处理的,只有当他被存回堆或方法区时,才会转换回原来的类型。
操作数栈
操作数栈被组织成以字长为单位的数组,不是通过索引访问,通过栈操作--压栈、出栈访问。操作数栈中存储数据方式通局 ...
虚拟机中每个对象都有一个对象锁,用于协调多线程访问同一个对象时的同步。
除了锁,每个java对象逻辑上还与实现等待集合的数据相关联,等待集合是用来让多个线程为完成同一个共同目标二协调工作的。,由等待方法(从object那里继承的三个名为wait()的重载方法)和通知方法(notify()和notifyAll())联合使用。
程序计数器
PC寄存器的大小是一个字长,他既能够持有以个本地指针,也能够持有一个returnAddress。当线程执行一个本地方法是,PC寄存器的值是“undefined”
java栈
新线程启动时,java虚拟机会分配一个java栈。
虚拟机知会直接对java栈执行两种 ...
虚拟机会为每个装在的类型存储:
1、该类型常量池:存储了相应类型所有用到的类型、字段和方法的符号引用,包括常量(Integer、String、float point常量)和对其它类型、字段、方法的符号引用。池中数据像数组一样是通过索引访问;
2、字段信息:包含字段名、字段类型、字段修饰符;
3、方法信息:方法名、返回类型、方法参数的数量和类型(按声明顺序)、方法修饰符;
类(静态)变量:只与类有关--而非类的实例,作为类型信息的一部分存储在方法区;
编译时常量(final声明以及用编译时一直的值初始化的类变量):使用编译时常量的类型都会复制它的所有常量到自己的常量池中,或嵌入到它的字节码流中。 ...
JVM、类加载
1、http://www.ibm.com/developerworks/cn/java/j-dyn0429/index.html
2、http://www.importnew.com/16735.html
3、http://www.importnew.com/11412.html
4、http://www.importnew.com/17086.html
5、https://www.ibm.com/developerworks/cn/java/j-lo-classloader/
6、下载:http://download.csdn ...
关于EnumMap、EnumSet的使用
- 博客分类:
- JAVA
enum定义是别人的,第一次看见这种用法,就测试了一下。发现EnumMap的使用与网上大家写的不一样呢,哪位大侠知道:
public enum WeekDayOfEnum{
Mon("Monday"), Tue("Tuesday"), Wed("Wednesday"), Thu("Thursday"), Fri(
"Friday"), Sat("Saturday"), Sun("Sunday");
/* 定义枚举自己的属性 */
...
package com.bxf.NIOTest;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class allocateDirectTest {
public allocateDirectTest(){}
String sfin = "K:\\tmp\\FileIn.txt";
String sfou = "K:\\tmp ...