1、什么是Java序列化?
在分布式环境下,当进行远程通信时,无论是何种类型的数据,都会以二进制序列的形式在网络上传送。序列化是一种将对象以一连串的字节描述的过程,解决在对对象流进行读写操作时所引发的问题。
序列化可以将对象的状态写在流里进行网络传输,或者保存到文件、数据库等系统里,并在需要时把流读取出来重新构造一个相同的对象。
如何实现序列化?
实现serializable接口
2、为什么说Java是平台独立性语言?
保证Java具有平台独立性的机制为“中间码”和“JVM”。Java程序编译后不是生成能在硬件平台上可执行的代码,而是生成一个中间码,不同的硬件平台上安装有不同的JVM,由JVM负责把“中间码”翻译成硬件平台能执行的代码。
解释执行过程分3步:代码的装入、代码的校验和代码的执行。装入代码的工作由“类加载器”完成,被装入的代码由字节码校验器进行检查。
3、类加载器的实质:把类文件从硬盘读取到内存中。分为隐式加载和显式加载两种。隐式加载指程序使用new等方式创建对象时会隐式调用类的加载器将对应类加载到JVM中,显式加载指通过直接调用class.forName方法把所需类加载
类加载的主要步骤分为3步:
1)装载:根据查找路径找到对应class文件,然后导入
2)链接:检查(检查待加载的class文件的正确性)、准备(给类中的静态变量分配存储空间)和解析(将符号引用转换成直接引用)
3)初始化:对静态变量和静态代码块执行初始化工作。
引申:
一个Java程序运行从上到下的环境次序是:Java程序、JRE/JVM、操作系统、硬件。
4、JVM:是一个虚构出来的计算机,用来把Java编译生成的中间代码转换为机器可以识别的编码并运行。它有自己完善的硬件架构,例如处理器、堆栈、寄存器等,还具有相应的指令系统,它屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在JVM上运行的目标代码(即字节码),就可以在多种平台上顺利运行。
每当一个Java程序运行时,都会有一个对应的JVM实例,只有当程序运行结束后,这个JVM才会退出,JVM实例通过调用类的main()方法启动一个程序。
5、Java堆和栈的区别
在Java中,堆和栈都是内存中存放数据的地方。
变量分为基本类型和引用类型,基本数据类型的变量和对象的引用变量,其内存分配在栈上,变量出了作用域就会自动释放,引用类型的变量,内存分配在堆上或常量池中,需要通过new方式创建。
栈内存管理通过压栈和弹栈操作完成,以栈帧为基本单位管理程序的调用关系;
堆内存用来存放运行时创建的对象,由于Java是基于堆栈的虚拟机,每个Java程序都运行在一个单独的JVM实例上,每一个实例都唯一对应一个堆,一个Java程序内的多个线程也就运行在同一个JVM实例上,因此线程间共享堆内存(需要数据同步)
相较于堆,栈的存取速度更快,但大小和生存期必须是确定的,而堆可以在运行时动态地分配内存。