JVM系列-11-1、内存与垃圾回收篇---直接内存Direct Memory(元空间使用直接内存)
直接内存Direct Memory(元空间使用直接内存) 直接内存不是虚拟机运行时数据区的一部分,也不是《Java 虚拟机规范》中定义的内存区域。 直接内存是在 Java 堆外的、直接向系统申请的内存区间。 来源于 NIO ,通过存在堆中的 DirectByteBuffer 操作 Native 内存。 通常,访问直接内存的速度会优于 Java 堆。即读写性能高。 因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存 Java 的 NIO 库允许 Java 程序使用直接内存,用于数据缓冲区 使用下列代码,直接分配本地内存空间 12int BUFFER = 1024 * 1024 * 1024; // 1GBByteBuffer byteBuffer = ByteBuffer.allocateDirect(BUFFER); 非直接缓存区和直接缓存区 原来采用 BIO 的架构,我们需要从用户态切换成内核态 NIO 的方式使用了直接缓存区的概念 存在的问题 也可能导致 OutOfMemoryError 异常 由于直接内存在 Java 堆外,因此它的大小不会直接受限于 -Xmx 指定的 ...
JVM系列-10-1、内存与垃圾回收篇---对象的实例化内存布局与访问定位(重要)
对象实例化内存布局与访问定位 面试题 美团、蚂蚁金服 对象在 JVM 中是怎么存储的? 对象头信息里面有哪些东西? Java 对象头有什么? 对象实例化 从对象创建的方式和步骤开始说 对象创建方式 ① new:最常见的方式、单例类中调用 getInstance() 的静态类方法,XXXFactory 的静态方法 ② Class 的 newInstance() 方法:在 JDK 9 里面被标记为过时的方法,因为只能调用空参构造器,权限必须是 public ③ Constructor 的 newInstance(XXX):反射的方式,可以调用空参的,或者带参的构造器,权限没有要求 ④ 使用 clone():不调用任何的构造器,要求当前的类需要实现 Cloneable 接口中的 clone() 方法 ⑤ 使用反序列化:序列化一般用于 Socket 的网络传输,从文件、网络中获取文件二进制流 ⑥ 第三方库 Objenesis 创建对象的步骤(六个步骤) 1、判断对象对应的类是否加载、链接、初始化 虚拟机遇到一条 new 指令,首先去检查这个指令的参数能否在 Metaspace 的常量 ...
JVM系列-09-1、内存与垃圾回收篇---方法区【与栈堆关系、设置、内部结构、演进细节、GC】(重要)
方法区 目录: 栈、堆、方法区的交互关系 这次所讲述的是运行时数据区的最后一个部分——方法区 从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及会话管理。 下面就涉及了对象的访问定位 Person:存放在元空间,也可以说方法区 person:存放在 Java 栈的局部变量表中 new Person():存放在 Java 堆中 方法区的理解 《Java 虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于 HotSpot JVM 而言,方法区还有一个别名叫做 Non-Heap(非堆),目的就是要和堆分开。 所以,方法区看作是一块独立于 Java 堆的内存空间。 方法区主要存放的是 Class ,而堆中主要存放的是实例化的对象。 方法区(Method Area)与 Java 堆一样,是各个线程共享的内存区域。 方法区在 JVM 启动的时候被创建,并且它的实际的物理内存空间中和 Java 堆区一样都可以是不连续的(逻辑上连续, ...
SpringBoot2-06-高级特性、初始化原理解析(回顾SpringBoot自动配置原理解析)
81、高级特性-Profile环境切换 为了方便多环境适配,Spring Boot简化了profile功能。 默认配置文件application.yaml任何时候都会加载。 指定环境配置文件application-{env}.yaml,env通常替代为test, 激活指定环境 配置文件激活:spring.profiles.active=prod 命令行激活:java -jar xxx.jar --spring.profiles.active=prod --person.name=haha(修改配置文件的任意值,命令行优先) 默认配置与环境配置同时生效 同名配置项,profile配置优先 @Profile条件装配功能 1234567@Data@Component@ConfigurationProperties("person")//在配置文件中配置public class Person{ private String name; private Integer age;} application.prope ...
SpringBoot2-05-单元测试、指标监控
71、单元测试-JUnit5简介 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库 JUnit 5官方文档 作为最新版本的JUnit框架,JUnit5与之前版本的JUnit框架有很大的不同。由三个不同子项目的几个不同模块组成。 JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage JUnit Platform: Junit Platform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入。 JUnit Jupiter: JUnit Jupiter提供了JUnit5的新的编程模型,是JUnit5新特性的核心。内部包含了一个测试引擎,用于在Junit Platform上运行。 JUnit Vintage: 由于JUint已经发展多年,为了照顾老的项目,JUnit Vintage提供了兼容JUnit4.x,JUnit3.x的测试引擎。 注意: SpringBoot 2.4 以上版本移除了默认对 Vintage 的依赖。如果需要兼容JUnit4需要自行 ...
SpringBoot2-04-Servlet原生组件注入、定制化原理(Web服务器)、数据访问(整合Mybatis)
56、原生组件注入-原生注解与Spring方式注入 官方文档 - Servlets, Filters, and listeners 使用原生的注解 12345678@WebServlet(urlPatterns = "/my")public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("66666"); }} 12345678910111213141516171819@Slf4j@WebFilter(urlPatterns={"/css/*","/images/*"}) //mypublic class ...
SpringBoot2-03-视图解析、web实验、拦截器、文件上传、错误处理
43、视图解析-Thymeleaf初体验 Thymeleaf is a modern server-side Java template engine for both web and standalone environments. Thymeleaf's main goal is to bring elegant natural templates to your development workflow — HTML that can be correctly displayed in browsers and also work as static prototypes, allowing for stronger collaboration in development teams. With modules for Spring Framework, a host of integrations with your favourite tools, and the ability to plug in your own functionality, Thymeleaf i ...
SpringBoot2-02-web场景(静态资源规则、请求处理、响应处理+源码分析)
22、web场景-web开发简介 Spring Boot provides auto-configuration for Spring MVC that works well with most applications.(大多场景我们都无需自定义配置) The auto-configuration adds the following features on top of Spring’s defaults: Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans. 内容协商视图解析器和BeanName视图解析器 Support for serving static resources, including support for WebJars (covered later in this document)). 静态资源(包括webjars) Automatic registration of Converter, GenericConverter, and Formatter ...
SpringBoot2-01-基础入门、SpringBootApplication解析、自动配置原理、最佳实践、配置文件
01、基础入门-SpringBoot2课程介绍 Spring Boot 2核心技术 Spring Boot 2响应式编程 学习要求 -熟悉Spring基础 -熟悉Maven使用 环境要求 Java8及以上 Maven 3.3及以上 学习资料 Spring Boot官网 Spring Boot官方文档 本课程文档地址 视频地址1、视频地址2 源码地址 02、基础入门-Spring生态圈 Spring官网 Spring能做什么 Spring的能力 Spring的生态 覆盖了: web开发 数据访问 安全控制 分布式 消息服务 移动开发 批处理 ...... Spring5重大升级 响应式编程 内部源码设计 基于Java8的一些新特性,如:接口默认实现。重新设计源码架构。 为什么用SpringBoot Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".link 能快速创建出生产级 ...
JVM系列-08-1、内存与垃圾回收篇---堆【堆内存分配、GC、TLAB、逃逸分析】(最重要)
堆 堆的核心概念 堆和方法区针对一个 JVM 进程来说是唯一的,也就是一个进程只有一个 JVM ,但是进程包含多个线程,他们是共享同一堆和方法区空间的,每个线程各自包含一套程序计数器、本地方法栈和虚拟机栈。 一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的核心区域。 Java 堆区在 JVM 启动的时候即被创建,其空间大小也就确定了。是 JVM 管理的最大一块内存空间。 堆内存的大小是可以调节的。 《Java 虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。 所有的线程共享 Java 堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。 -Xms10m:最小堆内存 -Xmx10m:最大堆内存 下图就是使用:Java VisualVM 查看堆空间的内容,通过 jdk/bin 提供的插件 《Java 虚拟机规范》中对 Java 堆的描述是:所有的对象实例以及数组都应当在运行时分配在堆上。(The heap is the run-time data area fro ...