您的位置:首页 > 编程语言 > Java开发

java远程调试与JVM调优工具

2013-12-24 00:00 113 查看

Java远程调试方法:

1、被调试程序当作调试服务器(本地主动连接远程服务器,需要用如下命令让远程服务器jvm开启调试模式)。

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8765


然后使用eclipse打开工程,并设置断点,右键-》debug-As-》remote java application,新建一个remote 实例。名字随意,工程名不选,填入对应的服务器ip和调试端口号

2、被调程序当作调试客户端(本地打开调试连接端口,让服务器主动连接本地)。

菜单Run-》debug configurations-》remote java application,新建一个remote 实例。选择connectType为socket Listen(默认socket attach,如同1),设置端口号8000,最后服务器端运行如下命令:

-Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000


注意:在eclipse里面加载源代码。

eclipse特殊断点调试:

1. 函数断点 – 可以在执行函数前或者退出函数前中断程序的执行。

如在eclipse中光标悬停在函数上,菜单-》Run-》toggle method breakpoint,则设定了函数断点,最后右键函数断点-》breakpoint properties设定进入Or退出。以下断点设置类似。

2.条件断点 – 可以指定触发断点的条件,避免每次重复触发断点降低调试工作效率。

直接设置断点,右键-》breakpoint properties-》conditional

3. 监视断点 – 可以在访问数据的时候,中断程序的执行。

4. 异常断点 – 当程序发生指定异常的时候,中断程序的执行,第一时间发现问题所在。

5. 类型断点 – 当程序试图加载某个类型的时候,中断程序的执行。

JVM调优

GC简介:

• 所有Java对象都是分配在Java堆上面的;

• Java上使用垃圾回收机制回收没有引用到的对象;

• Java虚拟机有专门的GC线程用来执行垃圾回收;

• 当GC线程从内存删除一个对象时,首先会调用对象的finalize函数,在这个函数里可以执行自定义的释放资源操作;

• Java程序自身无法强制启动GC,即使使用System.gc()和Runtime.gc()这样的函数,也只是递交一个GC请求给GC线程;

• 当无法在Java内存堆(Java heap)上创建对象时,Java虚拟机会抛出OutOfMemoryError。

• 对象没有被其他对象引用,是指从GC Root开始遍历,无法遍历到的对象,GC Root包括:

Class – 系统里加载的类,这些类不会被卸载,类里的静态变量可能会引用其它Java对象。

Thread – 正在运行的线程。

堆栈上的局部变量 – 堆栈上的函数还要运行,因此他们引用到的对象都是有用的。

JNI参数和局部变量。

锁(Monitor) - 用于线程同步。

在GC时,通常young generation里的GC,即minor GC很快,当old generation空间不够时,Java虚拟机首先会尝试CMS GC并行收集,如果这样空间还不能快速回收时,那Java虚拟机会暂停所有线程执行GC,压缩并整理内存空间,重新分配地址空间(即引用),这个时候称为Full GC。一般来说,Full GC的执行效率要比minor GC慢很多,程序优化的目标也是尽量减少Full GC的执行次数。

JMap工具(java memory analysis packager)

1、jmap –heap javaPID,堆的设置信息使用信息

2、jmap –histo javaPID,查看各个对象的占用的内存情况

3、jmap –permstat javaPID,持久代详细使用信息

4、jmap -dump:format=b,file=xxx.dmp javaPID,导出堆信息到文件

先查看java进程id,使用jps命令。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: