当前位置:   article > 正文

java异常,日志,线程堆栈与Jvm调优_java堆栈日志

java堆栈日志

一.知识目录:

在这里插入图片描述

二.什么是java异常:

在这里插入图片描述
2.1 Throwable类中的重要方法:
(1)四个构造方法(用来构造throwable对象,不同构造方法可以传递不同的参数值):

/** 构造一个将 null 作为其详细消息的新 throwable */
Throwable()
/** 构造带指定详细消息的新 throwable */
Throwable(String message)
/** 构造一个带指定 cause 和 (cause==null ? null : cause.toString())(它通常包含类和 cause 的详细消息)的详细消息的新 throwa
Throwable(Throwable cause)
/** 构造一个带指定详细消息和 cause 的新 throwable */
Throwable(String message, Throwable cause)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

(2)getMessage(返回当前Throwable对象的详细消息字符串,通常我们在try catch里面,会使用getMessage记录下异常):

public String getMessage() {
	return detailMessage;
}

public Throwable(String message) {
	fillInStackTrace();
	detailMessage = message;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

getMessage方法中返回的detailMessage就是在构造Throwable时指定的。
(3)getLocalizedMessage(这个方法只比 getMessage 多了 “Localized”,它翻译过来的意思是 “本地化的”。getLocalizedMessage 就是加了本地化后的信息的 Message,和 getMessage 是一样的,如果要加入本地化信息要重写这个方法。):

public String getLocalizedMessage() {
	// 这里直接返回了 getMessage 方法,所以,默认它们是相同的
	return getMessage();
}
  • 1
  • 2
  • 3
  • 4

2.2数据结构中的堆栈:

在这里插入图片描述
**栈:**是限制插入和删除只能在一个位置上进行的线性表
**堆:**是一种特别的树状数据结构,是一棵完全二叉树;但是,完全二叉树不一定是堆

2.3 java虚拟机中的堆和栈:
**堆和栈:**是指对内存进行操作和管理的一些方式,注意要和数据结构中的堆和栈区分开
虚拟机栈的基本性质:

内存管理:由虚拟机自动分配和释放
内存存放:存放函数的参数值,局部变量的值等等,满足先进后出的原则存储
结构:栈的一端是固定的(栈顶),另一端是浮动的(栈底)
速度:由虚拟机自动分配,所以速度很快,比堆快很多
申请大小受限:默认栈空间1兆,超过内存空间限制大小,会报错
结构如下:
在这里插入图片描述
虚拟机堆的基本性质:
内存管理:Jvm里的堆特指用于存放java对象的内存区域。jvm堆被同一个jvm实例中的所有java线程共享。jvm堆通常由某种自动内存管理机制所管理,这种机制叫做垃圾回收。
申请/回收:由jvm做的,自动回收
JVM内存结构:
在这里插入图片描述
虚拟机栈可能出的两类异常:

  • StackOverflowError(栈溢出)
  • OutofMemoryError(栈内存空间不够)

虚拟机可能会抛出的异常:

  • OutofMemoryError(堆内存空间不够)

2.4 java对异常处理的两种方法:
(1)声明异常:
throw关键字,它用来抛出一个指定的异常对象。必须写在方法内部,必须是Exception或Exception子类对象。
在这里插入图片描述
throws用在方法声明上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常。方法内部抛出编译器异常。
在这里插入图片描述
(2)捕获异常:
**try:**该代码块中编写可能产生异常的代码
**catch:**用来进行某种有异常的捕获,堆捕获到的异常进行处理
**finally: **有一些特定的代码无论异常是否发生,都需要执行
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三.异常处理的基本原则:

3.1 不要滥用异常处理:
(1)不要让异常掺杂在业务流程中,不然会难以发现业务流程中的错误
在这里插入图片描述
(2)一些循环的边界控制或判断应该由逻辑来完成,不能依赖异常捕获,否则是沉余
在这里插入图片描述

(3)接口之间的调用更多的是依赖判断和服务提供方,不是猜测可能抛出的异常
在这里插入图片描述
3.2 自定义异常和标准异常的优点:
(1)标准异常的好处:

学习成本低
编译器和虚拟机不需要做额外的工作,工程的整体性能不会下降(而且标准异常经过长时间的优化,性能更优)
(2)自定义异常好处:
自定义的异常会更容易理解错误的原因和位置
可以随心控制异常信息的打印逻辑和内容

3.3 异常被忽略

虽然try…catch了,但是没有在catch里面去处理异常(例如只打印了日志),也是忽略了异常
使用throw,throws向上抛出了异常,但是调用方没有处理异常,只是交给了jvm,也是忽略了异常

(1)for循环中大批量的处理数据,一般都不会让异常直接抛出,会记录下异常信息
在这里插入图片描述
(2)存在网络请求(RPC),允许一定次数的失败重试,即忽略掉偶发性的异常
在这里插入图片描述
(3)不影响业务的整体逻辑情况,例如手机验证码发生失败,不会去抛出异常,会打印一个日志

四.Java日志框架体系:

在Java 应用的开发中,常见的日志框架有 JCL (commons-ogging) ,s4j,JUL (java.utl.logging) , log4j,log4j2, logback等。这些大致可以分为两类,一类是日志门面JCL、sI4,定义日志的抽象接口,不是功能实现; 另一类是日志实现(JUL,log4,log42,logback),负责真正的实现日志。
4.1 常见的两类组合:jcl + log4j2,slf4j + logback (以上是常见的组合,也可以和交换或和其他组合)
在这里插入图片描述
4.2 SLF4J 和 JCL 怎么绑定日志实现:
**4.2.1 JCL绑定日志实现(log4j2):**使用ClassLoader动态加载。
获取log4j2实例:
在这里插入图片描述

(1)在pom.xml 文件引入commons-logging 与log4j2 的依赖
在这里插入图片描述
(2) jcl 绑定日志实现入口
在这里插入图片描述
获取log4j2实例:
在这里插入图片描述
**4.2.2 SLF4j 绑定日志实现(logback)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/590288
推荐阅读
相关标签