0

WebLogic11g0.6.6のGrailsでMessagePackforJavaを使用して、文字列データをシリアル化します...2.0(10.3)

public void serialize(Object object, OutputStream outputStream) 
   throws IOException {
   byte[] bytes = MessagePack.pack(object);
   outputStream.write(bytes);
   outputStream.flush();
}

WebLogicで発生している問題は、多数のSTUCKスレッドであるため、スレッドスタックをダンプし、一部のスレッドがスタックしていることを確認しましorg.msgpack.template.TemplateRegistry.lookup(TemplateRegistry:198)た。以下のダンプを参照してください。MessagePack.pack()上記の例では、スレッドセーフな方法で使用していることが明らかであるため、コードによってこの問題が発生しなかったと確信しています。TemplateRegistry.javaの198行目を見るlookup()と同期されていますが、スレッドのスタックが発生している理由がわかりません。

        "[STUCK] ExecuteThread: 
    '1' for queue: 'weblogic.kernel.Default (self-tuning)'" id=43 idx=0xec tid=60 prio=1 alive, in native, blocked, daemon

-- Blocked trying to get lock: org/msgpack/template/TemplateRegistry@0xfffffffe8c2fb8e8[fat lock]
    at jrockit/vm/Threads.waitForUnblockSignal()V(Native Method)
    at jrockit/vm/Locks.fatLockBlockOrSpin(Locks.java:1679)[optimized]
    at jrockit/vm/Locks.lockFat(Locks.java:1780)[optimized]
    at jrockit/vm/Locks.monitorEnterSecondStageHard(Locks.java:1312)[optimized]
    at jrockit/vm/Locks.monitorEnterSecondStage(Locks.java:1259)[optimized]
    at jrockit/vm/Locks.monitorEnter(Locks.java:2466)[inlined]
    at jrockit/vm/Locks.monitorEnterForced(Locks.java:859)[optimized]
    at jrockit/vm/RNI.c2java(JJJJJ)V(Native Method)   
    at jrockit/vm/Locks.monitorEnterUnmatched(Ljava/lang/Object;)V(Native Method)
    at org/msgpack/template/TemplateRegistry.lookup(TemplateRegistry.java:198)[optimized]         
    at org/msgpack/MessagePack.write(MessagePack.java:195)[inlined]
    at org/msgpack/MessagePack.pack(MessagePack.java:639)[inlined]
4

3 に答える 3

1

現在のMessagePackJavaDocによると、静的pack(Object v)メソッドは非推奨であり、静的ではないメソッドwrite(Object)を使用することをお勧めします。

使用例:

MessagePack msgpack = new MessagePack();
byte[] bytes = msgpack.write(object);

writeメソッドを使用して問題が解決するかどうかを確認できますか?

于 2012-08-31T08:49:41.573 に答える
1

このブログにあるように、packerとunpackerを使用する必要があります。

MessagePack msgpack = new MessagePack(); // singleton
Packer packer = msgpack.createPacker(outputStream); // createPacker every time
packer.write(object);

新しいMessagePack()は毎回クラスをロードするため、次のコードを実行しすぎると、 permgenメモリエラーが発生する可能性があります。

MessagePack msgpack = new MessagePack();
byte[] bytes = msgpack.write(object);
于 2014-02-06T10:04:09.783 に答える
0

MessagePack.write()が自動的にパッカーを作成する限り、手動でパッカーを作成することは意味がないと思います。

public byte [] write(T v)throws IOException {BufferPacker pk = createBufferPacker();

私はあなたが話しているpermgenエラーを持っているので、私が考えているのは、すべてのアプリで1つのMessagePackインスタンスを使用することですが、どう思いますか?

于 2015-03-13T16:59:23.463 に答える