与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的java方法服务,而本地方法栈则是为Native方法服务 。
Java堆
- GC堆是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,在JVM启动时创建 。
- 其大小通过-Xms(最小值)和-Xmx(最大值)参数设置,-Xms为JVM启动时申请的最小内存,-Xmx为JVM可申请的最大内存 。
- 由于现在收集器都是采用分代收集算法,堆被划分为新生代和老年代 。新生代由S0和S1构成,可通过-Xmn参数来指定新生代的大小 。
- 所有对象实例以及数组都在堆上分配 。
- Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加载后放到方法区的运行时常量池中 。
- 也称”永久代” ,它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域 。可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小 。
- 运行时常量池:是方法区的一部分,其中的主要内容来自于JVM对Class的加载 。
- Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加载后放到方法区的运行时常量池中 。
文章插图
- Java的多线程之间是通过共享内存进行通信的,在通信过程中会存在一系列如可见性、原子性、顺序性等问题,而JMM就是围绕着多线程通信以及与其相关的一系列特性而建立的模型 。JMM定义了一些语法集,这些语法集映射到Java语言中就是volatile、synchronized等关键字 。
- Java内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程中是用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存 。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行 。
文章插图
- User向服务器发送request,前端控制Servelt DispatcherServlet捕获;
- DispatcherServlet对请求URL进行解析,调用HandlerMApping获得该Handler配置的所有相关的对象,最后以HandlerExecutionChain对象的形式返回.
- DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter.
- 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)
- Handler执行完成后,返回一个ModelAndView对象到DispatcherServlet
- 根据返回的ModelAndView,选择一个适合的ViewResolver
- ViewResolver 结合Model和View,来渲染视图
- 将渲染结果返回给客户端 。
文章插图
JDBC执行流程:
- 连接数据源
- 为数据库传递查询和更新指令
- 处理数据库响应并返回的结果
Spring Cloud是一个基于Spring Boot实现的云原生应用开发工具,它为基于JVM的云原生应用开发中涉及的配置管理、服务发现、熔断器、智能路由、微代理、控制总线、分布式会话和集群状态管理等操作提供了一种简单的开发方式 。
文章插图
- Eureka 负责服务的注册与发现 。
- Hystrix 负责监控服务之间的调用情况,起到熔断,降级作用 。
- Spring Cloud Config 提供了统一的配置中心服务 。
- 所有对外的请求和服务,我们都通过Zuul来进行转发,起到 API 网关的作用
- 最后我们使用 Sleuth+Zipkin 将所有的请求数据记录下来,方便我们进行后续分析 。
- Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具 。它是一个基于HTTP和TCP的客户端负载均衡器 。
推荐阅读
- Java的常用API之System类简介
- Java的常用API
- 1分钟帮你了解自己适不适合当一个程序员
- 什么是JavaScript的变量提升?
- JavaScript setTimeout要理解
- 如何确定JavaScript中this的指向?这里有5中常见的分类
- 汽车车主必备的5个用车冷知识,好多是人为的行车安全隐患
- 如何泡好红茶 泡制好喝红茶的必备因素
- 什么是SWOT、6W2H?深度解析管理者必备的7大管理工具!实用干货
- java单词