写点什么

week09 作业

用户头像
追风
关注
发布于: 2020 年 11 月 22 日



作业一:



1、请简述 JVM 垃圾回收原理。

JVM 垃圾回收即将JVM堆中已经不再被使用的对象清理掉,释放宝贵的内存资源。

JVM 通过一种可达性分析算法进行垃圾对象的识别,具体过程是:从线程栈帧中的局部

变量,或者是方法区的静态变量出发,将这些变量引用的对象进行标记,然后看这些被

标记的对象是否引用了其他对象,继续进行标记,所有被标记过的对象都是被使用的对

象,而那些没有被标记的对象就是可回收的垃圾对象了。

进行完标记以后,JVM就会对垃圾对象占用的内存进行回收,回收主要有三种方法:

  • 清理

将垃圾对象占据的内存清理掉,其实 JVM 并不会真的将这些垃圾内存进行清理,而 是将这些垃圾对象占用的内存空间标记为空闲,记录在一个空闲列表里,当应用程序需要创 建新对象的时候,就从空闲列表中找一段空闲内存分配给这个新对象。



  • 压缩

从堆空间的头部开始,将存活的对象拷贝放在一段连续的内存空间中,那么其余的空 间就是连续的空闲空间。



  • 复制

将堆空间分成两部分,只在其中一部分创建对象,当这个部分空间用完的时候,将标记过的可用对象复制到另一个空间中。

清理会造成内存碎片,压缩影响性能,我们常用的还是复制。



JVM 分代垃圾回收



  1. 创建新对象在Eden区,当Eden区满了以后,就会进行Young GC,把在用的对象copy到From区;

  2. 当Eden区再次满了以后,再次进行YoungGC,把Eden区和From区的在用对象,copy到To区;

  3. 当多次Eden发送YoungGC,把一些还用的对象放到老年代;

  4. 当老年代满了以后,就会进行Full GC。这是要应用线程都要暂停,进行Full GC。



JVM 垃圾回收器算法



  • 串行回收器:当JVM空间满了以后,stop-the-world 停止所有应用程序的线程,进行垃圾回收。

  • 并行回收器:多CPU时代,当JVM空间满了以后,stop-the-world 多线程进行垃圾回收。

  • 并发回收器CMS:初始化标记静态变量等以及引用的对象 > 并发标记 > 重标记(因为对象一直在创建。所以这个阶段也会stop-the-world)> 并发清理。

  • G1回收器(主流):效率更高。每次stop-the-world的时候,只会清理一部分区域,控制范围更小一些。

G1 垃圾回收内存管理机制



作业二:

设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?



秒杀其实主要解决两个问题,一个是并发读,一个是并发写。并发读的核心优化理念是尽量减少用户到服务端来“读”数据,或者让他们读更少的数据。

核心原则:

  1. 数据要尽量少

指用户请求的数据能少就少。请求的数据包括上传给系统的数据和系统返回给用户的数据(通常就是网页)。

2. 请求数要尽量少

用户请求的页面返回后,浏览器渲染这个页面还要包含其他的额外请求,比如说,这个页面依赖的 CSS/JavaScript、图片,以及 Ajax 请求等等都定义为“额外请求”,这些额外请求应该尽量少。

3. 路径要尽量短

所谓“路径”,就是用户发出请求到返回数据这个过程中,需求经过的中间的节点数。

4. 依赖要尽量少

所谓依赖,指的是要完成一次用户请求必须依赖的系统或者服务,这里的依赖指的是强依赖。

5. 不要有单点



解决方案:

1、动静分离

图片、js、css和静态页面通过CDN和服务器单独部署

2、热点数据缓存

考虑多级缓存

3、流量削峰

通过流量多级控制

4、性能优化

从硬件和JVM调优方面入手



用户头像

追风

关注

还未添加个人签名 2018.01.08 加入

还未添加个人简介

评论

发布
暂无评论
week09作业