1、概述

  • Java字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令。
  • Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。由于Java虚拟机采用面向操作数栈而不是寄存器的结构,所以大多数的指令都不包含操作数,只有一个操作码。
  • 由于限制了Java虚拟机操作码的长度为一个字节(即0~255),这意味着指令集的操作码总数不可能超过256条。官方文档:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html
  • 熟悉虚拟机的指令对于动态字节码生成、反编译Class文件、Class文件修补都有着非常重要的价值。因此,阅读字节码作为了解Java虚拟机的基础技能,需要熟练掌握常见指令。
    Read more »

1、解析字节码文件作用

  • 通过反编译生成的字节码文件,我们可以深入的了解java代码的工作机制。但是,自己分析类文件结构太麻烦了!除了使用第三方的jclasslib工具之外,oracle官方也提供了工具:javap。

  • javap是jdk自带的反解析工具。它的作用就是根据c1ass字节码文件,反解析出当前类对应的code区(字节码指令)、局部变量表、异常表和代码行偏移量映射表、常量池等信息。

  • 通过局部变量表,我们可以查看局部变量的作用域范围、所在槽位等信息,甚至可以看到槽位复用等信息。

    Read more »

一、概述

1.1 字节码文件的跨平台性

  • Java语言:跨平台的语言(write once, run anywhere)
    • 当]ava源代码成功编译成字节码后,如果想在不同的平台上面运行,则无须再次编译。
    • 这个优势不再那么吸引人了。 Python、PHP、Perl、Ruby、Lisp等有强大的解释器。
    • 跨平台似乎己经快成为一门语言必选的特性。
  • Java虚拟机:跨语言的平台
    • Java虚拟机不和包括Java在内的任何语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联。无论使用何种语言进行软件开发,只要能将源文件编译为正确的Class文件,那么这种语言就可以在Java虚拟机上执行。可以说,统一而强大的Class文件结构,就是Java虚拟机的基石、桥梁。
    • 所有的JVM全部遵守]ava虚拟机规范,也就是说所有的JVM环境都是一样的,这样一来字节码文件可以在各种JVM上运行。
      Read more »

一、垃圾回收器概述

  • 按线程数分为串行垃圾回收器并行垃圾回收器。

    • 串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。串行回收默认被应用在客户端的Client模式下的JVM中。
    • 和串行回收相反,并行收集可以运用多个CPU同时执行垃圾回收,因此提升了应用的吞吐量,不过并行回收仍然与串行回收一样,采用独占式,使用“Stop-the-world”机制。
  • 按工作模式分为并发式垃圾回收器独占式垃圾回收器。

    • 并发式垃圾回收器与应用程序交替工作,以尽可能减少应用程序的停顿时间。
    • 独占式垃圾回收器一旦运行,就停止应用程序中的所有用户线程,直到垃圾回收过程完全结束。
Read more »

一、垃圾回收概念

1.1 System.gc()

  • 在默认情况下,通过 System.gc()或者 Runtime. getRuntime().gc()的调用,会显式触发Full GC,同时对老年代、新生代、方法区进行回收,尝试释放被丢弃对象占用的内存。
  • 然而 System. gc()调用附带一个免责声明,无法保证对垃圾收集器的调用。
  • JVM实现者可以通过 System.gc()调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦了。在一些特殊情况下,如我们正在编写一个性能基准,我们可以在运行之间调用System.gc()。
Read more »

1、缓存机制简介

  • MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。缓存可以极大的提升查询效率。
  • MyBatis系统中默认定义了两级缓存,即一级缓存和二级缓存
    • 默认情况下,只有一级缓存(SqlSession级别的缓存,也称为本地缓存)开启。
    • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
    • 为了提高扩展性,MyBatis定义了缓存接口Cache,我们可以通过实现Cache接口来自定义二级缓存。
Read more »

1、联合查询简介

  • 级联关系是一个数据库实体的概念,有 3 种级联关系,分别是一对一级联、一对多级联以及多对多级联。级联的优点是获取关联数据十分方便,但是级联过多会增加数据库系统的复杂度,同时降低系统的性能。 MyBatis提供了方便的一对一和多对多查询,而多对多查询可以由两个一对多查询组成。
Read more »

1、MyBatis简介

  • MyBatis原是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移到了Google Code,随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis。
  • 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
  • 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
  • 可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
Read more »

1、局部异常处理

  • 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大。 而SpringMVC提供了强大的异常处理机制,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。新建一个SpringMVC项目,基础示例代码为https://perfectcode.top/2020/12/20/SpringMVC%E8%BF%90%E8%A1%8C%E6%B5%81%E7%A8%8B/

  • ①新建一个ExceptionController,编写一个异常请求以及一个异常方法,并在异常方法上标注@ExceptionHandler注解,即告诉SpringMVC此方法专门用来处理ExceptionController类发生的异常。

    Read more »