前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >定位生产问题时,异常堆栈莫名丢了,何解?

定位生产问题时,异常堆栈莫名丢了,何解?

作者头像
一猿小讲
发布于 2020-08-18 08:04:55
发布于 2020-08-18 08:04:55
1.3K00
代码可运行
举报
文章被收录于专栏:一猿小讲一猿小讲
运行总次数:0
代码可运行

今天分享的这个知识有点冷,相信很多 Java 程序员很少遇到,废话不多说,直接进入排查问题的真实讨论现场。

小 猿:有个 NPE 异常,有空帮忙看看是哪里出的?

架构狮:我没有看到空指针堆栈啊!?

小 猿:有堆栈我就自己找问题了,就不劳驾您老啦(捂嘴笑)。

架构狮:是不是 NPE 报了好多次?

小 猿:是。

架构狮:一猜就是,因为只有报了很多次,Java 才会自动不打印异常堆栈信息(言外之意:报了多了 java 会省略的),那就找找最开始报异常的日志,肯定会有堆栈信息的(哈哈,心里有谱啦),这种机制叫做 fast throw。

1

异常堆栈信息丢了?

只见 Java 攻城狮小猿傻傻的盯着业务日志,一脸呆萌... ...

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[2020-08-15 00:00:00]: 668812118 Thread-8 [ERROR] payService:java.lang.NullPointerException

与其傻傻迷思,不妨直接来个现场说法,talk is cheap,show me the code,直接上代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Fast Throw 知识点分享
 * @author 一猿小讲
 */
