[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