堆1. 堆的核心概述1. 堆与进程
堆针对一个JVM进程来说是唯一的。也就是一个进程只有一个JVM实例,一个JVM实例中就有一个运行时数据区,一个运行时数据区只有一个堆和一个方法区。
但是进程包含多个线程,他们是共享同一堆空间的。
一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。
Java堆区在JVM启动的时候即被创建,其空间大小也就确定了,堆是JVM管理的最大一块内存空间,并且堆内存的大小是可以调节的。
《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。
所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。
《Java虚拟机规范》中对Java堆的描述是:所有的对象实例以及数组都应当在运行时分配在堆上。(The heap is the run-time data area from which memory for all class instances and arrays is allocated)
从实际使用角度看:“几 ...
一. 运行时数据区概述及线程1. 前言本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段
当我们通过前面的:类的加载 –> 验证 –> 准备 –> 解析 –> 初始化,这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区
类比一下也就是大厨做饭,我们把大厨后面的东西(切好的菜,刀,调料),比作是运行时数据区。而厨师可以类比于执行引擎,将通过准备的东西进行制作成精美的菜品。
2. 运行时数据区结构1. 运行时数据区与内存
内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规范,来探讨一下经典的JVM内存布局。
我们通过磁盘或者网络IO得到的数据,都需要先加载到内存中,然后CPU从内存中获取数据进行读取,也就是说内存充当了CPU和磁盘之间的桥梁
说明:方法区在JVM规范中是一个逻辑概念 ...
类加载子系统1. 内存结构概述
注意:方法区只有HotSpot虚拟机有,J9,JRockit都没有
如果自己想手写一个Java虚拟机的话,主要考虑哪些结构呢?
类加载器
执行引擎
2. 类加载器子系统1. 类加载器子系统作用
类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。
ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。
加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)
2. 类加载器ClassLoader角色
class file(在下图中就是Car.class文件)存在于本地硬盘上,可以理解为设计师画在纸上的模板,而最终这个模板在执行的时候是要加载到JVM当中来根据这个文件实例化出n个一模一样的实例。
class file加载到JVM中,被称为DNA元数据模板(在下图中就是内存中的Car Class),放在方法 ...
C++基础入门1. C++初识1. 第一个C++程序编写一个C++程序总共分为4个步骤
创建项目
创建文件
编写代码
运行程序
1. 创建项目Visual Studio是我们用来编写C++程序的主要工具,我们先将它打开
2. 创建文件右键源文件,选择添加->新建项
给C++文件起个名称,然后点击添加即可。
3. 编写代码1234567891011#include<iostream>using namespace std;int main() { cout << "Hello world" << endl; system("pause"); return 0;}
4. 运行程序CLion 输出结果:
2. 注释作用:在代码中加一些说明和解释,方便自己或其他程序员程序员阅读代码
两种格式
单行注释:// 描述信息
通常放在一行代码的上方,或者一条语句的末尾,==对该行代码说明==
多行注释: /* 描述信息 */
通常放在 ...
Nginx高级篇1. 扩容扩容方式
单机垂直扩容:硬件资源增加
水平扩展:集群化
细粒度拆分:分布式
数据分区
上游服务SOA化(原生支持水平/垂直扩容)
入口细分
浏览器
移动端原生App(物联网)
H5内嵌式应用
数据异构化
多级缓存
客户端缓存
CDN缓存
异地多活
Nginx缓存
服务异步化
拆分请求
消息中间件
扩容原则
无状态原则
弹性原则
1. 单机垂直扩容:硬件资源增加
云服务资源增加
整机:IBM、浪潮、DELL、HP等
CPU/主板:更新到主流
网卡:10G/40G网卡
磁盘:SAS(SCSI) HDD(机械)、HHD(混合)、SATA SSD、PCI-e SSD、MVMe SSD
SSD
多副本机制
系统盘/热点数据/数据库存储
HDD
冷数据存储
2. 水平扩展:集群化1. 会话管理
Nginx高级负载均衡
ip_hash
12345678910111213141516171819upstream httpds { ip_hash; server 192 ...
Nginx基础篇1. Nginx介绍
Nginx开源版 http://nginx.org/en/
官方原始的Nginx版本
Nginx plus商业版
开箱即用,集成了大量功能
Open Resty https://openresty.org/cn/
OpenResty是一个基于Nginx与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。更适用于需要大量二次开发的场景,有极强的扩展性
Tengine https://tengine.taobao.org/
由淘宝网发起的Web服务器项目。它在Nginx (opens new window)的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网 (opens new window),天猫商城 (opens new window)等得到了很好的检验。相比于Open Resty,扩展性不够强,但是能够满足绝多数使用场景
2. Nginx安装
下载Nginx包
官网下载地址(opens new window)
解压Nginx ...
高级篇1. Docker复杂安装1. 安装mysql主从复制主从搭建步骤
新建主服务器容器实例3307
12345docker run -d -p 3307:3306 --privileged=true \-v /mydata/mysql-master/log:/var/log/mysql \-v /mydata/mysql-master/data:/var/lib/mysql \-v /mydata/mysql-master/conf:/etc/mysql/conf.d \-e MYSQL_ROOT_PASSWORD=123456 --name mysql-master mysql
进入/mydata/mysql-master/conf目录下新建my.cnf
123456789101112131415161718vim /mydata/mysql-master/conf/my.cnf[mysqld]## 设置server_id,同一局域网中需要唯一server_id=101## 指定不需要同步的数据库名称binlog-ignore-db=mysql## 开启二进制日志功log-b ...
SpringBoot原理篇在学习前面三篇的时候,好多小伙伴一直在B站评论区嚷嚷着期待原理篇,今天可以正式的宣布了,他来了他来了他脚踏祥云进来了(此处请自行脑补BGM)。
其实从本人的角度出发,看了这么多学习java的小伙伴的学习过程,个人观点,不建议小伙伴过早的去研究技术的原理。原因有二:
一:先应用熟练,培养技术应用的条件反射,然后再学原理。大把的学习者天天还纠结于这里少写一个这,那里少写一个那,程序都跑不下去,要啥原理,要啥自行车。这里要说一句啊,懂不懂啥意思那不叫原理,原理是抽象到顶层设计层面的东西。知道为什么写这句话,知道错误的原因和懂原理是两码事。
二:原理真不是看源码,源码只能称作原理的落地实现方式,当好的落地实现方式出现后,就会有新旧版本的迭代,底层实现方式也会伴随着更新升级。但是原理不变,只是找到了更好的实现最初目标的路径。一个好的课程,一位好的老师,不会用若干行云里雾里的源代码把学习者带到沟里,然后爬不出来,深陷泥潭。一边沮丧的看着源码,一边舔着老师奉其为大神,这就叫不干人事。原理就应该使用最通俗易懂的语言,把设计思想讲出来,至于看源码,只是因为目前的技术原创人员只想 ...
Spring注解驱动开发Component是最最基础的注解。表示这是一个Bean 可以被注入到Spring container里。
其他三个就是Spring的经典三层layer了
@Controller @Service @Repository
表现层:表示此类专注于对前端请求进行转发和重定向
业务层:处理业务逻辑
持久层:DAO类 表示此类专注于对数据库进行数据的读取或者写入。
这三个注解表示了三个基本任务:处理前端请求 处理业务逻辑 处理数据库读写。
1. 组件注册1. AnnotationConfigApplicationContext配置类
12345678910111213//配置类=配置文件@Configuration //告诉Spring这是一个配置类//排除规则 指定扫描的时候按照什么规则排除那些组件 excludeFilters = Filter[] 排除注解类型FilterType.ANNOTATION@ComponentScan(value = "com.zt" , excludeFilters = {@Filter(type = ...
四. 优化与源码1. 优化1. 扩展序列化算法序列化,反序列化主要用在消息正文的转换上
序列化时,需要将 Java 对象变为要传输的数据(可以是 byte[],或 json 等,最终都需要变成 byte[])
反序列化时,需要将传入的正文数据还原成 Java 对象,便于处理
目前的代码仅支持 Java 自带的序列化,反序列化机制,核心代码如下
1234567891011// 反序列化byte[] body = new byte[bodyLength];byteByf.readBytes(body);ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(body));Message message = (Message) in.readObject();message.setSequenceId(sequenceId);// 序列化ByteArrayOutputStream out = new ByteArrayOutputStream();new ObjectOutputStream(out).w ...

