引言
本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
事实是这样的,我在参与我的业务开发,测试的时候,其实是没啥问题的,但是部署的时候多了一大堆符号,咦,我就想这符号我也没加啊,哪里来的呀?因为当时项目紧张,老大也知道,就先放一放,事后老大给我发了一个链接,噢,我晓得了,于是决定写篇文章记录一下,使用fastJson遇到特殊符号的问题,我重新定义了对象的引用关系。。
我是知道分享的价值的,感谢这个小作者的分享,不然我也不能知道啥问题,还在错误的路上探索着,我想这就是分享的价值吧,本篇文章作为该文章的后续补充。
引用关系确定
我学习的时候喜欢系统性的学习,就是比如说涉及到一个概念,我就会系统性的把所有和该概念有关的概念都揪出来,那看完那篇文章的小伙伴们,就会知道造成这个原因主要是因为fastjson会把对象解析成引用,那提到java的引用关系,我想小伙伴们可能并不陌生,无非就是强引用、弱引用、软引用、幻象引用,那我就想问问大家你知道引用关系是用来干什么的呢?其实引用关系主要是用来体现不同对象的不可达状态程度的,是用来判断该对象对垃圾回收的影响的。
- 强引用:表示依赖对象的强相互依赖关系,一般垃圾回收器不会碰这种对象。
- 弱引用:仅仅提供一种弱状态对象的访问路径,并不会使该对象豁免垃圾收集
- 软引用:相对强引用弱化一点的引用
- 幻想引用:不能通过该引用访问对象
引用关系分析
我们知道,要想使用对象,你必须干两个事,一个就是创建对象,另一个就是进行对象的初始化,当对象进行初始化的时候,就会发生如下奇妙的引用关系,也是java定义的不可达级别,(大家不要被专业名词所迷惑,所谓可达就是可访问):
- 强可达(Strongly Reachable):就是当一个对象可以有一个或多个线程可以不通过各种引用访问到的情况。比如,我们新创建一个对象,那么创建它的线程对它就是强可达。
- 软可达(Softly Reachable):就是当我们只能通过软引用才能访问到对象的状态。
- 弱可达(Weakly Reachable):类似前面提到的,就是无法通过强引用或者软引用访问,只能通过弱引用访问时的状态。这是十分临近 finalize 状态的时机,当弱引用被清除的时候,就符合 finalize 的条件了。
- 幻象可达(Phantom Reachable):就是没有以上引用关联,并且 finalize 过了,只有幻象引用指向这个对象的时候。
- 不可达(unreachable):意味着对象可以被清除了。
但是这种引用关系是站在什么角度看的?是站在线程的角度,站在垃圾回收的角度,如果你站在对象的角度就完全不同,如果你站在对象角度,那就是你引用谁,那有啥对象就都可以引用,对吧,我们来站在对象角度看看引用关系。
- 自己引用根对象
- 自己引用自己:循环引用,你中有我,我中有你
- 自己引用父对象
- 自己引用父对象的父对象
- 自己基于路径的引用
是不是很有意思,哈哈,那回到我的问题,fastJson在序列化的过程中提供了对象的引用检测机制,这种机制只在对象进行嵌套的时候会将对象检测成引用,那不想被检测,关闭了就好了。