手游Java游戏服务器线上真实案例分析

2020-11-10  本文已影响0人  landon30

手游Java游戏服务器线上真实案例分析

灵域

内存泄露


YGC     YGCT    FGC    FGCT     GCT   
171   12.978  81    123.925  136.903

Heap Usage:
New Generation (Eden + 1 Survivor Space):
    capacity = 314048512 (299.5MB)
    used     = 188444480 (179.71466064453125MB)
    free     = 125604032 (119.78533935546875MB)
    60.00489503991027% used
Eden Space:
    capacity = 279183360 (266.25MB)
    used     = 164671168 (157.04266357421875MB)
    free     = 114512192 (109.20733642578125MB)
    58.983160027875584% used
From Space:
    capacity = 34865152 (33.25MB)
    used     = 23773312 (22.6719970703125MB)
    free     = 11091840 (10.5780029296875MB)
    68.18645735432331% used
To Space:
    capacity = 34865152 (33.25MB)
     used     = 0 (0.0MB)
     free     = 34865152 (33.25MB)
    0.0% used
concurrent mark-sweep generation:
    capacity = 2872311808 (2739.25MB)
    used     = 2842293544 (2710.6223526000977MB)
    free     = 30018264 (28.627647399902344MB)
    98.9549092853919% used

num     #instances         #bytes  class name
----------------------------------------------
 1:        609212     1170636376  [B
 2:      40153651      642458416  java.lang.Float
3:       8681504      347260160  san.game.attribute.value.complexValue
4:       2229486      204888400  [Ljava.lang.Object;
5:       6010272      144246528  san.game.attribute.value.byteValue
6:       5008560      120205440  san.game.attribute.value.floatValue
 7:       4063436       97522464  java.util.ArrayList
8:       6010272       96164352     san.game.attribute.changeProcessor.attrChangeProcessor$esProcessor
9:       5728549       91656784  java.lang.Byte
10:        875024       42001152  san.game.talent.TalentSubitem
11:        333904       37397248  san.game.character.GameCharacter
12:       1001712       32054784  san.game.attribute.AttributeModifyer
13:       1268096       30434304  san.game.character.AttrModifySet$Attr
14:        598886       28746528  san.proto.SanCommon$BattleReplayData
15:        633698       25347920  san.game.skill.impls.NormalSkill
16:       1001712       24041088  san.game.attribute.value.intValue
17:        715739       22903648  java.util.HashMap$Node
18:        502983       19150384  [C
19:        272713       16792672  [I
20:        634048       15217152  san.game.character.AttrModifySet
21:        604388       14505312  java.lang.Long
22:        599961       14399064  com.google.protobuf.LiteralByteString

public static ByteString copyFrom(byte[] bytes, int offset, int size) {
    byte[] copy = new byte[size];
    System.arraycopy(bytes, offset, copy, 0, size);
    return new LiteralByteString(copy);
}

public java.lang.String getPlayerName() {
      java.lang.Object ref = playerName_;
      if (ref instanceof java.lang.String) {
    return (java.lang.String) ref;
      } else {
    com.google.protobuf.ByteString bs = 
        (com.google.protobuf.ByteString) ref;
    java.lang.String s = bs.toStringUtf8();
    if (bs.isValidUtf8()) {
      playerName_ = s;
    }
    return s;
      }
    }

public com.google.protobuf.ByteString getPlayerNameBytes() {
  java.lang.Object ref = playerName_;
  if (ref instanceof java.lang.String) {
com.google.protobuf.ByteString b = 
    com.google.protobuf.ByteString.copyFromUtf8(
    (java.lang.String) ref);
playerName_ = b;
return b;
  } else {
return (com.google.protobuf.ByteString) ref;
  }
}

如何计算对象大小


num     #instances         #bytes  class name
----------------------------------------------
   1:       8095738      129531808  java.lang.Float
   3:       1731886       69275440  san.game.attribute.value.complexValue


VM Flags:
Non-default VM flags: 
    -XX:CICompilerCount=3 
    -XX:+HeapDumpOnOutOfMemoryError 
    -XX:InitialHeapSize=4294967296 -XX:MaxHeapSize=4294967296 
    -XX:MaxNewSize=348913664 -XX:MaxTenuringThreshold=6 
    -XX:MinHeapDeltaBytes=196608 -XX:NewSize=348913664 
    -XX:OldPLABSize=16 -XX:OldSize=3946053632 
    -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+UseParNewGC

如何找到java进程占用cpu最高的线程调用


"pool-1-thread-5" #16 prio=5 os_prio=0 tid=0x00007f5c94383800 nid=0x6004 runnable [0x00007f5c6dffe000]
   java.lang.Thread.State: RUNNABLE
    at sun.nio.ch.EPoll.epollWait(Native Method)
    at sun.nio.ch.EPollPort$EventHandlerTask.poll(EPollPort.java:194)
    at sun.nio.ch.EPollPort$EventHandlerTask.run(EPollPort.java:268)
    at sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

登陆压力测试


IOS刷单

礼包码问题


ERROR] GmVerifyGiftCard error : java.lang.IllegalArgumentException: Illegal character in query at index 72: http://charge.ly.xoyo.com/gm_center/gift_card_check.php?cardnum=000223ec
&serverid=10006&username=meizu%26meizu__117598875&channelid=meizu

http://charge.ly.xoyo.com/gm_center/gift_card_check.php?cardnum=000223ec$
&serverid=10006&username=meizu%26meizu__117598875&channelid=meizu  $

金山云LB问题


线上玩家利用WPE抓包修改协议包


合服后启动server失败


"main" prio=10 tid=0x00007fca1c008800 nid=0x3a24 in Object.wait() [0x00007fca2471e000]
        java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x000000078a404548> (a java.lang.Object)
    at java.lang.Object.wait(Object.java:503)
    at san.server.QuitListener.waitBySignal(QuitListener.java:62)
    - locked <0x000000078a404548> (a java.lang.Object)
    at san.server.QuitListener.waitQuit(QuitListener.java:23)
    at san.server.MainEntry.main(MainEntry.java:37)

long loadTime = System.currentTimeMillis();
    while (!globalDataPersistence.checkArenaLoadOver()) {
        if (System.currentTimeMillis() - loadTime >= 10 * 60 * 1000) {
            LogMessage.error("global data load timeout.");
            return false;
        }
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
        }
    }
        return true;
    }

线上刷元宝(防御式编程)

域名扩散

mysql的连接允许的闲置时间

西游降魔篇3D

数据库更新方式

IOS正版无法登陆(小米为发行方)

Cause: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request

大量玩家登陆上线频繁gc

关于新手引导问题引起的客户端卡死

线上数据库某时刻流量极大而且服务器卡

IOS Emoji表情存储


java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1  
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)  
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)  
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)  
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)  
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)  
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620)  
        at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1662)  
        at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1581)

protobuf

上线回档

线上防刷(防御式编程)

classloader

在线执行脚本

排序bug


A
{
long time;
}

compareto(A o)
{ 
 return (int)(o.time - time)
}

if (robTime > o.robTime) {return -1;}
if (robTime < o.robTime) {return 1;}
return 0;

因为客户端无法热更而需要做的一些妥协

服务器提示文本国际化

其他

上一篇 下一篇

猜你喜欢

热点阅读