「java堆栈调试」Java 堆 栈
今天给各位分享java堆栈调试的知识,其中也会对Java 堆 栈进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
JAVA堆栈在哪里设置?
堆栈设置无疑是要适当理解和设置的最重要环节。 过度严格的内存设置要么使Tomcat运行很慢,要么报OutOfMemoryError的错误信息,使工作不正常。内存设置过大,要么因不能平均分配如此大量的内存而无法启动JVM,要么能启动运行正常,但却耗用了超出所需的过量计算机内存,而且计算机上的其他软件也无法运行(因为必要的内存已分配给Tomcat)。 之前关于JVM设置选项详解中显示的-Xmx和-Xms设置值为384MB,但这不一定是计算机的适用内存,即使是适用的,也未必就是Tomcat所要的内存大小。到底多大内存是最适合的,需要经验来决定不同内存的大小。
以小的和大的启动堆栈内存配置Tomcat JVM,都会引发网页响应时间超出Java VM堆栈的最大值的某种问题(如果需要堆栈也跟着增长)。 因为Tomcat正在提供响应时会占用大量的时间重新分配内存,所以如果您不希望性能出现类似的问题,一定要让-Xms和Xmx开关值就是所需内存的相同大小,从而保证JVM在操作过程中从不需要重新分配堆栈内存。
在调用驻留于CATALINA_HOME/bin的Tomcat脚本之前,可以设置JAVA_OPTS环境变量值,以设置这些JVM启动的任意开关。将JAVA_OPTS设置成包含任意开关、以空格分开的字符串。
为了可以连接远程调试器,且想阻调试模式启动Tomcat JVM,那么可以按如下方式设置JAVA_OPTS环境变量:
JAVA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"
以上语句允许您通过Tomcat主机上的8000端口连接一个JPDA远程调试器客户端(例如,任何Java IDE),并调试Tomcat JVM中运行的任何代码。您可随意定制所喜欢的端口号。
如果想通过JMX远程客户端连接到Tomcat以实现本地管理和,或监控,请使用下列设置:
JAVA_OPTS="-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jxremote.ssl=false
-Dcom.sun.managerment.jmxremote.authenticate=false"
这些设置允许您在同一台运行Tomcat的机器上使用JMX控制台(如JDK自带的jconsole),如果想远程使用JMX控制台,则使用下列这些设置:
JAVA_OPTS="-Dcom.sun.management.jmxremote.port=8080
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxmote.password.file=/path/to/pw/file"
这些设置允许您从另一台机器上用TCP 8008端口连接到Tomcat JVM上。 您也可以设置-Dcom.sun.management.jmxremote.authenticate=truen,然后在JMX远程口令文件中设置-Dcom.sun.management.jmxmote.password.file=/path/to/pw/file路径,从而只有您及您授权的用户可以连接到Tomcat JVM上。
Java堆栈溢出的机制与原理
Java堆栈溢出的出现 很让人痛苦的事情 很多时候都无法找到头绪 这里作者通过使用jrockit调用程序才最终发现了问题的所在 在很多情况下 Java堆栈溢出 很有可能是你的代码中用到数组 到你的索引超出范围了
java lang OutOfMemoryError: Java heap space
在Java程序运行中可能会报如上的错误 通常是在运行过程中内存占用了没有别释放造成的
以前可能没法跟踪可能是很痛苦的事情 现在好了 我们有一个调试软件可以用了 在生产环境下使用的jRockit软件进行调试 是Oracle公司出品的
前两天试用了一下真的很不错
前阵子有个程序跑 个礼拜左右就会出现Java堆栈溢出 始终找不到头绪 后来使用jrockit才找到问题的出处
jrockit是可以调试远程程序也可以调试本地程序的
具体调试步骤
(一)
如果是调试本地程序的话 启动jrockit 然后启动本地需要调试的程序 会在左侧工具栏 本地目录下创建一个连接为需要调试的程序 在上面点击右键 就会启动跟踪
如何跟踪呢 我的办法就是等 在跟踪开始后 进行截图 然后等程序运行一段时间后查找堆增长比较大的并且一直没有释放的变量
(二)
然后在上面点击右键 显示分配跟踪
(三)
然后找到对应的方法 然后就去找问题吧 看看是不是那个地方有内存一直没有释放啊
然后说点我自己的小经验 也许是不对的 但是我在我的应用里面确实是有效的
在经常需要调用的地方将变量设成全局的甚至是静态的 我的操作是设成全局的了 图省事呢 呵呵 因为我的变量时全局都要调用的而且是频繁调用的
用完的变量一定要记得让它等于null 否则执行gc()貌似是不给回收的
基本上jrockit跟踪是很强的 都能够找到你的问题所在 要仔细观察 改完程序后记得再重新跟踪下直到没有内存泄露为止
写完手工
lishixinzhi/Article/program/Java/hx/201311/26094
JAVA调试技术
这份材料介绍JAVA的调试技术 范围涵盖普通程序和服务器端程序的调试 很多程序员并没有认识到排除软件的错误的价值 如果你是一个JAVA开发者 就很值得读一读这个材料 在现代工具的帮助下 开发者成为一个好的调试者和成为一个好的程序员的重要性一样 这个材料假设你已经有基本的JAVA编程的知识 如果你精通JAVA 这个材料也可以增加你很多知识 如果你有其他语言的调试经验 你可以跳过基本知识部分 即使是高级程序员开发的小程序也可能包含错误 你只需要理解调试的概念并熟悉合适的工具就可以成为好的调试者 这份材料将讲解JAVA调试的基本概念 也讨论高级的调试类型 我们将浏览不同的技术并且提供一些好的建议去帮助避免 追踪并最终修正程序的错误 我们将通过一个调试范例以使你熟悉调试技术 我们也将使用开发源代码工具Jikes 和JDB向你演示如何调试服务器端和客户端程序 为了编译和运行范例代码 你需要先安装一个Java Development Kit (JDK) 你可以参考后面的部分获得Jikes 和 JDB调试器 关于作者 如果对这个材料的内容有任何问题 你可以联系作者Laura Bennett 如果对中文版的翻译有何意见和建议 请联系翻译者cherami Laura Bennett 是IBM的资深软件工程师 她获得Pace大学的计算机科学学士学位和Columbia大学的计算机科学硕士学位 她是developerWorks的JAVA传教士 同时也是站点的建设者 在他的空余时间 她喜欢和她的Lego MindStorm 机器人玩乐以及和她四岁大的TinkerToys搭建物体 Cherami是一个软件工程师 闲暇之余翻译一些计算机文献 以期为中国的计算机软件事业做出一点微薄的贡献 调试的基础知识 开始的情况 在JAVA语言的早期 一个典型的开发者使用非常陈旧的方法调试程序 使用System out println() 方法 代码的跟踪信息被打印到控制台 文件或者套接字 很少有人能在第一次就写出完美的(没有任何错误)代码 因此 市场认识到了对于像C++ 程序员使用的调试器那样的工具的需要 Java开发者现在有很多调试工具可以选择 选择什么样的工具依赖于你的技术等级 通常新手使用GUI调试工具而有更多经验的程序员趋向于避免使用所见即所得的工具而更关心有更多的控制能力 没有哪个开发者不使用任何调试工具 调试器允许你穿越代码 冻结输出以及检查变量 开发者越有经验 调试工具越可以帮助他更快定位程序问题的位置 Java调试器的类型 这里有几种Java调试技术的工具: IDE(集成开发环境) 包含它们自己的调试器 (例如IBM的VisualAge for Java Symantec Visual Café以及 Borland JBuilder) 单独的GUI工具 (例如Jikes Java 平台调试器 javadt 以及JProbe) 基于文本和命令行的工具 (例如Sun JDB) 野蛮的使用编辑器 (例如Notepad 或者 VI) 检查堆栈描绘(stack traces)你使用的 JDK JSDI JSP 和HTML对你的选择都有影响 IDE 和独立的GUI 调试器对于初学者是最容易的并且被证明是最节省时间的 调试器将引导你到程序崩溃的地方 在调试器里面执行程序 使用鼠标设置断点并穿越代码 使用这些调试器的不利方面是并非所有的IDE调试器都支持最新的Java API和技术 (例如servlets 和 EJB 组件) 基于文本和野蛮的使用编辑器的技术提供更多的控制但是对于没有太多经验的程序员可能会花费更长的时间找出错误 我们称它们为 可怜人的 调试方法 如果上面的都不满足你的需求 Java平台引入Java Debugging APIs使你可以创建符合你自己特定需求的调试器 调试类型 这儿有很多调试方法 无论是在客户端还是服务器端 我们在这个材料里面包含下面的方法: 基本的Java字节码 (也就是使用System out println()) 使用注释 附加在一个正在运行的程序上 远程调试 需求调试(Debugging on demand) 优化代码的调试 Servlet JSP 文件以及EJB 组件的调试在后面会详细说明每一种类型的调试 共同的错误类型 为了给你一个你将遇到什么的提示 我们在下面列出了开发者一次又一次遇到的编辑或句法错误 是你最先和最容易遇到的错误 它们通常是键入错误引起的 逻辑错误 不同于运行时错误 因为没有任何异常被抛出 但是输出不是期望的东西 这些错误的范围从缓冲区溢出到内存泄漏 运行时错误 在程序执行时发生并且通常产生一个Java异常 线程错误 是最难重复和跟踪的 Java debugging APIs Sun已经定义了调试的结构 它们称之为JBUG 这是为了回应对真正的Java调试器的需要做出的 这些APIs帮助程序员建立符合自己需要的调试器: 接口应该和语言的风格一样是面向对象的 例如线程和监视器这样的Java运行时特性应该被前面的支持 可以进行远程调试 在通常操作下的安全性不能被损害 修正的Java Debugger (JDB) 既是体现Java Debugging API的概念 同时又是一个有用的调试工具 它用Java Debug Interface (JDI)重写并且是JDK的一部分 JDB将在后面详细讨论 准备一个调试用的程序 Java平台为调试过程提供语言支持 你在用编译器编译你的程序时可以用编译选项指示编译器在目标文件中产生符号信息 如果你使用其它的编译器而不是javac 参考你的编译器的文档获得如何生成带有调试信息的目标文件 如果你使用javac 编译器创建调试代码 使用 g 编译选项 这个选项让你在调试的时候可以检查本机类实例和静态变量 如果你没有使用该选项生成你的类文件你也可以设置断点和追踪代码 但是你将不能检查变量 (断点是手工指定的程序运行停止的点 ) 即使你使用 g选项编译你的程序也不能调试JAVA平台的核心系统类的局部变量 如果你需要列出某些系统类的局部变量的列表 你需要使用 g选项编译这些类 也就是使用 g选项重新编译rt jar 的类或者是 src zip 里面的文件 然后指定你的 classpath 为正确的类文件使你用新编译的类运行你的程序 在Java 下 使用 boot classpath 选项使得新类被首先加载 记住如果你使用 O 选项优化你的代码 你就不能调试你的类 优化会将所有的调试信息从类中去掉 注意: 检查你的 CLASSPATH 环境变量是正确的才能让调试器和Java 程序知道在哪儿寻找你的类库 你也应该检查你的调试工具看是否需要其它的什么或者是环境变量 设置断点 调试的第一步就是找到代码出错的位置 断点设置能帮你完成这个 断点是你你放置在程序里面的临时标记 它使得调试器知道在哪儿停止程序的执行 例如 如果程序里面的某个申明引发问题 你可以将断点设置在包含那个申明的行上 然后运行程序 在那个申明被执行前程序停止执行 然后你可以检查变量 寄存器 存储器以及堆栈的内容 然后跨过(或执行)那个申明查看问题是怎么引起的 不同的调试器支持不同的断点 一些通用的类型是: 行断点 在程序特定行的代码被执行前被引发 方法断点 在到达被设置成断点的方法时被引发 计数断点 在某个计数器达到或超过某个特定值时被引发 异常断点 在代码抛出一个特定异常时被引发 储存变化断点 在存储在特定地址范围的内容被修改时引发 地址断点 在被设置成断点的地址达到时被引发注意: 一些调试器只在编译版本的Java代码 (使用just in time 编译器生成的代码) 上支持某些断点类型而不支持解释代码(使用javac 工具生成的代码) 一个例子就是地址断点 每个工具在你能设置断点的方式上可能有些不同 检查你的工具的文档 你可能会问 我如何知道在哪儿放置断点? 如果你对这个问题完全没有感觉 你可以在main() 方法的开始设置断点 如果你的代码产生堆栈复写(stack trace) 在程序产生它的地方设置断点 你将在堆栈复写里面看到源代码中出问题的行号 如果你的输出或者图形显示的特定部分没有正确的显示预定信息(例如文本域显示错误的文本) 你可以在该组件被创建的地方设置断点 然后你可以单步执行你的程序显示和GUI对象相关的值 经验将在最合适的地方设置断点 你在一个类或者程序里面可以设置多个断点 通常 你在调试代码的时候会禁止 激活 添加 删除断点 工具会允许你查看你所设置的所有断点的位置同时给你一次删除所有断点的选项 单步执行程序 单步执行程序是最终解决那些棘手的调试问题的方法 它允许你追踪类里面的方法体的整个执行过程 注意 你不需要设置断点就可以停止一个GUI程序的执行 设置断点后在调试器里面开始执行程序 当遇到第一个断点后 你可以越过申明 进入方法体或类体 也可以继续运行直到下一个断点或程序结束 在调试程序的时候经常遇到的术语有 进入 执行当前行 如果当前行包含一个方法调用 执行被调用方法的第一行 如果类中的方法是用不带调试信息的选项编译的 (也就是没有使用 g 选项) lishixinzhi/Article/program/Java/Javascript/201311/25398
关于java堆栈调试和Java 堆 栈的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-28,除非注明,否则均为
原创文章,转载请注明出处。