写点什么

JVM& 秒杀案例

用户头像
幸福小子
关注
发布于: 2020 年 12 月 20 日

一.JVM

Java 是一种跨平台的语言,JVM 屏蔽了底层系统的不同,为 Java 字节码文件构造了一个统一的运行环境。


 

堆:每个 JVM 实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享。

堆栈:JVM 为每个新创建的线程都分配一个堆栈。也就是说,对于一个 Java 程序来说,它的运行就是通过对堆栈的操作来完成的。

Java 中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的引用而已。

方法区:主要存放从磁盘加载进来的类字节码,而在程序运行过程中创建的类实例则存放在堆里。程序运行的时候,实际上是以线程为单位运行的,当 JVM 进入启动类的 main 方法的时候,就会为应用程序创建一个主线程,main 方法里的代码就会被这个主线程执行,每个线程有自己的 Java 栈,栈里存放着方法运行期的局部变量。而当前线程执行到哪一行字节码指令,这个信息则被存放在程序计数寄存器。

 

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

JVM 通过一种可达性分析算法进行垃圾对象的识别,具体过程是:从线程栈帧中的局部变量,或者是方法区的静态变量出发,将这些变量引用的对象进行标记,然后看这些被标记的对象是否引用了其他对象,继续进行标记,所有被标记过的对象都是被使用的对象,而那些没有被标记的对象就是可回收的垃圾对象了。进行完标记以后,JVM 就会对垃圾对象占用的内存进行回收,回收主要有三种方法:

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

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

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


二.秒杀案例

技术挑战

1).瞬间高并发

2).风险:带宽耗尽

3).服务器:崩溃

设计原则

1).静态化

• 采用 JS 自动更新技术将动态页面转化为静态页面,图片合并成 1 张,CSS 偏移展示,减少 HTTP 请求数,减少请求等待数

2).并发控制,防秒杀器

• 设置阀门,只放最前面的一部分人进入秒杀系统

3).简化流程

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

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


用户头像

幸福小子

关注

还未添加个人签名 2018.11.08 加入

还未添加个人简介

评论

发布
暂无评论
JVM&秒杀案例