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里面加载源代码。
1. 函数断点 – 可以在执行函数前或者退出函数前中断程序的执行。
如在eclipse中光标悬停在函数上,菜单-》Run-》toggle method breakpoint,则设定了函数断点,最后右键函数断点-》breakpoint properties设定进入Or退出。以下断点设置类似。
2.条件断点 – 可以指定触发断点的条件,避免每次重复触发断点降低调试工作效率。
直接设置断点,右键-》breakpoint properties-》conditional
3. 监视断点 – 可以在访问数据的时候,中断程序的执行。
4. 异常断点 – 当程序发生指定异常的时候,中断程序的执行,第一时间发现问题所在。
5. 类型断点 – 当程序试图加载某个类型的时候,中断程序的执行。
• 所有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的执行次数。
1、jmap –heap javaPID,堆的设置信息和使用信息
2、jmap –histo javaPID,查看各个对象的占用的内存情况
3、jmap –permstat javaPID,持久代详细使用信息
4、jmap -dump:format=b,file=xxx.dmp javaPID,导出堆信息到文件
先查看java进程id,使用jps命令。