JVM整体结构 由于调整元空间的大小需要Full GC,这是非常昂贵的操作,如果应用在启动的时候发生大量Full GC,通常都是由于永久代或元空间发生了大小调整,基于这种情况,一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值,并设置得比初始值要大,对于8G物理内存的机器来说,一般我会将这两个值都设置为256M。-XX:NewRatio:默认2表示新生代占年老代的1/2,占整个堆内存的1/3。-Xms:设置堆的初始可用大小,默认物理内存的1/64。-Xmn:新生代大小。
JVM类加载及双亲委派机制 概念:加载某个类时会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的类加载路径中查找并载入目标类。//初始化自定义类加载器,会先初始化父类ClassLoader,其中会把自定义类加载器的父加载器设置为应用程序类加载器AppClassLoader。= null) { //如果当前加载器父加载器不为空则委托父加载器加载该类。} else { //如果当前加载器父加载器为空则委托引导类加载器加载该类。类加载的过程主要又类加载器完成。
netty常用组件 由于TCP协议本身的机制(面向连接的可靠地协议-三次握手机制)客户端与服务器会维持一个连接(Channel),数据在连接不断开的情况下,可以持续不断地将多个数据包发往服务器,但是如果发送的网络数据包太小,那么他本身会启用Nagle算法(可配置是否启用)对较小的数据包进行合并(基于此,TCP的网络延迟要UDP的高些)然后再发送(超时或者包大小足够)。服务器在接收到数据库后,放到缓冲区中,如果消息没有被及时从缓存区取走,下次在取数据的时候可能就会出现一次取出多个数据包的情况,造成粘包现象。这项关联是永久性的。
网络通信编程基础,BIO,NIO SelectionKey是一个抽象类,表示selectableChannel在Selector中注册的标识,其中有四种状态分别是OP_READ(读事件),OP_WRITE(写事件),OP_CONNECT(发起连接事件),OP_ACCEPT(接收连接事件)jvm在向socket缓冲区发送信息时,会在堆外重新开辟一块内存,将要发送的信息拷贝进去。这样做的原因是防止在gc的时候,改变堆内信息的位置。1减少了垃圾回收的工作,因为垃圾回收会暂停其他的工作(可能使用多线程或者时间片的方式,根本感觉不到)......
网络通信编程基础,BIO,NIO SelectionKey是一个抽象类,表示selectableChannel在Selector中注册的标识,其中有四种状态分别是OP_READ(读事件),OP_WRITE(写事件),OP_CONNECT(发起连接事件),OP_ACCEPT(接收连接事件)这样做的原因是防止在gc的时候,改变堆内信息的位置。1减少了垃圾回收的工作,因为垃圾回收会暂停其他的工作(可能使用多线程或者时间片的方式,根本感觉不到)在连接建立之后,在读到socket信息之前,线程也是一直在等待的,阻塞在那里。堆外内存的优点和缺点。...
网络通信及TCP/IP协议 新入职员工加入公司网络,他会通过ARP协议(数据链路层)进行广播,公司的DHCP服务器收到广播后会根据新员工的MAC地址分配IP。●数据报(datagram)IP中数据的单位。TCP是双全工(即客户端和服务端可以同时发送和接收请求),所以需要双方都确认关闭连接。●报文段(segment)TCP数据流中的信息,报文加上tcp包首部(20字节)●报文/消息(message)应用层传到传输层(tcp)的数据。●帧(frame)表示数据链路层中包的单位。TCP/IP中的数据术语。...
AQS之CyclicBarrier源码解析 我们在前面的reentrantlock,semaphore和countDownLatch中都能看到AQS的addWaiter()方法,是构建同步等待队列的双向链表的。first变为thread1所在的node节点,再次循环进入transferForSignal()方法,将thread1所在的node入队同步队列。我们看到先是通过cas操作将node(thread0)节点的waitStatus又-2变为0,然后看到了我们熟悉的enq()方法可知道,此时同步队列已经构建完成,thread0所在的节点入队。...
AQS之countDownLatch源码分析 CountDownLatch(闭锁)是一个同步协助类,允许一个或多个线程等待,直到其他线程完成操作集。 进入await()方法发现acquireSharedInterruptibly()方法是传入固定参数1。 又是AQS这块熟悉的代码,先是try尝试,然后是do进行一些列入队和阻塞操作。从这个方法我们可以看到countDownLatch是共享锁。 闭锁的try方法相当简单,其state为我们创建闭锁时传入的值。返回-1,进入我们
AQS之semaphore源码分析 一个简单的买票逻辑模拟。我们还是按照分析reentrantlock的debug方式来分析代码。 我们还是首先控制thread0进入上锁acquire()方法,传入的arg参数为1,进入tryAcquireShared(arg)方法 进入nonfairTryAcquireShared(int acquires)方法,此时,AQS中控制状态的state属性就是我们创建semaphore时初始化的数值(在非共享锁中,我们知道AQS的state为0时就需要阻塞线程了),最后返回rema
AQS之ReentrantLock源码解析 ReentrantLock加锁解锁的逻辑。公平和非公平,可重入锁的实现。并发场景下入队和出队的操作。一个简单的代码,我们打上断点,选择线程的模式,来看看线程内部是如何执行的。 两行代码。compareAndSetState(0, 1)通过cas运算将锁状态由0改为1setExclusiveOwnerThread(Thread.currentThread()) 将锁绑定到该线程,上锁完成。 通过上面两行逻辑完成上锁。此时thread0以执行完成,sum值为10000,但是暂未释放锁。我们
从普通查询商品到高并发查询商品的优化思路 version 0问题1:商品越来越多,redis承载越来越大version 1问题1解决思路:设置超时时间问题2:我们一般会在启动时初始化redis的产品库存,如果这样设置的话,可能发生在同一时间大量缓存失效的情况。version 2问题2解决思路:将redis的有效时间从固定时间变为可变时间。问题3:对于冷门商品可能半年都没有人浏览过,针对这一对能不能减少我们redis的存储呢...
redis实现分布式锁思路及redission分布式锁主流程分析 首先,我们来看一段问题比较明显的代码。 /** * 存在并发问题 * @param productId * @return */ private String reduceStock1(String productId) { Integer stock = Integer.parseInt(redisTemplate.opsForValue().get(productId)); if(stock>0){
kubernetes(k8s)集群搭建 搭建K8S集群,准备三台2核4g的虚拟机,操作系统选择centos7以上,安装好doker。三台机器前置准备关闭防火墙systemctl stop firewalldsystemctl disable firewalld关闭selinuxsed -i 's/enforcing/disabled/' /etc/selinux/config关闭swapvim /etc/fstab注释掉swap这...
订单交易简析 1.订单交易流程分析订单交易作为涉及到钱的部分势必要谨慎,我们来大体分析一下其中的流程。检查(把不必要的请求第一时间挡回去) 检查本地缓存是否售罄 校验是否有权限购买 判断redis库存是否充足 检查是否排队当中 .... ... 获取产品信息 验证秒杀或活动时间是否超时 获取会员信息 获取会员地址 预减库存 生成下单商品信息 库存处理下面主要分析一下最重要的1,6和8项。2.检查在检查中最主要的就是检查我们r...
高并发下后端的两级缓存 对于高并发我们以最常见最具代表性的商城商品详情页为例,来看看我们如何从最简单的crud进行优化的。1.直接访问数据库 我们直接访问数据库。public PmsProductParam getProductInfo1(Long id) { PmsProductParam productInfo = portalProductDao.getProductInfo(id); if (null == productInfo) { r...
【无标题】 安装1.获取安装包wget https://fastdl.mongodb.org/linux/m2ongodb-linux-x86_64-rhel70-4.4.2.tgz2.进行解压tar -xvzf mongodb-linux-x86_64-rhel70-4.4.2.tgz3.添加到系统执行路径( ~/.bashrc)export PATH=$PATH:<你机器MongoDB bin目录,如:/usr/local/mongodb/mongodb-linux-x.
InitializingBean接口及示例 定义InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。示例全量数据加载到布隆过滤器中@Slf4j@Configurationpublic class BloomFilterConfig implements InitializingBean{ @Autowired private PmsProductService product..
@PostConstruct注解及用处示例 注解解释@PostConstruct注解在方法上,表示此方法是在Spring实例化该Bean之后马上执行此方法,之后才会去实例化其他Bean 一个Bean中@PostConstruct注解的方法可以有多个。 @PostConstruct该注解被用来修饰一个非静态的void()方法。 被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。用处@PostConstruct注解Bean中的某些方法,可以用在服务器启动时的做一些初始化工