当前位置: 首页 > news >正文

网站建设运营公司大全建好了网站怎么做外贸

网站建设运营公司大全,建好了网站怎么做外贸,淘宝网官方网站,怎么建公司网站教程现象QA同学反映登录不上服务器排查问题1–日志级别查看log,发现玩家登录的时候抛出了一个java.lang.OutOfMemoryError大概代码是向Redis序列化一个PlayerMirror镜像数据,但是在JSON.toJSONString的时候出现了错误.比较清晰#xff0c;即序列化的时候expandCapacity,内存不足。…现象QA同学反映登录不上服务器排查问题1–日志级别查看log,发现玩家登录的时候抛出了一个java.lang.OutOfMemoryError大概代码是向Redis序列化一个PlayerMirror镜像数据,但是在JSON.toJSONString的时候出现了错误.比较清晰即序列化的时候expandCapacity,内存不足。又看了一下日志有好几个OutOfMemoryError,都是类似于用fastjson序列化PlayerMirror报的错误又仔细看了一下server目录发现了几个.hprof,说明确实发生了堆内存溢出因为启动参数增加了’-XX:HeapDumpOnOutOfMemoryError’at java.lang.OutOfMemoryError.()V (OutOfMemoryError.java:48)at com.alibaba.fastjson.serializer.SerializeWriter.expandCapacity(I)V (SerializeWriter.java:249)复制-rw------- 1 xx xx 2043416350 Nov 24 11:37 java_pid8068.hprof-rw------- 1 xx xx 2028797313 Nov 24 11:17 java_pid4671.hprof-rw------- 1 xx xx 1477222612 Nov 23 23:25 java_pid31563.hprof复制排查问题2–JVM命令级别使用了jvm命令初步排查一下问题 jstat -gcutil pidjstat -gc pidjmap -histo pidjmap -heap pidjstat看到老年代基本已经满了jmap看到排名前两位的分别是Object[]和char[]num #instances #bytes class name----------------------------------------------1: 146219 741203672 [Ljava.lang.Object;2: 2842356 639498168 [C复制排查问题3–专业工具级别因为了hprof,所以只需要用专业的内存分析工具mat即可 mat#Open Heap Dump,载入后直接出来一个Getting Started Wizard#Leak Suspects Report,即内存泄露的报告,选择finish 两个怀疑的问题:其中有一个JSONArray的实例就占用了大约700M内存另外一个是线程的local Variables占用了500M内存点开问题1详情发现这个JSONArray是配置类PersonalityStrengthenConfig#cost字段仔细看一下这个JSONArray#list#elementData的数组长度是可怕的183842095。点开问题2详情第一张图可以看到fastjson内部的SerializeWriter中中buf#char[]长度竟然是可怕的262012306而第二种图的堆栈信息可以看到是在序列化PersonalityStrengthenConfig抛出的内存溢出。结合两个问题比较能容易的想到答案PersonalityStrengthenConfig中的cost字段(JSONArray)占用了大量的内存而玩家下线或者上线的时候要序列化一部分数据到redis,其中就包括这个PersonalityStrengthenConfig所以也要序列化这个超级大的cost而序列化要申请空间所以就内存溢出了。分析问题1–观察数据为什么数据配置类PersonalityStrengthenConfig会被序列化呢因为玩家下线的时候需要序列化一个玩家镜像数据到redis Player-Hero-HeroPersonality-getConfig(PersonalityStrengthenConfig) HeroPersonality有一个get方法,而做序列化的这个同学忘记加了SerializerFeature.IgnoreNonFieldGetter这个参数所以导致getConfig中的这个config对象被序列化进去了修改完毕代码后所有的问题都没有了。需要确认一下:PersonalityStrengthenConfig#cost这个JsonArray为什么占这么大空间能看一下里面都是什么在mat中怀疑的第一个怀疑报告中点击PersonalityStrengthenConfig0x8140c468对象,左侧Inspector页面有一个Attributes,找到cost右键-List Objects-with outgoing references从下图可以看到这个JSONAray内部出了第一个元素是一个正常的JSONObject外其他的全部为null当然你可以从第二个怀疑报告中将SerializeWriter中的buf#char[]数据拷贝出来-单击-Copy-Save Value to File.当然这个文件几百M(且只有一行)非常大普通的文本编辑器根本看不出来(我在linux上使用了tail然后不断的ctrlc 最终看到了数据的开头),而这个数据也是当序列化到了config#cost字段时,只有一个正常的数据其他后面全部为null所以数据问题确认完毕:cost字段里面除了一个正常的JSONObject外剩余的全部是null。分析问题2–尝试重现最初的解决方法很简单 尝试通过代码方式能否复现即new一个HeroPersonality,其内部有一个getConfig,使用没有加IgnoreNonFieldGetter的方式序列化,看是否会造成大内存的占用很遗憾未能复现HeroPersonality hp new HeroPersonality();hp.setPersonalityLevel(1);String str JSON.toJSONString(hp);复制然后尝试还原数值表最近的几个版本看看是否有问题这个就是怀疑策划配置表有问题 导致这个cost字段在某些特殊情况下会如可能在加载的时候就变的很大不过很遗憾未能复现。分析源代码 确认是否可能启动加载配置表后这个cost字段就很大debug DataConfigService 发现的第一个问题是这个类混用了json-lib和fastjson(这个框架已更新我们项目一直未更新)这里怀疑是否是json-lib有bug发现反序列化的过程是JSONLexer#扫描如大括号,逗号,方括号。先找到了配置表的的第一个JSONObject,然后加到cost数组(注意此时JSONArray#list的底层数组长度已经被expand到了长度10) 然后遇到RBRACKET,就结束扫描了。看到这里就有一个想法 是否是有可能遇到了特殊字符,如fastjson中的循环引用进而猜测到是否是策划配置的时候配置了公式而且我也各种尝试在json的cost字段加各种特殊字符很遗憾经过验证 未能复现。尝试仔细看了一下堆快照将PersonalityStrengthenConfig的10个对象内部数据都看了一下和svn的策划表对比了一下确认了是某个版本的数据。而这个版本的数据在本地测试是没有任何问题的排除策划配置数据问题。分析问题3–山重水复疑无路在我写本地测试代码重现的时候我写了一个反序列化HeroPersonality的例子先用HeroPersonality序列化为一堆字符串,然后尝试在这堆字符串加入一些额外信息,然后再反序列化不经意的发现当进行一次HeroPersonality的反序列化后 再将原来的HeroPersonality再次序列化输出时惊奇的发现序列化后的cost字段多了一个null然后我就将反序列化代码放在循环里 然后再次输出 发现cost字段被加了很多null。伪测试代码PersonalityStrengthenConfig config DataConfigService.getSettingById(PersonalityStrengthenConfig.class, 1);System.out.println(dcs.config1: config.cost);System.out.println(dcs.config1: config.attr_num);for (int i 0; i 10; i) {String str1 {...};JSON.parseObject(str1, HeroPersonality.class);}System.out.println(dcs.config2: config.cost);System.out.println(dcs.config2: config.attr_num);复制结果输出这个结果让我惊喜让我非常的肯定cost中的大量null就是这样产生的,而且我最早就怀疑HeroPersonality中有一些非序列化的get方法有一些问题;而同样的attr_num也是JSONArray类型就没有任何问题.问题初步锁定在HeroPersonality中的一个get方法.分析问题4–源代码跟踪需要源代码debug为什么在不断的调用反序列化的时候cost被加入了大量的null下面这个是HeroPersonality的两个get方法可以看到其中的getNextTrainCost调用了getConfig字段cost字段,下面从源代码debug的角度看一下为什么会每次反序列化都多了很多null。首先getNextTrainCost这个getter中的nextTrainCost被当成了一个field因为其返回值是一个JSONArray,其本身是可以作为setter用到的。其反序列化用json中nextTrainCost相关反序列化该字符串是[{.config.cost[0]} 即使用了fastjson的循环引用,这个反序列化出来为[null] (因为本身config压根就不属于field,只是一个get方法而已)然后调用setter(本身就是一个setter),得到cost,然后将这个[null] add到cost上然后每反序列化一次都向cost中加入一个[null],进而使cost越来越大(JSONArray#底层数组还会自动expand)public JSONArray getNextTrainCost(){return ((PersonalityStrengthenConfig) getConfig()).cost;}Overridepublic DataConfigItem getConfig(){return DataConfigService.getSettingById(PersonalityStrengthenConfig.class,personalityLevel);}复制反序列化nextTrainCost// FieldDeserializer#setValue 其中method就是getNextTrainCost() 即获取方法的返回值然后加了一个nullCollection collection (Collection) method.invoke(object);if (collection ! null) {collection.addAll((Collection) value);}复制分析问题5–问题初步总结第一个问题出在了HeroPersonality中的getNextTrainCost方法引用了getConfig中的cost导致在反序列化的时候每次会将json#nextTrainCost中反序列化出来的JSONArray#add到cost上(相当于调用了setter方法)注意即使json#nextTrainCost不是循环引用(fastjson可关闭),即值就是引用的config#cost值,则每次反序列化一样也会将反序列化出来的JSONArray#add到cost只不过这次不会是null而已第二个问题是最开始提到的我们正常序列化的时候就要带上IgnoreNonFieldGetter这个参数不要将非field的get方法给序列化上去加上参数后序列化后的json就没有nextTrainCost了,那么也就不会有反序列化的问题了因为压根就扫描不到当然HeroPersonality这个getNextTrainCost也比较奇葩用了引用的方式其实完全没有必要可以考虑干掉。解决问题1–为什么cost会那么大刚才我们已经基本肯定是因为错误模式下的反序列化会导致cost字段会越来越大那么也不至于上亿次吧?这个我大概查了一下代码很大几率是好友推荐模块和相关模块。相关代码需要较频繁的对于离线镜像反序列化或者存在类似心跳业务处理解决办法很简单就是一定要记住fastjson序列化的时候要加上IgnoreNonFieldGetter就可以了。扩展mat还有很多强大的使用功能Hisogram: list Number of instances per classDominator: TreeList the biggest objects and what they keep aliveTop Consumers: Print the most expensive objects grouped by class and by packageList Objects…此外还可以查看线程、Class Loader Explorer等
http://www.zqtcl.cn/news/976247/

