java学习总结(四),序列化和解释执行过程

序列化和反序列化

什么是对象持久化?参考数据库的持久性,实际上就是说我们要保存对象的信息(对象的属性和方法)。
使用场景:1.通过网络发送对象(前后端通信)。2.对象的状态需要被保存到数据库或文件中。3.实现深复制。
如何序列化:1.对象需要实现serializable接口
2.使用一个输出流来构造一个对象流 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“文件路径”));
3.使用 oos.writeObject(对象);
此时 就会生成一个保存了对象状态的文件
注意!:用static和transiant声明的数据是不能被序列化的。

在序列化和反序列化中,最好在类中显式声明一个serialVersion UID,且被定义成static final,这样可以提高运行效率和不同平台的兼容性。

解释执行的过程

其实我们写的代码都会被编译器编译成字节码文件(.class),用于提供给jvm来执行。里面当然是十六进制的代码,在这里我们是看不懂的。通过IDEA的内置插件showByteCode我们可以看到
在这里插入图片描述
里面的十六进制代码被反编译成图上的样子,其实里面的代码都是jvm指令码。jvm就是根据这些代码来执行的。有兴趣的同学可以去查找jvm指令集。

说到这里我们来说一下解释执行的过程。
1.首先 我们的代码编成了字节码 也就是class文件。

2.jvm中的类加载器子系统调用类加载器去硬盘读取这个class文件,把他装入内存(放到了运行时数据区的方法区中)。

3.由执行引擎子系统去对class文件进行校验,之后会给类的静态变量分配内存空间(在方法区中),最后一步是可选的,将符号引用转换为直接引用。这一步的意思是 比如说我由一个A.class,它引用了B.class,但是在编译的时候jvm并不知道B.class的实际地址,所以只能用org.xxx.b.class来代替。当A.class被加载的时候,可以将这个符号引用直接转换成对B.class的直接引用。
在这里,该class文件指向了自己的classLoader和实例化之后的堆内存中的对象。

4.对静态变量和静态代码块进行初始化,也就是给这些变量进行赋值。

这里我们要来说一下,方法区保存了类型的信息、静态变量、常量和编译后生成的jvm指令集。运行时常量池保存了字面量和符号引用。

类加载的方式

显式加载(class,forName)和隐式加载(new)

java中,类的加载时动态的,不会全部加载在运行,而是保证程序运行的基础类完全加载到JVM中,其他类用到的时候再加载。

字节码执行的方式

1.编译方式:全编译成机器码再执行
2.解释执行: 每次先解释执行一小段
两种方式都是再运行期做的 编译期仍然表示生成class文件。
两种方式在JVM中的运用有很多种,举其中一个例子:热点代码使用编译方式,其他使用解释执行方式。
字节码的执行由jvm中的执行引擎子系统来实现。

双亲委派

再类加载器子系统中,当某个特定的类加载器收到请求之后会将任务交给自己的父亲,依次递归,当父亲无法完成时才由自己来执行。。。

总结

其实有时候我们一些面试书,里面讲的东西都没有深入到原理,所以我们只能背下来。个人觉得JVM的学习很有必要,能让你深入到底层去看到代码的执行过程,才能理解之前背的东西。

我呢,只是一个985本科的废物,虚度两年光阴,并没有考虑过自己的未来,是考研?还是找工作? 到了大三,决定找工作时才发现为时已晚,不禁后悔当初的两年。自2020年2月底我开始重新去学习java基础,操作系统、计算机网络,才真正意识到自己半年前在实验室做项目,完成了核心模块沾沾自喜的样子时多么可笑。写代码谁不会?但凡有手,学个几天就能写代码。但是写出来的代码质量呢?只有去理解了这些类的具体实现,才能高效地选择用哪一个,才能提高执行效率。

看到年级就业群,我的三月份就是在迷茫、放弃和坚持中度过的。年级只有五十多个人决定找工作,然而他们十多个已经字节腾讯offer到手。好好的年级群本该是分享就业信息,分享面经的地方,结果变成了他们用来炫耀的场所。我脑海中闪过一句话:我像个迷途的孩子,在黑暗中寻找光明,看到远处的光亮,我狂奔而去,那是别人庆祝的烟火。

后悔是没用的,回首往昔,谁没有后悔呢?谁都会后悔当初为什么不好好读书,考个好大学? 所以啊,从现在开始,好好努力吧,我相信没有什么不是经过努力才能取得的。或许努力不一定能得到结果,但是今天的努力是为了明天不会后悔。

加油吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值