[jboss-dev-forums] [Design of JBoss Serialization] - Multithreading
FredrikJ
do-not-reply at jboss.com
Mon Oct 15 04:41:38 EDT 2007
Hi.
We are currently using jboss serialization for a multithreaded server solution. I just ran some performance tests and saw that all my worker-threads were busy and when generating a stacktrace they all are in the same jboss serialization method.
The stacktraces look like:
| "Table-GameEventDaemon-gam1-23" prio=1 tid=0x8a331500 nid=0x2ac0 runnable [0x8662e000..0x8662efa0]
| at org.jboss.serial.classmetamodel.ClassMetamodelFactory$CacheLoaderReference.setCurrentClassLoader(ClassMetamodelFactory.java:92)
| at org.jboss.serial.classmetamodel.ClassMetamodelFactory.getLoaderMap(ClassMetamodelFactory.java:248)
| at org.jboss.serial.classmetamodel.ClassMetamodelFactory.getClassMetaData(ClassMetamodelFactory.java:346)
| at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.describeObject(ObjectDescriptorFactory.java:172)
| at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectOutput.writeObject(DataContainer.java:206)
| at org.jboss.serial.persister.ObjectOutputStreamProxy.writeObjectOverride(ObjectOutputStreamProxy.java:60)
| at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:298)
| at java.util.TreeMap.writeObject(TreeMap.java:1475)
| at sun.reflect.GeneratedMethodAccessor8.invoke(Unknown Source)
| at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
| at java.lang.reflect.Method.invoke(Method.java:585)
| at org.jboss.serial.persister.RegularObjectPersister.writeSlotWithMethod(RegularObjectPersister.java:120)
| at org.jboss.serial.persister.RegularObjectPersister.defaultWrite(RegularObjectPersister.java:86)
| at org.jboss.serial.persister.RegularObjectPersister.writeData(RegularObjectPersister.java:62)
| at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.describeObject(ObjectDescriptorFactory.java:276)
| at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectOutput.writeObject(DataContainer.java:206)
| at org.jboss.serial.io.JBossObjectOutputStream.writeObjectOverride(JBossObjectOutputStream.java:181)
| at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:298)
| at com.game.util.Serializer.serialize(Serializer.java:29)
The code used to serialize the objects is written like:
public final static byte[] serialize(Object o) throws IOException {
| ByteArrayOutputStream ba = new ByteArrayOutputStream();
| BufferedOutputStream bo = new BufferedOutputStream(ba);
| JBossObjectOutputStream out = new JBossObjectOutputStream(bo);
| out.writeObject(o);
| out.flush();
| return ba.toByteArray();
| }
So, why are all threads choking at setCurrentClassloader? Is that an expensive operation?
Also, is there any way we can improve the throughput here, either by rewriting the serialize(...) method or by pooling some resources?
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4095131#4095131
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4095131
More information about the jboss-dev-forums
mailing list