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

一.知识目录:

在这里插入图片描述

二.什么是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)

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

public String getMessage() {
   
	return detailMessage;
}

public Throwable(String message) {
   
	fillInStackTrace();
	detailMessage = message;
}

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

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

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)😗*通过静态绑定,即它会在编译的时候确定使用哪个日志框架。
获取logback实例:
在这里插入图片描述
在这里插入图片描述
4.3 Log4j2的应用:

  • 基本的打印方法
  • JCL不支持占位符,但是log4j2支持
  • 将异常栈打印到日志中**

(1) log4j2默认的配置文件:
如果你只是在工程中引入了log4j2(JCL),而没有做过任何配置时,你会发现,log4j2也可以工作,这其实就是当log4j2找不到配置文件时,使用DefaultConfiguration 类提供的默认的配置:

  • 为root Logger 添加一个ConsoleAppender
  • 为该ConsoleAppender 设置一个pattern为%d(HH:mm:ss.SSS}[%t]%-5level %logger{36}-%msg%n的I PatternLayout
    等价默认log4j2配置文件的内容如下:
<?xml version="1.” encoding="UTF-8"?>
<Configuration status="WARN” monitorinterval="5">
<Appenders>
<!-- 默认打印到控制台 -->
<Console name="Console" target="SYSTEM OUT">
<!-- 默认打印格式 -->
<PatternLayout pattern="%d(HH:mm:ss.SSs) [%t] %-5level %logger(36) - %msg%n"/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值