相关文章:

  • 网站建设的pest分析公司erp系统
  • 网站开发一般用哪个浏览器高端酒店网站模板
  • 响应式网站开发哪个好徐州关键字优化咨询
  • 企业建站都有什么网站宁波那家公司做网站好
  • 哪里有零基础网站建设教学培训网页制作要多少钱
  • 云南建站网站建设的编程技术
  • 知名的饰品行业网站开发wordpress镜像存储插件
  • 网站整体地图怎么做小榄公司网站建设
  • 体育西网站开发方案无锡锡山区建设局网站
  • 房地产 网站 欣赏建网站找谁
  • 网站创建一般创建哪种类型沈阳装修公司报价
  • 如何在网站后台做网页寻找赣州网站建设
  • 生态农庄网站模板志鸿优化网下载
  • 如何做企业网站广州企业宣传片
  • wordpress淘宝客建站舆情中心
  • 昆明做网站多少钱南宁网站建设培训班
  • 万网一台虚拟主机做多个网站wordpress畅言插件
  • 南宁网站建设优势辽宁大连直客部七部电话
  • 淮安网站建设报价.net网站制作
  • 做母亲节网站的素材最好用的搜索引擎排名
  • 免费创建个人网站网站怎么做下载内容
  • 网站群建设路径桥头网站建设
  • 网站建设创业经历深圳龙华区教师招聘
  • 网站开发的形式全网营销代运营
  • 集团网站设计方案wordpress+仿简书模板
  • 展览馆网站建设方案书wordpress怎么重装
  • 做半成品网站网站开发合同模板
  • 建筑工程师的工作内容山东网站营销优化开发
  • 织梦网站首页错位淄博汽车网站建设
  • 匿名聊天网站开发长沙关键词快速排名