yygrender-[Trace]什么bugtrace.dll文件损坏

通过Trace文件了解Oracle控制文件_数据库技术_Linux公社-Linux系统门户网站
你好,游客
通过Trace文件了解Oracle控制文件
来源:Linux社区&
作者:Linux
中的alter database backup 命令用来将控制文件备份为.trc后缀的文本文件。这个文件名的格式为:sid_ora_pid.trc,存储在参数user_dump_dest指定的位置。这个文件里储存的是创建新控制文件的SQL,我们可以通过它来大概了解一下控制文件里都有那些内容。 orcl@ORCL&select * from v$
BANNER----------------------------------------------------------------Oracle9i Enterprise Edition Release 9.2.0.1.0 - ProductionPL/SQL Release 9.2.0.1.0 - ProductionCORE 9.2.0.1.0 ProductionTNS for 32-bit Windows: Version 9.2.0.1.0 - ProductionNLSRTL Version 9.2.0.1.0 - Productionorcl@ORCL&show parameter user_dump_NAME TYPE VALUE------------------------------------ ----------- ------------------------------user_dump_dest string D:\oracle\admin\orcl\udumporcl@ORCL&alter database backup
Database altered.
我们在D:\oracle\admin\orcl\udump这个目录下找到最新生成的那个文件就是刚才对控制文件的备份。这个文件中的内容:
*** SESSION ID:(9.5)
20:40:22.000***
20:40:22.000# The following are current System-scope REDO Log Archival related# parameters and can be included in the database initialization file.## LOG_ARCHIVE_DEST=''# LOG_ARCHIVE_DUPLEX_DEST=''## LOG_ARCHIVE_FORMAT=ARC%S.%T# REMOTE_ARCHIVE_ENABLE=TRUE# LOG_ARCHIVE_MAX_PROCESSES=2# STANDBY_FILE_MANAGEMENT=MANUAL# STANDBY_ARCHIVE_DEST=%ORACLE_HOME%\RDBMS# FAL_CLIENT=''# FAL_SERVER=''## LOG_ARCHIVE_DEST_1='LOCATION=D:\oracle\RDBMS'# LOG_ARCHIVE_DEST_1='MANDATORY NOREOPEN NODELAY'# LOG_ARCHIVE_DEST_1='ARCH NOAFFIRM SYNC'# LOG_ARCHIVE_DEST_1='NOREGISTER NOALTERNATE NODEPENDENCY'# LOG_ARCHIVE_DEST_1='NOMAX_FAILURE NOQUOTA_SIZE NOQUOTA_USED'# LOG_ARCHIVE_DEST_STATE_1=ENABLE## Below are two sets of SQL statements, each of which creates a new# control file and uses it to open the database. The first set opens# the database with the NORESETLOGS option and should be used only if# the current versions of all online logs are available. The second# set opens the database with the RESETLOGS option and should be used# if online logs are unavailable.# The appropriate set of statements can be copied from the trace into# a script file, edited as necessary, and executed when there is a# need to re-create the control file.#2.NORESETLOGS case SQL(包含数据库的日志文件和数据文件的物理位置和大小等信息)
***在联机日志可用的情况下使用下边这些命令重新构建控制文件
# Set #1. NORESETLOGS case## The following commands will create a new control file and use it# to open the database.# Data used by the recovery manager will be lost. Additional logs may# be required for media recovery of offline data files. Use this# only if the current version of all online logs are available.
STARTUP NOMOUNTCREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS NOARCHIVELOG-- SET STANDBY TO MAXIMIZE PERFORMANCEMAXLOGFILES 50MAXLOGMEMBERS 5MAXDATAFILES 100MAXINSTANCES 1MAXLOGHISTORY 226LOGFILEGROUP 1 'D:\ORACLE\ORADATA\ORCL\REDO01.LOG' SIZE 100M,GROUP 2 'D:\ORACLE\ORADATA\ORCL\REDO02.LOG' SIZE 100M,GROUP 3 'D:\ORACLE\ORADATA\ORCL\REDO03.LOG' SIZE 100M-- STANDBY LOGFILEDATAFILE'D:\ORACLE\ORADATA\ORCL\SYSTEM01.DBF','D:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF','D:\ORACLE\ORADATA\ORCL\CWMLITE01.DBF','D:\ORACLE\ORADATA\ORCL\DRSYS01.DBF','D:\ORACLE\ORADATA\ORCL\EXAMPLE01.DBF','D:\ORACLE\ORADATA\ORCL\INDX01.DBF','D:\ORACLE\ORADATA\ORCL\ODM01.DBF','D:\ORACLE\ORADATA\ORCL\TOOLS01.DBF','D:\ORACLE\ORADATA\ORCL\USERS01.DBF','D:\ORACLE\ORADATA\ORCL\XDB01.DBF','D:\ORACLE\ORADATA\ORCL\SCOTT_TABLAESPACE.ORA','D:\ORACLE\ORADATA\ORCL\TEST.DBF'CHARACTER SET ZHS16GBK;**********rman信息*******
# Configure RMAN configuration record 1VARIABLE RECNO NUMBER;EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('RETENTION POLICY','TO RECOVERY WINDOW OF 7 DAYS');# Configure RMAN configuration record 2VARIABLE RECNO NUMBER;EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP','ON');
******其它信息******
# Recovery is required if any of the datafiles are restored backups,# or if the last shutdown was not normal or immediate.RECOVER DATABASE# Database can now be opened normally.ALTER DATABASE OPEN;# Commands to add tempfiles to temporary tablespaces.# Online tempfiles have complete space information.# Other tempfiles may require adjustment.ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\ORACLE\ORADATA\ORCL\TEMP01.DBF'SIZE
REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;# End of tempfile additions.3。RESETLOGS case SQL
在联机日志不可用的情况下使用这些SQL构造控制文件。所有的联机日志将丢失,所有的备份都失效。包含的信息同上边。
# Set #2. RESETLOGS case## The following commands will create a new control file and use it# to open the database.# The contents of online logs will be lost and all backups will# be invalidated. Use this only if online logs are damaged.STARTUP NOMOUNTCREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS NOARCHIVELOG-- SET STANDBY TO MAXIMIZE PERFORMANCEMAXLOGFILES 50MAXLOGMEMBERS 5MAXDATAFILES 100MAXINSTANCES 1MAXLOGHISTORY 226LOGFILEGROUP 1 'D:\ORACLE\ORADATA\ORCL\REDO01.LOG' SIZE 100M,GROUP 2 'D:\ORACLE\ORADATA\ORCL\REDO02.LOG' SIZE 100M,GROUP 3 'D:\ORACLE\ORADATA\ORCL\REDO03.LOG' SIZE 100M-- STANDBY LOGFILEDATAFILE'D:\ORACLE\ORADATA\ORCL\SYSTEM01.DBF','D:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF','D:\ORACLE\ORADATA\ORCL\CWMLITE01.DBF','D:\ORACLE\ORADATA\ORCL\DRSYS01.DBF','D:\ORACLE\ORADATA\ORCL\EXAMPLE01.DBF','D:\ORACLE\ORADATA\ORCL\INDX01.DBF','D:\ORACLE\ORADATA\ORCL\ODM01.DBF','D:\ORACLE\ORADATA\ORCL\TOOLS01.DBF','D:\ORACLE\ORADATA\ORCL\USERS01.DBF','D:\ORACLE\ORADATA\ORCL\XDB01.DBF','D:\ORACLE\ORADATA\ORCL\SCOTT_TABLAESPACE.ORA','D:\ORACLE\ORADATA\ORCL\TEST.DBF'CHARACTER SET ZHS16GBK;# Configure RMAN configuration record 1VARIABLE RECNO NUMBER;EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('RETENTION POLICY','TO RECOVERY WINDOW OF 7 DAYS');# Configure RMAN configuration record 2VARIABLE RECNO NUMBER;EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP','ON');# Recovery is required if any of the datafiles are restored backups,# or if the last shutdown was not normal or immediate.RECOVER DATABASE USING BACKUP CONTROLFILE# Database can now be opened zeroing the online logs.ALTER DATABASE OPEN RESETLOGS;# Commands to add tempfiles to temporary tablespaces.# Online tempfiles have complete space information.# Other tempfiles may require adjustment.ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\ORACLE\ORADATA\ORCL\TEMP01.DBF'SIZE
REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;# End of tempfile additions.
相关资讯 & & &
& (02/03/:05)
& (07/26/:48)
& (07/12/:30)
& (07/31/:18)
& (07/20/:05)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款NS2&trace文件分析脚本(适合无线trace)
网络上有不少awk程序是讲如何分析网络性能的(主要是时延,吞吐量,丢包率和时延抖动),但是都没有详细的说明,我在此作一些示例,添加了一些必要的说明注释。
以下的内容是针对NS2仿真的结果trace文件进行网络性能分析,看本篇前需要先行了解的的内容有:awk语言的基础,包括语法和结构等;在Linux下如何使用xgraph和gnuplot。
因为只是想简单介绍如何用gwak和xgraph/gnuplot处理trace文件得出分析结果,所以并没有写专门的tcl脚本,分析用的tcl脚本和trace文件是一个三节点的无线网络的例子,随篇附后。
本篇主要想介绍如何得到网络的数据传输延迟(delay)、丢包率(drop)、延时抖动(Jitter)和网络的吞吐量(throughtput),下文的四个awk程序所使用的模型主要来自《網路模擬軟體NS2來做網路效能分析需看的文章》一文,除了第四个外程序没有做很大的改动,只是对封包的处理有所不同,同时第一个程序增加了比较详细的注释,方便初学者学习。因为只是想抛砖引玉,所以分析用的数学模型没有刻意去研究,有待大家一起讨论。
一,延时分析。包的延时就是指包的接收时间与包的发送时间差。下面给出awk程序,相关的说明看程序里面的注释。
#BEGIN表明这是程序开头执行的一段语句,且只执行一次。
#程序初始化,设定一变量以记录目前处理的封包的最大ID号码。在awk环境下变量的使用不需要声明,直接赋值。
highest_uid = 0;
#下面大括号里面的内容会针对要进行处理的记录(也就是我们的trace文件)的每一行都重复执行一次
event = $1; #$1表示一行的第一栏,是事件的动作。每一栏默认是以空格分隔的。下同。
time = $2; #事件发生的时间
node_nb = $3; #发生事件的节点号(但是两边夹着“_”,下面一句代码将“_”处理掉)
node_nb=substr(node_nb,2,1); #第三栏的内容是形如_0_的节点号码,我只要得出中间的节点号码0,所以要对字符串_0_进行处理。
trace_type = $4; #trace文件跟踪事件的层次(指在路由层或mac层等等)
flag = $5; #
uid = $6; #包的uid号码(普通包头的uid)
pkt_type = $7; #包的类型(是信令或是数据)
pkt_size = $8; #包的大小(byte)
#下面的代码记录目前最高的CBR流的packet ID,本来的延迟分析是针对所有的包的(包括信令),这里作了简化,只针对CBR封包,以后大家做延时分析可以做相应的改动即可。
if ( event=="s" &&
node_nb==0 && pkt_type=="cbr"
&& uid & highest_uid
{#if判断句的前三个判断条件就不说了,第四个是说每个包的记录次数不超过1
highest_uid =
#记录封包的传送时间
if ( event=="s" &&
node_nb==0 && pkt_type=="cbr"
&& uid==highest_uid )
start_time[uid] = #
start_time[]表明这是一个数组
#记录封包的接收时间
if ( event=="r" &&
node_nb ==2 && pkt_type=="cbr"
&& uid==highest_uid )
end_time[uid] =
#END表明这是程序结束前执行的语句,也只执行一次
#当每行资料都读取完毕后,开始计算有效封包的端到端延迟时间。
for ( packet_id = 0; packet_id &=
highest_ packet_id++ )
start = start_time[packet_id];
end = end_time[packet_id];
packet_duration = end -
#只把接收时间大于传送时间的记录打印出来
if ( start & end ) printf("%d
%f\n", packet_id, packet_duration);
要注意的是上面的awk程序只是在一个层上进行处理的(我是用的mac层),在生成trace文件时把其他层关闭,只留一个层,否则判断条件要多加一个层的判断。下面的其他三个程序也是一样的。
程序写好以后用一个文档保存为pkt_delay和trace文件放于同一文件夹下,然后在终端进入该文件夹,执行:
$:gwak &f delay trace &
然后在文件p中就保存了两列数据:封包的序号和该封包的传送时间。
二,丢包率分析。
#程序初始化,设定变量记录传输以及被丢弃的包的数目
fsDrops = 0; #被丢弃的包的数目
numfs0 = 0; #0节点发送的CBR封包的数目
numfs2 = 0; #2节点接收的CBR封包的数目
event = $1;
time = $2;
node_nb = $3;
trace_type = $4;
flag = $5;
pkt_type = $7;
pkt_size = $8;
node_nb=substr(node_nb,2,1);
#统计节点0发送的CBR封包
if (node_nb==0 &&
event== "s" && trace_type== "MAC"
&& pkt_type== "cbr")
#统计节点2丢弃的CBR封包
if (node_nb==2 &&
event== "r" && trace_type== "MAC"
&& pkt_type== "cbr")
average=0; #average用于记录丢包率
fsDrops = numfs0-numfs2; #丢包数目
average=fsDrops/numfs0; #丢包率
printf("number of packets sent:%d lost_rate:%d\n",
numfs0, average); #打印发送封包数目和丢包率
程序写好以后用一个文档保存为drop和trace文件放于同一文件夹下,然后在终端进入该文件夹,执行:
$:gwak &f drop trace &
文件d中记录了两个数据:发送封包数目和丢包率。
三,延时抖动分析
在这里特别提一下,所用的延时抖动分析的模型是:(封包n2的延时-封包n1的延时)/(n2的包序号-n1的包序号)。
#程序初始化,设定一变量以记录目前处理过的最高封包序号。
highest_uid = 0;
event = $1;
time = $2;
node_nb = $3;
node_nb=substr(node_nb,2,1);
trace_type = $4;
flag = $5;
pkt_type = $7;
pkt_size = $8;
#记录目前最高的CBR封包的ID
if ( event=="s" &&
node_nb==0 && pkt_type=="cbr"
&& uid & highest_uid
highest_uid =
#记录CBR封包的发送时间
if ( event=="s" &&
node_nb==0 && pkt_type=="cbr"
&& uid==highest_uid )
start_time[uid] =
#记录CBR封包的接收时间
if ( event=="r" &&
node_nb ==2 && pkt_type=="cbr"
&& uid==highest_uid )
end_time[uid] =
初始化抖动延时所需的变量
last_seqno = 0;
last_delay = 0;
seqno_diff = 0;
#当资料行全部读取后,开始计算有效封包的端到端延迟时间
for ( packet_id = 0; packet_id &=
highest_ packet_id++ )
start = start_time[packet_id];
end = end_time[packet_id];
packet_duration =end -
#只把接收时间大于发送时间的记录列出来
if ( start & end )
得到了delay值(packet_duration)后计算jitter
seqno_diff = packet_id - last_
delay_diff = packet_duration -
if (seqno_diff == 0)
jitter =0;
jitter = delay_diff/seqno_
#将有效封包序号以及延时抖动打印出来
printf("%d %f\n", packet_id, jitter);
last_seqno = packet_
last_delay = packet_
程序写好以后用一个文档保存为jitter和trace文件放于同一文件夹下,然后在终端进入该文件夹,执行:
$:gwak &f jitter trace &
文件j中记录了有效封包序号以及延时抖动的情况。
四,网络吞吐量分析
网络的吞吐量是网络性能的一个重要参数,是指在不丢包的情况下单位时间内通过的数据包数量,单位是字节每秒或比特每秒。计算其吞吐量是一件复杂的事情,这里的模型是从第一个包发送后,每个包都叠加累算。可能模型不够精准,只是大概的反映,目的只是想让大家了解如何写awk的网络吞吐量分析程序。大家切勿借用本模型在要发表的论文上做分析。
event = $1;
time = $2;
node_nb = $3;
node_nb=substr(node_nb,2,1);
trace_type = $4;
flag = $5;
pkt_type = $7;
pkt_size = $8;
if(event=="r" &&
node_nb==2 && pkt_type=="cbr"
pkt_byte_sum[i+1]=pkt_byte_sum+
if(init==0)
start_time =
end_time =
#为了画图方便,把第一笔记录的throughput设为零,以表示传输开始
printf("%.2f\t%.2f\n", end_time[0], 0);
for(j=1 ; j& j++)
th = pkt_byte_sum[j] / (end_time[j] -
start_time)*8/1000;
printf("%.2f\t%.2f\n", end_time[j],
#看图方便,把最后一笔记录的throughput设置为零,以表示传输
printf("%.2f\t%.2f\n", end_time[i-1],
程序写好以后用一个文档保存为throughtput和trace文件放于同一文件夹下,然后在终端进入该文件夹,执行:
$:gwak &f throughtput trace
文件t中记录了包的接收时间以及吞吐量的情况。
接下来,就是对已经分析得到的结果用图描绘出来。可以用xgraph或者gnuplot。这种绘图工具可以将两列数据中的第一列作横轴,第二列作纵轴用曲线描绘出来。若把数据文件名保存为file,则用xgraph绘图的指令是$:xgraph file;用gnuplot绘图的指令是$:gnuplot,进入gnuplot环境后,可以设置标题,横轴和纵轴的label等:
&set title “titlename”
&set xlabel “xlabelname”
&set ylabel “ylabelname”
然后绘图:
&plot “file” with
lines(用连线方式,gnuplot有九种绘图方式)
下面用gnuplot描绘延时,延时抖动以及吞吐量的图形:
包的延时:
&set title
“pkt_delay-pkt_id”
&set xlabel “packet_id”
&set ylabel
“packet_delay”
&plot “p” with lines
延时抖动:
&set title
“jitter-packet”
&set xlabel “packet_id”
&set ylabel “jitter”
&plot “j” with lines
&set title
“throughtput-time”
&set xlabel “time”
&set ylabel
“throughtput”
&plot “t” with lines
最后需要说明的是:直接拷贝粘贴word文档内的awk程序编译时一般是通不过的,里面有很多空格键需要去掉,相关的格式对齐用Tab键,否则这些格式问题在Linux下会像小虫一样令你头痛不已。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。oracle 实例中bdump 与 udump 文件夹下的trace文件什么时候产生,alert日志在什么时候产生?_百度知道
oracle 实例中bdump 与 udump 文件夹下的trace文件什么时候产生,alert日志在什么时候产生?
提问者采纳
1、trace日志你可以自己产生,有的是系统自动产生的,一般好像是你自己产生的2、alert日志有的畅浮扳簧殖毫帮桐爆昆是系统产生的(比如表空间不足等),有点是你设置了mertic(好像是这样写的),然后当符合你的设置就就会产生。
提问者评价
来自团队:
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁看精神哥放大招,原来读懂ANR的trace文件So easy - 推酷
看精神哥放大招,原来读懂ANR的trace文件So easy
Bugly支持ANR上报后,很多童鞋反馈看不懂上报上来的trace文件,精神哥很担忧,因为读懂trace文件是分析ANR问题的最关键的一步。
Trace文件是个什么鬼?
App的进程发生ANR时,系统让活跃的Top进程都进行了一下dump,进程中的各种Thread就都dump到这个trace文件里了,所以trace文件中包含了每一条线程的运行时状态。
下面给大家详细介绍Thread Dump到底是个什么鬼,相信看完的童鞋,读懂trace文件就So easy了!
一、java线程的状态转换介绍
1.1新建状态(New)
用new语句创建的线程处于新建状态,此时它和其他Java对象一样,仅仅在堆区中被分配了内存。
1.2就绪状态(Runnable)
当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态,Java虚拟机会为它创建方法调用栈和程序计数器。处于这个状态的线程位于可运行池中,等待获得CPU的使用权。
1.3运行状态(Running)
处于这个状态的线程占用CPU,执行程序代码。只有处于就绪状态的线程才有机会转到运行状态。
1.4阻塞状态(Blocked)
阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行。当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU。直到线程重新进入就绪状态,它才有机会转到运行状态。
阻塞状态可分为以下3种:
1)位于对象等待池中的阻塞状态(Blocked in object’s wait pool):当线程处于运行状态时,如果执行了某个对象的wait()方法,Java虚拟机就会把线程放到这个对象的等待池中,这涉及到“线程通信”的内容。
2)位于对象锁池中的阻塞状态(Blocked in object’s lock pool):当线程处于运行状态时,试图获得某个对象的同步锁时,如果该对象的同步锁已经被其他线程占用,Java虚拟机就会把这个线程放到这个对象的锁池中,这涉及到“线程同步”的内容。
3)其他阻塞状态(Otherwise Blocked):当前线程执行了sleep()方法,或者调用了其他线程的join()方法,或者发出了I/O请求时,就会进入这个状态。
1.5死亡状态(Dead)
当线程退出run()方法时,就进入死亡状态,该线程结束生命周期。
二、Thread Dump分析
通过前面1.4部分的方法,获取Thread Dump信息后,对其进行分析;
2.1首先介绍一下Thread Dump信息的各个部分
头部信息:时间,jvm信息
Full thread dump Java HotSpot(TM) Server VM (16.3-b01 mixed mode):
线程info信息块:
1. &Timer-0& daemon prio=10tid=0xac190c00 nid=0xaef in Object.wait() [0xae77d000]
2. java.lang.Thread.State: TIMED_WAITING (on object monitor)
3. atjava.lang.Object.wait(Native Method)
4. -waiting on &0xb3885f60& (a java.util.TaskQueue) ###继续wait
5. atjava.util.TimerThread.mainLoop(Timer.java:509)
6. -locked &0xb3885f60& (a java.util.TaskQueue) ###已经locked
7. atjava.util.TimerThread.run(Timer.java:462)
* 线程名称:Timer-0
* 线程类型:daemon
* 优先级:10,默认是5
* jvm线程id:tid=0xac190c00,jvm内部线程的唯一标识(一般通过java.lang.Thread.getId()获取,通常用自增方式实现。)
* 对应系统线程id(Native Thread ID):nid=0xaef,和top命令查看的线程pid对应,不过一个是10进制,一个是16进制。(可以通过命令:top -H -p pid,查看该进程的所有线程信息)
* 线程状态:in Object.wait().
* 起始栈地址:[0xae77d000]
* Java thread statck trace:上面2~7行的信息。到目前为止这是最重要的数据,Java stack trace提供了大部分信息来精确定位问题根源。
对于thread dump信息,主要关注的是线程的状态和其执行堆栈。现在针对这两个重点部分进行讲解.
1、Java thread statck trace详解
堆栈信息应该逆向解读:程序先执行的是第7行,然后是第6行,依次类推。
- locked &0xb3885f60& (a java.util.ArrayList)
- waiting on &0xb3885f60& (a java.util.ArrayList)
也就是说对象先上锁,锁住对象0xb3885f60,然后释放该对象锁,进入waiting状态。
为啥会出现这样的情况呢?看看下面的java代码示例,就会明白:
synchronized(obj) {
obj.wait();
在堆栈的第一行信息中,进一步标明了线程在代码级的状态,例如:
java.lang.Thread.State: TIMED_WAITING (parking)
解释如下:
This thread tried to enter asynchronized block, but the lock was taken by another thread. This thread isblocked until the lock gets released.
|blocked (on thin lock)|
This is the same state asblocked, but the lock in question is a thin lock.
This thread calledObject.wait() on an object. The thread will remain there until some otherthread sends a notification to that object.
|sleeping|
This thread calledjava.lang.Thread.sleep().
This thread calledjava.util.concurrent.locks.LockSupport.park().
|suspended|
The thread's execution wassuspended by java.lang.Thread.suspend() or a JVMTI agent call.
2、线程状态详解
_The thread is either running or ready to run when it gets its CPU turn._
Wait on condition
_The thread is either sleeping or waiting to be notified by another thread._
该状态出现在线程等待某个条件的发生或者sleep。具体是什么原因,可以结合 stacktrace来分析。
最常见的情况是线程在等待网络的读写,比如当网络数据没有准备好读时,线程处于这种等待状态,而一旦有数据准备好读之后,线程会重新激活,读取并处理数据。在Java引入New IO之前,对于每个网络连接,都有一个对应的线程来处理网络的读写操作,即使没有可读写的数据,线程仍然阻塞在读写操作上,这样有可能造成资源浪费,而且给操作系统的线程调度也带来压力。在New IO里采用了新的机制,编写的服务器程序的性能和可扩展性都得到提高。
如果发现有大量的线程都处在Wait on condition,从线程 stack看, 正等待网络读写,这可能是一个网络瓶颈的征兆。因为网络阻塞导致线程无法执行。
一种情况是网络非常忙,几乎消耗了所有的带宽,仍然有大量数据等待网络读写;另一种情况也可能是网络空闲,但由于路由等问题,导致包无法正常的到达。
所以要结合系统的一些性能观察工具来综合分析,比如netstat统计单位时间的发送包的数目,看是否很明显超过了所在网络带宽的限制;观察cpu的利用率,看系统态的CPU时间是否明显大于用户态的CPU时间;这些都指向由于网络带宽所限导致的网络瓶颈。另外一种出现 Wait on condition的常见情况是该线程在 sleep,等待 sleep的时间到了,将被唤醒。
Waiting for Monitor Entry and in Object.wait()
_The thread is waiting to getthe lock for an object (some other thread may be holding the lock). Thishappens if two or more threads try to execute synchronized code. Note that thelock is always for an object and not for individual methods._
在多线程的 JAVA程序中,实现线程之间的同步,就要说说Monitor。
Monitor是Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 Class的锁。每一个对象都有,也仅有一个monitor。每个Monitor在某个时刻,只能被一个线程拥有,该线程就是 “ActiveThread”,而其它线程都是“Waiting Thread”,分别在两个队列“ Entry Set”和“Wait Set”里面等候。在“Entry Set”中等待的线程状态是“Waiting for monitorentry”,而在“Wait Set”中等待的线程状态是“in Object.wait()”。
先看 “Entry Set”里面的线程。我们称被synchronized保护起来的代码段为临界区。当一个线程申请进入临界区时,它就进入了 “Entry Set”队列。对应的 code就像:
synchronized(obj) {
这时有两种可能性:
1)该 monitor不被其它线程拥有, Entry Set里面也没有其它等待线程。本线程即成为相应类或者对象的 Monitor的 Owner,执行临界区的代码。
2)该 monitor被其它线程拥有,本线程在 Entry Set队列中等待。
在第一种情况下,线程将处于 “Runnable”的状态,而第二种情况下,线程 DUMP会显示处于 “waiting for monitor entry”。
临界区的设置,是为了保证其内部的代码执行的原子性和完整性。但是因为临界区在任何时间只允许线程串行通过,这和我们多线程的程序的初衷是相反的。如果在多线程的程序中,大量使用 synchronized,或者不适当的使用了它,会造成大量线程在临界区的入口等待,造成系统的性能大幅下降。如果在线程 DUMP中发现了这个情况,应该审查源码,改进程序。
再看“Wait Set”里面的线程。当线程获得了Monitor,进入了临界区之后,如果发现线程继续运行的条件没有满足,它则调用对象(一般就是被synchronized的对象)的wait() 方法,放弃Monitor,进入“Wait Set”队列。只有当别的线程在该对象上调用了notify() 或者notifyAll(),“Wait Set”队列中线程才得到机会去竞争,但是只有一个线程获得对象的Monitor,恢复到运行态。在“Wait Set”中的线程, DUMP中表现为:in Object.wait()。
一般,Cpu很忙时,则关注runnable的线程,Cpu很闲时,则关注waiting for monitor entry的线程。
小编有话说:
看到这里,不知道各位同学对于trace文件是否有了新的认识。如果各位同学还有什么困惑,可以关注腾讯Bugly的微信官方帐号,与精神哥进行在线交流,我在那里等待各位的回音哦~
本文系腾讯Bugly特邀文章,转载请注明作者和出处“腾讯Bugly()”
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致}

我要回帖

更多关于 yygrender 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信