javainspect的简单介绍
本篇文章给大家谈谈javainspect,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、jmap命令的实现原理解析
- 2、JAVA程序有时候突然停了, 怎么解决?
- 3、求java代码的详细执行过程?顺带说一下eclipse中怎么可以看到代码的执行步骤呢?谢谢
- 4、Java中怎样单步调试?
- 5、java script构建如下所示的界面:
- 6、用eclipse开发java,使用Inspect(放大镜)查看变量值时,显示变量名 cannot be resolved,实际上是有值的,请问
jmap命令的实现原理解析
当服务发生GC问题时,一般会使用jmap工具进行分析,jmap工具很强大,所以有必要了解它的方方面面。
通过histo选项,打印当前java堆中各个对象的数量、大小。
如果添加了live,只会打印活跃的对象。
通过-dump选项,把java堆中的对象dump到本地文件,然后使用MAT进行分析。
如果添加了live,只会dump活跃的对象。
通过-heap选项,打印java堆的配置情况和使用情况,还有使用的GC算法。
通过-finalizerinfo选项,打印那些正在等待执行finalize方法的对象。
通过-permstat选项,打印java堆永久代的信息,包括class loader相关的信息,和interned Strings的信息。
通过jmap和jvm之间进行通信,有两种实现方式:attach 和 SA。
attach方式,简单来说就是客户端和服务端之间的通信,客户端发送请求,主要逻辑在服务端执行,jmap相当于客户端,JVM相当于服务端。
在JVM中,有一个叫"Attach Listener"的线程,专门负责监听attach的请求,并执行对应的操作。
比如现在执行"jmap -histo:live 5409",一步一步的实现如下:
1、在Jmap.java类的main函数中,对参数进行解析。
2、解析出来参数中有“-histo:live”,则执行histo方法:
attach方法建立了jmap进程和JVM之间的socket连接,建立过程可以查看笨神的文章 JVM Attach机制实现 ,后续基于该连接进行通信。
因为命令行中添加了[:live]选项,这里的live参数是true。
再看看heapHisto方法
executeCommand方法基于之前的socket连接向JVM发送了一条"inspectheap"命令,当然了,还有参数。
虚拟机的"Attach Listener"线程当发现有新的命令时,就拿出来处理它。
命令和具体的函数对应关系如下:
和"inspectheap"对应的是heap_inspection方法,实现如下:
live_objects_only的值取决于请求中是否有"-live",再jmap中,取决于是否有":live",所以不管是不是添加了":live",都会有STW过程,时间长短而已。
在VM_GC_HeapInspection的doit方法中
_full_gc的值就是live_objects_only,如果为true,可能会执行一次full gc,清空非活跃的对象,但是可能会因为GC locker,导致跳过本次的GC。
"jmap -dump"实现的原理和"jmap -histo"类似,都是通过attach的方式实现,
attach API的实现方式是:
1、客户端连接到目标JVM,向其发出一个类似“inspectheap”命令;
2、目标JVM接收到命令,执行JVM内相关函数,将收集到的结果以文本形式返回;
3、客户端接收到返回的文本并将其显示出来;
假如执行"jmap -heap 5409",就不会使用attach方式实现了。
在参数解析中,如果参数是"-heap|-heap:format=b|-permstat|-finalizerinfo"中的一种,或者添加了"-F",比如"jmap -histo -F 5409",则使用SA的方式。
SA方式,和attach方式不同的是,相关的主要逻辑都在SA中实现,从JVM中获取数据即可。
可以大概看下"jmap -heap"的实现,对应的实现类是"HeapSummary",内部通过BugSpotAgent工具类attach到目标VM,更具体的底层细节,可以参考 HotSpot Serviceability Agent 实现浅析
执行jmap -heap有些时候可能会导致进程变T,一般是有一个线程在等信号量,这时会block住其它所有线程,可以执行kill -CONT pid进行恢复,不过还是强烈建议别执行这个命令。
JAVA程序有时候突然停了, 怎么解决?
如果是用eclipse自带的tomcat,那么打断点以后,如果程序经过断点,就会直接停住,进入debug模式;如果是用的server启动,需要右键debug模式启动.
如果是突然挂掉,那么控制台报了什么错么
求java代码的详细执行过程?顺带说一下eclipse中怎么可以看到代码的执行步骤呢?谢谢
最基本的操作是:
1.首先在一个java文件中设断点,然后debug as--open debug Dialog,然后在对话框中选类后-- Run
当程序走到断点处就会转到debug视图下。
2.F5键与F6键均为单步调试,F5是step into,也就是进入本行代码中执行,F6是step over,
也就是执行本行代码,跳到下一行,
3.F7是跳出函数
4.F8是执行到最后。
1.Step Into (also F5) 跳入
2.Step Over (also F6) 跳过
3.Step Return (also F7) 执行完当前method,然后return跳出此method
4.step Filter 逐步过滤 一直执行直到遇到未经过滤的位置或断点(设置Filter:window-preferences-java-Debug-step Filtering)
5.resume 重新开始执行debug,一直运行直到遇到breakpoint
6.hit count 设置执行次数 适合程序中的for循环(设置 breakpoint view-右键hit count)
7.inspect 检查 运算。执行一个表达式显示执行值
8.watch 实时地监视变量的变化
9.我们常说的断点(breakpoints)是指line breakpoints,除了line breakpoints,还有其他的断点类型:field(watchpoint)breakpoint,method breakpoint,exception breakpoint.
10.field breakpoint 也叫watchpoint(监视点) 当成员变量被读取或修改时暂挂
11.添加method breakpoint 进入/离开此方法时暂挂(Run-method breakpoint)
12.添加Exception breakpoint 捕抓到Execption时暂挂(待续...)
断点属性:
1.hit count 执行多少次数后暂挂 用于循环
2.enable condition 遇到符合你输入条件(为ture\改变时)就暂挂
3.suspend thread 多线程时暂挂此线程
4.suspend VM 暂挂虚拟机
13.variables 视图里的变量可以改变变量值,在variables 视图选择变量点击右键--change value.一次来进行快速调试。
14.debug 过程中修改了某些code后--〉savebuild--resume--重新暂挂于断点
Java中怎样单步调试?
java单步调试,在你觉得会出错的地方,左边竖条上双击,会出现一个圆圈圈,那就是断点,设置好后,点击java上边的爬虫图标。
运行你的代码,待页面运行到你刚刚打断点的地方,按f6,一步一步向下边运行,如果想查看变量里面的值,就选中你的页面代码变量,右键-inspect,这样就可以了
java script构建如下所示的界面:
!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ""
html xmlns=""
head
meta http-equiv="Content-Type" content="text/html; charset=gb2312" /
titleJava Script 效果测试 Powered By Hero_zhaolei/title
/head
script language="javascript" type="text/javascript"
function check()
{
var checknum="0123456789";
var check=test_form.test_1.value;
if (test_form.test_1.value=="")
{
alert("账号不能为空!");
test_form.test_1.focus();
return false;
}
for(i=0;icheck.length;i++)
{
ch=check.charAt(i);
for(j=0;jchecknum.length;j++)if(ch==checknum.charAt(j))break;
if(j==checknum.length)
{
alert("账号只能填写数字!");
test_form.test_1.focus();
return false;
}
}
if (test_form.test_2.value!=check)
{
alert("两次输入不同!");
test_form.test_2.focus();
return false;
}
}
/script
body
form action="" id="test_form" name="test_form"
table border="1" align="center"
tr
td valign="middle"第一次输入账号:/td
td valign="middle"input name="test_1" type="text" id="test_1"//td
/tr
tr
td valign="middle"第二次输入账号:/td
td valign="middle"input name="test_2" type="text" id="test_2"//td
/tr
tr
td colspan="2" align="center" valign="middle"input name="Submit" type="submit" onclick="return check();" value="检查" //td
/tr
/table
/form
/body
/html
用eclipse开发java,使用Inspect(放大镜)查看变量值时,显示变量名 cannot be resolved,实际上是有值的,请问
问你个问题,你查看变量明时,断点是否已经运行到变量赋值语句之后。即使放在变量命名行也不行。另外,看看你的变量名和放大镜里的变量名一样不,是否误操作
关于javainspect和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。