接上篇,有兴趣的朋友可以直接拿我的测试代码自行测试,请自行修改诸如线程数,执行时间,序列化的数据量大小等参数。如果想尝试做thread dump,可以打开相关的两个注释,会更方便一些,代码中都有相应的注释可供参考。
测试代码如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package
test;
import
java.io.ByteArrayOutputStream;
import
java.io.IOException;
import
java.io.ObjectOutputStream;
import
java.io.Serializable;
import
java.util.ArrayList;
public
class
Test
implements
Runnable {
//
Notice! set the three test parameter to what you want first
/**
* thread count to run test
*/
private
static
final
int
THREAD_COUNT
=
50
;
/**
* time in seconds to run test
*/
private
static
final
long
TEST_TIME_SECOND
=
1
*
30
;
/**
* during test, we serialize a Data instance with an ArrayList that contains DataItem instance.
* This is to set how many DataItem in the ArrayList.
*/
private
static
final
long
ITEMS_COUNT_IN_TEST_OBJECT
=
1000
;
private
static
int
finishedCount
=
0
;
private
static
boolean
needStop
=
false
;
private
static
Object needStopLock
=
new
Object();
private
static
Object finishedCountLock
=
new
Object();
private
static
boolean
isNeedStop() {
synchronized
(needStopLock) {
return
needStop;
}
}
private
static
void
setNeedStop() {
synchronized
(needStopLock) {
needStop
=
true
;
}
}
private
static
void
addFinisedCount() {
synchronized
(finishedCountLock) {
finishedCount
++
;
}
}
/**
*
@param
args
*/
public
static
void
main(String[] args) {
//
run it first to load all the class
new
Test().test();
//
to dump thread open these
//
try {
//
Thread.sleep(20 * 1000);
//
System.out.println("main sleep. go to find pid, we need it later to send signal");
//
Thread.sleep(2 * 1000);
//
System.out.println("prepard to dump");
//
} catch (InterruptedException e) {
//
e.printStackTrace();
//
}
long
timeBegin
=
System.currentTimeMillis();
for
(
int
i
=
0
; i
<
THREAD_COUNT; i
++
) {
Thread t
=
new
Thread(
new
Test());
t.setName(
"
testthread
"
+
i);
t.start();
}
long
timeEnd
=
timeBegin
+
TEST_TIME_SECOND
*
1000
;
while
(System.currentTimeMillis()
<
timeEnd) {
try
{
Thread.sleep(
50
);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
setNeedStop();
System.out.println(THREAD_COUNT
+
"
thread finished
"
+
finishedCount
+
"
times in
"
+
TEST_TIME_SECOND
+
"
seconds
"
);
//
to dump thread open these
//
try {
//
Thread.sleep(5 * 1000);
//
//
System.out.println("dump now");
//
} catch (InterruptedException e) {
//
e.printStackTrace();
//
}
}
public
void
run() {
while
(
!
isNeedStop()) {
test();
addFinisedCount();
}
}
private
void
test() {
ByteArrayOutputStream bos
=
new
ByteArrayOutputStream();
Data data
=
new
Data();
try
{
//
long time1 = System.currentTimeMillis();
ObjectOutputStream oos
=
new
ObjectOutputStream(bos);
oos.writeObject(data);
bos.toByteArray();
//
long time2 = System.currentTimeMillis();
//
System.out.print((time2 - time1) + " ");
}
catch
(IOException e) {
e.printStackTrace();
}
}
private
static
class
Data
implements
Serializable {
private
static
final
long
serialVersionUID
=
-
376987039014824563L
;
private
static
final
ArrayList DEFAULT
=
new
ArrayList();
static
{
for
(
int
i
=
0
; i
<
ITEMS_COUNT_IN_TEST_OBJECT; i
++
) {
DEFAULT.add(
new
DataItem(i));
//
DEFAULT.add(DataItem.a + i);
}
}
private
ArrayList content
=
DEFAULT;
}
private
static
class
DataItem
implements
Serializable {
private
static
final
long
serialVersionUID
=
1L
;
private
static
final
String a
=
"
sdfsdfsdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
"
;
private
int
number;
private
String content;
public
DataItem(
int
number) {
this
.number
=
number;
this
.content
=
a
+
number;
}
}
}
也可以从这里直接下载到完整的eclipse项目,除上面的代码外,还有thread dump文件和已经设置好的jprobe的配置文件。
(blogjava不能上传文件,所以只好放fs2you)
http://www.fs2you.com/files/59a26119-5d1a-11dd-ad4f-0014221b798a/
分享到:
相关推荐
Java反序列化是一种将已序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种常见方式。在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络间传输对象。然而,这个过程也可能引入...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
反射的应用场景广泛,例如在框架开发中用于动态调用方法,实现插件化,以及在序列化和反序列化过程中发挥作用。 EJB,全称Enterprise JavaBeans,是Java EE平台的一部分,主要用于构建可部署在服务器端的企业级应用...
2. **BAT批处理命令**:这些批处理文件可能用于启动服务器端的EJB容器,注册RMI服务,或者部署和测试应用。 3. **EJB示例**:可能是简单的会话bean或实体bean,展示了如何在EJB中使用RMI-IIOP。 4. **配置文件**:...
Java EE服务器在处理EJB调用时,通常需要将对象序列化,以便在不同的Java虚拟机之间传递。HTTP协议也经常利用对象序列化,例如在Web服务中,将对象编码为JSON或XML格式进行通信。JDK提供了一套内置的序列化机制,...
5. **输入/输出流(I/O)**:Java的I/O流处理涵盖了文件读写、网络通信、数据序列化等多个方面,是进行数据交换的关键部分。 6. **多线程**:Java内置了对多线程的支持,通过Thread类或Runnable接口可以创建并管理...
Java笔试题大集合是针对Java开发者的一份综合测试资料,涵盖了JSP、Java核心和EJB(Enterprise JavaBeans)等关键领域。这份资料对于准备Java相关的面试或笔试具有极高的价值,因为它帮助开发者复习和检验自己的技能...
- **远程方法调用(Remote Method Invocation, RMI)**:客户端通过RMI调用EJB的接口,EJB容器负责透明地处理网络通信和对象序列化。 - **本地接口调用(Local Interface)**:当客户端和EJB在同一个JVM中运行时,...
10. **JSON Processing (JSON-P) and JSON Binding (JSON-B)**:JSON-P用于解析和生成JSON,而JSON-B则提供了将Java对象绑定到JSON的自动序列化和反序列化功能。 在“examples”文件夹中,你可能会找到展示这些技术...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
24. **实例创建方式**:除了`new`关键字外,还可以通过反射、克隆、反序列化等方式创建实例。 25. **类加载机制**:JDK的API类由Bootstrap类加载器加载,Classpath中的类由Extension类加载器加载,而web-inf中的类由...
密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存...
EJB家居工厂模式可能是关于如何动态地创建和管理这些家居实例的源代码,提供了一种灵活的方式来控制EJB的实例化。 7. **EJB命令(EJB Command)** EJB命令模式涉及使用EJBs作为命令对象来执行特定任务。这种方式有...
4. **I/O流**:讲述了Java的输入输出系统,包括字节流、字符流、对象序列化、文件操作、网络通信以及NIO(New IO)框架。 5. **反射与注解**:深入解析了Java的反射机制,允许在运行时动态地获取类的信息并操作对象...
密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存...
这通常涉及XML或者自定义协议的解析和序列化。 在"WTCEJB"这个压缩包文件中,可能包含了以下内容: 1. EJB组件代码:这些Java类实现了EJB接口,处理来自Tuxedo的请求,执行业务逻辑,并返回结果。 2. Tuxedo客户端...
随着EJB版本的更新,CMP在EJB 3.0及后续版本中被JPA(Java Persistence API)所取代,提供了更现代、更灵活的持久化解决方案。 本教程针对EJB 2.0 CMP的实践,适合初学者了解和学习。通过Ejb2.0教程中的代码示例,...
8. 组件模型:EJB2.0的组件模型强调了接口的重要性,Bean通过接口与客户端交互,这增强了代码的可测试性和可重用性。 9. 客户端视图:客户端可以通过本地接口(Local Interface)或远程接口(Remote Interface)与...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
CORBA使用IDL(Interface Definition Language)来定义接口,然后由ORB(Object Request Broker)自动处理对象的定位、序列化和通信细节。 在"ejbcorba.txt"文件中,可能详细描述了以下步骤: 1. **设置环境**:...