写点什么

架构师训练营第九周作业

用户头像
我是谁
关注
发布于: 2020 年 11 月 20 日

一、请简述 JVM 垃圾回收原理

JVM 垃圾回收就是将 JVM 堆中的已经不再被使用的对象清理掉,释放宝贵的内存资源。PS:C++通过手动施放资源的方式进行回收,C#和 java 均通过系统通过算法进行自动回收,所以我们必须摸清楚系统回收原理确保内存资源的回收。


JVM 的回收重点在如何对象标记怎样回收

1、标记哪些对象,如何标记对象

什么对象被标记:

没有被引用的对象。

如何标记:

1、什么叫没有被引用? JVM 通过一种可达性分析算法进行垃圾对象的识别,具体过程是:

从线程栈帧中的局部变量,或者是方法区的静态变量出发,将这些变量引用的对象进行标记,然后看这些被标记的对象是否引用了其他对象,继续进行标记,所有被标记过的对象都是被使用的对象,而那些没有被标记的对象就是可回收的垃圾对象了。

具体可以参考:https://blog.csdn.net/carson_ho/article/details/102540797


2、【其他方法】引用计数法(Reference Counting)

核心思想:很简单,每个对象都有一个引用计数器,当在某处该对象被引用的时候,它的引用计数器就加一,引用失效就减一。引用计数中的值一但变为 0,则该对象就成为垃圾了。但目前的 JVM 没有用这种标记方式。为什么呢?

因为引用计数无法解决循环引用(对象引用关系组成“有向有环图”的情况,涉及一些图论知识)的问题。


2、怎样回收

回收时内存的处理方法

  • 清理:将垃圾对象占据的内存清理掉,其实 JVM 并不会真的将这些垃圾内存进行清理,而

是将这些垃圾对象占用的内存空间标记为空闲,记录在一个空闲列表里,当应用程序需要创

建新对象的时候,就从空闲列表中找一段空闲内存分配给这个新对象。

  • 压缩:从堆空间的头部开始,将存活的对象拷贝放在一段连续的内存空间中,那么其余的空

间就是连续的空闲空间。

  • 复制:将堆空间分成两部分,只在其中一部分创建对象,当这个部分空间用完的时候,将标

记过的可用对象复制到另一个空间中。

回收的方式:使用缓存提高回收效率


回收器算法:如何提高回收效率,不影响系统正常运行

G1 垃圾回收的思想就是将内存进行合理分区,提高处理的效率


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

挑战和问题

  • 超高流量:有大量的在线用户,不断的刷新页面,可能导致带宽占满

  • 瞬间的高并发:在秒杀的瞬间,超高的并发请求,给服务器响应带来的压力

  • 系统安全:通过漏洞或其他方式进行提取秒杀

  • 系统稳定:确保秒杀活动的正常运行,不能宕机

思路

  • 缓存。尽量减少应用服务器和数据库服务器的请求。

  • 尽量使用静态资源,通过 CDN,将静态资源前移。分散带宽的占用,并减少应用服务器的请求

  • 使用 Redis 等缓存,减少数据库服务器请求

  • 限流

  • 在各层进行通过在 CDN、反向代理等前置的服务器,每个节点只允许一部分流量进入下一层。其他的流量直接返回秒杀结束

  • 业务流程优化

  • 砍掉不重要的分支流程,如下单页面的所有数据库查询

  • 以下单成功作为秒杀成功标志。支付流程只要在 1 天内完成即可

  • 分散秒杀活动的时间点

  • 前端优化

  • 提升前端页面响应速度。通过 YSLOW 提升前端页面响应速度

  • 优化用户体验。比如进行合理的提示。如“秒杀已结束”、“当前人数过多,正在排队等候”等

  • 备份

  • 预览备份服务器,在某服务器宕机或负载过高时,启动备份服务器进行分流

三、根据当周学习情况,完成一篇学习总结

本周主要从 数据库、JVM 原理以及 java 代码优化 进行学习。

数据库方面:

  • 合理的索引

  • 使用预编译,提高效率和防止 sql 注入

JVM

  • 理解回收算法,确保合理的对象生命周期

  • 使用工具进行检查

  • 基本工具:JPS ,JSTAT,JMAP,JSTACK

  • 集成工具: JConsole,JVisualVM

java 代码优化

  • 合理并谨慎使用多线程

  • 竞态条件与临界区

  • Java 线程安全

  • 防止内存泄露,缩短对象生命周期,加速垃圾回收

  • 减少对象驻留内存的时间

  • 在使用时创建对象,用完释放

  • 创建对象的步骤(静态代码段-静态成员变量-父类构造函数-子类构造函数)

  • 使用 I/O buffer 及 NIO

  • 延迟写与提前读策略

  • 异步无阻塞 IO 通信

  • 优先使用组合代替继承

  • 减少对象耦合

  • 避免太深的继承层次带来的对象创建性能损失

  • 合理使用单例模式

  • 无状态对象

  • 线程安全

  • 计算机的任何问题都可以通过虚拟层(或者中间层)解决

  • 面向接口编程

  • 7 层网络协议

  • JVM

  • 编程框架

  • 一致性 hash 算法的虚拟化实现


用户头像

我是谁

关注

还未添加个人签名 2017.12.04 加入

十五年电子政务老兵

评论

发布
暂无评论
架构师训练营第九周作业