- 浏览: 513477 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (563)
- 工作经验 (12)
- 数据库 (13)
- Servlet (10)
- Struts2 (1)
- Spring (25)
- Eclipse (5)
- Hibernate (5)
- Eclips (8)
- HTTP (7)
- J2EE (21)
- EHcache (1)
- HTML (11)
- 工具插件使用 (20)
- JPA (2)
- 杂谈 (17)
- 数据结构与算法 (3)
- Cloud Foundry (1)
- 安全 (10)
- J2SE (57)
- SQL (9)
- DB2 (6)
- 操作系统 (2)
- 设计模式 (1)
- 版本代码管理工具 (13)
- 面试 (10)
- 代码规范 (3)
- Tomcat (12)
- Ajax (5)
- 异常总结 (11)
- REST (2)
- 云 (2)
- RMI (3)
- SOA (1)
- Oracle (12)
- Javascript (20)
- jquery (7)
- JSP自定义标签 (2)
- 电脑知识 (5)
- 浏览器 (3)
- 正则表达式 (3)
- 建站解决问题 (38)
- 数据库设计 (3)
- git (16)
- log4j (1)
- 每天100行代码 (1)
- socket (0)
- java设计模式 耿祥义著 (0)
- Maven (14)
- ibatis (7)
- bug整理 (2)
- 邮件服务器 (8)
- Linux (32)
- TCP/IP协议 (5)
- java多线程并发 (7)
- IO (1)
- 网页小工具 (2)
- Flash (2)
- 爬虫 (1)
- CSS (6)
- JSON (1)
- 触发器 (1)
- java并发 (12)
- ajaxfileupload (1)
- js验证 (1)
- discuz (2)
- Mysql (14)
- jvm (2)
- MyBatis (10)
- POI (1)
- 金融 (1)
- VMWare (0)
- Redis (4)
- 性能测试 (2)
- PostgreSQL (1)
- 分布式 (2)
- Easy UI (1)
- C (1)
- 加密 (6)
- Node.js (1)
- 事务 (2)
- zookeeper (3)
- Spring MVC (2)
- 动态代理 (3)
- 日志 (2)
- 微信公众号 (2)
- IDEA (1)
- 保存他人遇到的问题 (1)
- webservice (11)
- memcached (3)
- nginx (6)
- 抓包 (1)
- java规范 (1)
- dubbo (3)
- xwiki (1)
- quartz (2)
- 数字证书 (1)
- spi (1)
- 学习编程 (6)
- dom4j (1)
- 计算机系统知识 (2)
- JAVA系统知识 (1)
- rpcf (1)
- 单元测试 (2)
- php (1)
- 内存泄漏cpu100%outofmemery (5)
- zero_copy (2)
- mac (3)
- hive (3)
- 分享资料整理 (0)
- 计算机网络 (1)
- 编写操作系统 (1)
- springboot (1)
最新评论
-
masuweng:
亦论一次OutOfMemoryError的定位与解错 -
变脸小伙:
引用[color=red][/color]百度推广中运用的技术 ...
Spring 3 mvc中返回pdf,json,xml等不同的view -
Vanillva:
不同之处是什么??
Mybatis中的like查询 -
thrillerzw:
转了。做个有理想的程序员
有理想的程序员必须知道的15件事 -
liujunhui1988:
觉得很有概括力
15 个必须知道的 Java 面试问题(2年工作经验)
源:http://blog.csdn.net/taotao4/article/details/43918131
评:
在生产环境上看到tomcat/log/catalina.out一直输出异常信息,但是不见异常堆栈信息。
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
在使用log4j中,调用异常方法exception.getStackTrace()获取到异常堆栈信息数组StackTraceElement[],然后使用方法log.error(String msg)来循环打印StackTraceElement。(这种做法是不是很诡异-_-)。没发现任何与异常相关的信息打印出来。
java的标准输出在tomcat启动时,被管道重定向到了catalina.out,catalina.out信息来自所有标准输出。我们在catalina.out看到了信息,说明异常出现时,调用了标准输出,但是没有任何异常堆栈信息出来;我们在log4j配置的文件中没有找到任何异常信息说明StackTraceElement[]中没有任何信息。
最开始怀疑是log4j的使用方式有问题,导致打印不出来,但是当前的使用方式只会丢失rootCause,不会丢弃所有的异常堆栈。catalina.out中就以为是使用了标准输出打印异常类名...。事实当然不是这样,后来查看了异常处理点,基本上都会调用printStackTrace(),然后调用log4j来输出异常到其他文件。说明异常的堆栈信息确实丢失了。
异常堆栈丢失了,然后google之,stackoverflow答案。从别人的回答中,可以看到,这里可能是jvm优化时,产生的结果。具体参考文章
这里自己写的代码,在接近执行两万次时,确实看到异常堆栈信息就没有了:
[java] view plain copy
public static void main(String[] args) {
int i = 0;
String x= null;
while (i < 100000000) {
try {
System.out.println("当前执行次数为:"+i);
getNPE(x);
} catch (Exception e) {
int lth = e.getStackTrace().length;
System.out.println("length:"+lth);
e.printStackTrace();
if(lth==0){
return;
}
}
i++;
}
}
private static void getNPE(String x){
System.out.println("当前字母为:"+x.toString());
}
测试时java版本信息:
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)
当增加虚拟机参数-XX:-OmitStackTraceInFastThrow后,执行了100w次以上,也不见异常堆栈信息丢失。
看看oracle的官方解释:
The compiler in the server VM now provides correct stack backtraces for all "cold" built-in exceptions. For performance purposes, when such an exception is thrown a few times, the method may be recompiled. After recompilation, the compiler may choose a faster tactic using preallocated exceptions that do not provide a stack trace. To disable completely the use of preallocated exceptions, use this new flag: -XX:-OmitStackTraceInFastThrow.
这里的"cold",个人以为是与hotspot VM中hot相对的意思,意思是非热点内置异常。如果异常被抛出数次,就变成”hot“了,这时就会丢失异常信息,因为这时的异常是预先分配的。
在查找资料的时候,发现淘宝定制的vm对这个功能有个开关,可以动态切换是否禁用此项优化。
参考链接:http://www.oracle.com/technetwork/java/javase/relnotes-139183.html
评:
在生产环境上看到tomcat/log/catalina.out一直输出异常信息,但是不见异常堆栈信息。
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
在使用log4j中,调用异常方法exception.getStackTrace()获取到异常堆栈信息数组StackTraceElement[],然后使用方法log.error(String msg)来循环打印StackTraceElement。(这种做法是不是很诡异-_-)。没发现任何与异常相关的信息打印出来。
java的标准输出在tomcat启动时,被管道重定向到了catalina.out,catalina.out信息来自所有标准输出。我们在catalina.out看到了信息,说明异常出现时,调用了标准输出,但是没有任何异常堆栈信息出来;我们在log4j配置的文件中没有找到任何异常信息说明StackTraceElement[]中没有任何信息。
最开始怀疑是log4j的使用方式有问题,导致打印不出来,但是当前的使用方式只会丢失rootCause,不会丢弃所有的异常堆栈。catalina.out中就以为是使用了标准输出打印异常类名...。事实当然不是这样,后来查看了异常处理点,基本上都会调用printStackTrace(),然后调用log4j来输出异常到其他文件。说明异常的堆栈信息确实丢失了。
异常堆栈丢失了,然后google之,stackoverflow答案。从别人的回答中,可以看到,这里可能是jvm优化时,产生的结果。具体参考文章
这里自己写的代码,在接近执行两万次时,确实看到异常堆栈信息就没有了:
[java] view plain copy
public static void main(String[] args) {
int i = 0;
String x= null;
while (i < 100000000) {
try {
System.out.println("当前执行次数为:"+i);
getNPE(x);
} catch (Exception e) {
int lth = e.getStackTrace().length;
System.out.println("length:"+lth);
e.printStackTrace();
if(lth==0){
return;
}
}
i++;
}
}
private static void getNPE(String x){
System.out.println("当前字母为:"+x.toString());
}
测试时java版本信息:
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)
当增加虚拟机参数-XX:-OmitStackTraceInFastThrow后,执行了100w次以上,也不见异常堆栈信息丢失。
看看oracle的官方解释:
The compiler in the server VM now provides correct stack backtraces for all "cold" built-in exceptions. For performance purposes, when such an exception is thrown a few times, the method may be recompiled. After recompilation, the compiler may choose a faster tactic using preallocated exceptions that do not provide a stack trace. To disable completely the use of preallocated exceptions, use this new flag: -XX:-OmitStackTraceInFastThrow.
这里的"cold",个人以为是与hotspot VM中hot相对的意思,意思是非热点内置异常。如果异常被抛出数次,就变成”hot“了,这时就会丢失异常信息,因为这时的异常是预先分配的。
在查找资料的时候,发现淘宝定制的vm对这个功能有个开关,可以动态切换是否禁用此项优化。
参考链接:http://www.oracle.com/technetwork/java/javase/relnotes-139183.html
发表评论
-
JAVA实现SFTP实例
2016-04-20 19:10 485源:http://www.cnblogs.com/chen19 ... -
Axis1.x WebService开发指南—目录索引
2015-11-30 15:54 639源:http://www.cnblogs.com/hoojo/ ... -
CXF WebService整合Spring
2015-11-30 15:50 502源:http://www.cnblogs.com/hoojo/ ... -
几种常用的webservice客户端和spring集成的方法
2015-11-30 15:47 559源:http://my.oschina.net/zimingf ... -
serialVersionUID的作用
2015-11-08 15:27 579源:http://www.cnblogs.com/gu ... -
(未解决问题)Tomcat undeploy does not remove web application artifacts
2015-09-18 11:26 553源:http://stackoverflow.com/ques ... -
使用 VisualVM 进行性能分析及调优
2015-08-25 21:26 491源:http://www.ibm.com/develo ... -
使用Java VisualVM监控远程JVM
2015-08-25 21:25 738源:http://blog.163.com/liuyb_942 ... -
获取spring的ApplicationContext几种方式
2015-06-24 15:35 697源:http://blog.sina.com.cn/s/blo ... -
转:Java 理论与实践: 用 JMX 检测应用程序
2015-06-17 21:26 416源:http://www.ibm.com/developerw ... -
Developing a Service Provider using Java API(Service Provider Interface)
2015-04-15 15:52 629源:http://blog.csdn.net/fenglibi ... -
如何使用webservice
2015-04-09 15:47 5241:到http://cxf.apache.org/downlo ... -
spring获取webapplicationcontext,applicationcontext几种方法详解
2015-04-02 16:38 465源:http://www.blogjava.net/Todd/ ... -
【java规范】Java spi机制浅谈
2015-01-27 10:52 451源:http://singleant.iteye.com/bl ... -
REGISTRY KEY 'SOFTWARE\JAVASOFT\JAVA RUNTIME ENVIRONMENT\CURRENTVERSION'错误
2015-01-21 20:17 587源:http://www.blogjava.net/tomor ... -
Spring线程池开发实战
2014-12-12 10:44 498源:http://blog.csdn.net/chszs/ar ... -
在web.xml下配置error-page
2014-07-18 16:13 426源:http://ysj5125094.iteye.com/b ... -
Write your own Java server
2014-05-14 11:47 742源:http://srcode.org/2014/05/11/ ... -
什么是流
2013-04-05 17:41 956源:http://www.iteye.com/topic/3 ... -
什么是J2EE,包括哪些规范!
2013-01-17 14:17 818源:http://blog.163.com/xiaopeng ...
相关推荐
- **避免在finally块中抛出异常**:这可能导致原始异常被覆盖,丢失重要信息。 - **不要滥用异常**:异常不应用于正常的控制流程,而应保留为异常情况的信号。 9. **日志和追踪**:在异常处理中,记录异常信息是...
5. 为异常提供有意义的错误信息,使用构造函数传入异常描述和堆栈跟踪,以便于调试。 6. 使用try-with-resources语句处理需要关闭的资源,如文件流,以确保资源在完成使用后得到及时关闭,即使出现异常。 7. 考虑...
使用如log4j或java.util.logging等日志框架,可以记录异常堆栈跟踪,便于后期分析和调试。 6. **避免过度捕获**:尽量只捕获你能够处理的异常,避免使用过于宽泛的catch块,如`catch (Exception e)`,这可能导致...
8. 不要记录并抛出异常,避免异常信息的丢失。 9. 封装异常时保留原始异常,便于追踪问题。 10. 避免使用异常来控制程序流程,异常应主要用于异常情况。 11. 使用标准的异常类,如`IllegalArgumentException`、`...
当一个异常发生时,Java会生成一个异常对象,这个对象包含了关于异常的详细信息,如异常类型和堆栈跟踪。如果当前方法没有捕获该异常,它会被传递到调用该方法的上一级方法,直到找到合适的catch块来处理,或者如果...
如果没有适当的处理,程序会终止,并打印出异常的堆栈跟踪信息。 7.2 异常处理 Java提供了异常处理的五种关键字:try、catch、finally、throw和throws。 - try块:用于包含可能会抛出异常的代码。如果在try块中...
捕获顶层的Exception或Throwable,虽然能确保所有异常都被处理,但这会使异常处理变得过于泛化,导致丢失具体异常信息,从而难以确定问题的真正原因。因此,建议尽可能捕获更具体的异常类型,以便更精确地应对异常...
4. **避免吞没异常**:在`catch`块中不要简单地忽略异常,这会导致错误信息丢失,使得问题难以诊断。正确做法是记录异常并决定是否需要重新抛出。 5. **精确异常处理**:避免使用`Exception`作为捕获异常的类型,而...
错误堆栈显示了问题发生在ContentCopyUtils类中的makeFolderPathAtLocation方法,这通常意味着在尝试创建或复制文件夹到工作区时遇到了未初始化的对象引用。 **解决步骤:** 1. **检查工作目录:** 首先,你需要...
##### 2.2 空指针异常类:`NullPointerException` - **简介**:尝试访问或操作一个 `null` 引用时抛出。 - **常见场景**:访问 `null` 对象的属性或调用其方法。 ##### 2.3 类型强制转换异常:`ClassCastException`...
在使用MyEclipse 10.7.0版本时,用户可能会遇到一个常见的问题,即在尝试部署应用程序时遭遇空指针异常(NullPointerException)。这个问题主要表现为在MyEclipse的Servers视图中无法正常打开,导致报错日志记录了一...
Java API文档是Java开发者的重要资源,提供了所有Java标准库的详细说明,包括类、接口、枚举和异常等的使用方法。 **1.7. 集成开发工具** - **1.7.1. 常用的集成开发工具** - Eclipse - IntelliJ IDEA - ...