public class NPETest {
    public static void main(String[] args) {
        String msg = null;
        for (int i = 0; i < 1000000; i++) {
            try {
                // msg 为空,会出现空指针异常
                System.out.println(msg.length());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

程序刚开始跑的时候,程序输出是下面这样子的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.lang.NullPointerException
  at NPETest.main(NPETest.java:11)
... ... 
java.lang.NullPointerException
  at NPETest.main(NPETest.java:11)

一会儿的功夫,输出却变成下面这个样子,异常堆栈确实丢了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException

架构狮:惊奇不?有没有匪夷所思。

小 猿:何解?

架构狮:这种现象就叫做 fast throw,是 Java 虚拟机的一个优化,如果发现代码同一个位置频繁抛出同一类型的异常时,异常堆栈信息就会被清空,那么速度就会非常快,就不用再额外分配内存。

到这儿,Java 攻城狮小猿,点了一根香烟,感觉受益颇深,不过却又陷入了沉思。

2

Fast Throw 深入一点,又何妨?

思考一:查问题也太不方面了,如何让异常堆栈信息展示呢?

首先要清楚,JVM 会默认开启 Fast Throw 优化。如果想关闭这个优化,通过配置 -XX:-OmitStackTraceInFastThrow 就可以。

接下来还是跑上面 NPETest 的例子,配置 VM 参数,一起操作一把。

IDEA 运行时指定参数:-XX:-OmitStackTraceInFastThrow。

控制台运行时指定参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -XX:-OmitStackTraceInFastThrow NPETest

效果很明显,异常堆栈信息一直坚挺到最后:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
... ...
java.lang.NullPointerException
        at NPETest.main(NPETest.java:11)
java.lang.NullPointerException
        at NPETest.main(NPETest.java:11)
java.lang.NullPointerException
        at NPETest.main(NPETest.java:11)

话又说来,如何再开启 fast throw 优化呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
方式一:默认就是开启优化;
方式二:-XX:+OmitStackTraceInFastThrow

思考二:除了 NPE 异常,JVM 开启 fast throw 优化的异常还有哪些?

  • ArithmeticException
  • ArrayIndexOutOfBoundsException
  • ArrayStoreException
  • ClassCastException

烟味灭,酒过半,Java 攻城狮小猿彻底掌握了技巧,嘴角洋溢着笑容,此番操作不但解决了生产问题,而且又 get 一装逼技能... ...

3

寄语写最后

本次,主要对小猿在排查生产上遇到的一个匪夷所思的问题,作为基础进行展开,简单对 JVM 特定类型的异常的 fast throw 优化进行了解,希望对大家有帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一猿小讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
4 条评论
热度
最新
本地搭建服务器和应用并发布互联网,或外网访问内网时,内网穿透及内网映射外网是一种方法。本地局域网端口映射外网访问,常见几种有FRP、nat123、ngrok 。
本地搭建服务器和应用并发布互联网,或外网访问内网时,内网穿透及内网映射外网是一种方法。本地局域网端口映射外网访问,常见几种有FRP、nat123、ngrok 。
回复回复1举报
推荐 小蝴蝶内网穿透 ,谁用谁知道
推荐 小蝴蝶内网穿透 ,谁用谁知道
回复回复点赞举报
holer不属于开源软件,不开放源码,也不属于自由软件,只能说是个免费软件,不捐赠的话只能创建一个映射端口。
holer不属于开源软件,不开放源码,也不属于自由软件,只能说是个免费软件,不捐赠的话只能创建一个映射端口。
回复回复点赞举报
还有开源的内网穿透框架 FastTunnel:https://github.com/SpringHgui/FastTunnel
还有开源的内网穿透框架 FastTunnel:https://github.com/SpringHgui/FastTunnel
回复回复点赞举报
推荐阅读
列举一些比较好用的开源的内网映射工具
Holer客户端采用了Java语言和GO语言实现了两种版本,支持几乎所有的OS平台。
用户7108768
2021/09/26
1.1K0
一款带Web面板的轻量级、高性能内网穿透工具:nps使用教程
说明:内网穿透工具之前已经介绍了不少了,比如Frp、lanproxy、Holer等,现在再介绍个带Web面板的穿透工具nps,之前叫easyProxy,只是改名了而已,该工具是一款使用go语言编写的轻量级、功能强大的内网穿透服务器。支持tcp、udp流量转发,支持内网http、socks5代理,同时支持snappy压缩(节省带宽和流量)、站点保护、加密传输、多路复用、header修改等。同时还支持web图形化管理。
子润先生
2021/06/01
4.6K0
永久免费内网穿透软件_不限速内网穿透
隧道协议选择: http 隧道名称: 取一个独一无二的名字 前置域名 : 域名的前缀 例如 :qydev.free.qydev.com ,更改为 自定义.free.qydev.com 本地端口 : 需要穿透的端口.
全栈程序员站长
2022/11/08
5.4K0
永久免费内网穿透软件_不限速内网穿透
内网渗透|Chisel内网穿透工具
Chisel可用来搭建内网隧道,类似于常用的frp和nps之类的工具。由于目前使用的人比较少,因此对于有些杀软还不能准确的识别出该工具。chisel可以进行端口转发、反向端口转发以及Socks流量代理,使用go语言编写,支持多个平台使用,是进行内网穿透的一个鲜为人知的好工具。
HACK学习
2021/03/03
10.7K0
内网渗透|Chisel内网穿透工具
推荐几款实用的内网穿透工具
本文以渗透的视角,总结几种个人常用的内网穿透,内网代理工具,介绍其简单原理和使用方法。
Java团长
2022/02/10
9K1
推荐几款实用的内网穿透工具
常见内网穿透工具,收好了!
目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……)。
网络工程师笔记
2023/09/09
1.4K0
常见内网穿透工具,收好了!
“内网的秘密通道:顶级内网穿透工具
内网穿透工具主要用于让外部网络能够访问内部网络中的资源,这在网络调试、远程工作、私有项目展示以及其他诸多场景中具有很大的便利性。以下是几款常用且好用的内网穿透工具的介绍:
科控物联
2023/09/25
1K0
“内网的秘密通道:顶级内网穿透工具
NPS内网穿透的搭建与演示
内网穿透:内网穿透,即NAT穿透,网络连接时术语,计算机是局域网内时,外网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透。就是说映射端口,能让外网的电脑找到处于内网的电脑,提高下载速度。不管是内网穿透还是其他类型的网络穿透,都是网络穿透的统一方法来研究和解决。
yuanshuai
2022/08/22
4.4K1
NPS内网穿透的搭建与演示
最好用的内网穿透工具合集
在渗透过程中,我们需要快速实现内网穿透,从而绕过网络访问限制,直接从外网来访问内网。今天,我们来推荐几款非常好用的内网穿透工具,如有其它推荐,欢迎补充和指正。
Bypass
2020/09/08
8K1
最好用的内网穿透工具合集
可以实现内网穿透的几款工具
最近没什么事情,看了一些关于内网穿透的文章,因我本身已是做微信开发相关的工作,对这部分关注的比较多,现分享给大家。
java思维导图
2018/12/21
8.4K1
可以实现内网穿透的几款工具
实现外网访问电脑本地服务器(内网穿透、本地调试)工具对比及教程
楔子:我们在做开发时,不想购买服务器,只想搭建我们本地的服务器,我们搭建的本地服务器只能供我们自己电脑的浏览器访问,或者处于同一个wifi下的手机访问,但是我们如果想让别人访问到我们的本地服务器,尤其做微信公号或者小程序开发时,想在微信里访问到我们在电脑上搭建的本地服务器。 我们就要做内网穿透了,内网穿透就是别人通过外网能够访问到我们本地的服务器。
ZhangXianSheng
2019/10/19
10.2K0
国产的内网穿透工具也很优秀,这10款工具推荐正在寻找的你!
内网就是你自己的网络环境,就你自己能访问,比如你本地测试进行的localhost;
网络技术联盟站
2023/03/01
3.2K0
国产的内网穿透工具也很优秀,这10款工具推荐正在寻找的你!
技术栈系列专栏5-搭建内网穿透系统
工作多年,学习资料都需要放在网络端,但是网络端的费用又比较高,在想着能不能在家里搭建一台主机服务,将自己的文档系统、日常使用的学习资料、工具等部署在本地主机服务,能通过外部网络访问。
AndreKzWu
2022/09/19
1K1
内网渗透 | 内网穿透工具FRP的使用
FRP(Fast Reverse Proxy) 是一款简单,好用,稳定的隧道工具。FRP 使用 Go 语言开发,它是一款高性能的反向代理应用,可以轻松地进行内网穿透,对外网提供服务。FRP 支持 TCP、UDP、KCP、HTTP、HTTPS等协议类型,并且支持 Web 服务根据域名进行路由转发。在进行内网渗透中,FRP是常用的一款隧道工具。
谢公子
2022/01/19
2.4K0
内网渗透 | 内网穿透工具FRP的使用
70k star 的最强内网穿透工具,你一定要试试
所以今天了不起就要把事情做的彻底些,通过内网穿透工具,实现在家也能访问公司内网环境的问题。说到内网穿透工具,那就少不了大名鼎鼎的 frp 了!
永恒君
2023/09/02
4300
70k star 的最强内网穿透工具,你一定要试试
FRP内网穿透_内网穿透 无需公网ip
二、为什么要使用内网穿透 为了外网要访问内网,因为当不在同一局域网内,ip和地址互相ping不同的话,最简单的方式是使用向日葵与teamview,但是用起来并不方便。
全栈程序员站长
2022/09/30
4.6K0
FRP内网穿透_内网穿透 无需公网ip
安排几款实用的内网穿透工具+教程
本文以渗透的视角,总结几种个人常用的内网穿透,内网代理工具,介绍其简单原理和使用方法。
民工哥
2021/11/26
1.3K0
Linux环境搭建frp实现内网穿透
内网穿透,即 NAT穿透,网络连接时术语,计算机是局域网内时,外网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透。——来自百度百科。
小吕
2022/06/16
9.5K0
Linux环境搭建frp实现内网穿透
内网穿透你真的了解吗?
内网穿透你真的了解吗? http://zoo.zhengcaiyun.cn/blog/article/intranet-penetration
政采云前端团队
2023/02/27
7510
内网穿透你真的了解吗?
支持可视化配置的全能内网穿透神器-NPS
在之前的文章中,我们介绍了两种内网穿透工具frp和zerotier。frp可参照《利用frp工具实现内网穿透、随时随地访问内网服务》,zerotier可参照《ZeroTier实现内网穿透、异地组网》。
大刚测试开发实战
2023/01/18
9K1
推荐阅读
相关推荐
列举一些比较好用的开源的内网映射工具
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档