免费营销软件网站建设,做网站用什么数据库好用,建设局网站公示的规划意味着什么,阳朔到桂林机场在高并发、高吞吐的场景下#xff0c;很多简单的事情#xff0c;会变得非常复杂#xff0c;而很多程序并没有在设计时针对高并发高吞吐量的情况做好内存管理。
自动内存管理机制的实现原理
做内存管理#xff0c;主要考虑申请内存和内存回收两部分。
申请内存的步骤很多简单的事情会变得非常复杂而很多程序并没有在设计时针对高并发高吞吐量的情况做好内存管理。
自动内存管理机制的实现原理
做内存管理主要考虑申请内存和内存回收两部分。
申请内存的步骤
计算要创建的对象需要占用多少内存在内存中找一块连续并且是空闲的内存空间标记为已占用
内存回收需要主要做2件事情。
找出所有可以回收的对象将其标记为空闲整理内存碎片
现代GC算法大部分采用“标记-清除”算法或者他的变种算法这种算法分为标记和清除两个阶段
标记阶段从GC Root开始可以简单把GC Root理解为程序入口的那个对象标记所有可达的对象因为程序中所有在用的对象一定会被这个GC Root直接引用或者间接引用。清除阶段遍历所有对象找出所有没有标记的对象这些没有标记的对象都是可以被回收的清除这些对象释放相应的内存。
“标记-清除”算法的一个最大问题是在标记和清除过程中必须先把进程暂停否则计算的结果就是不准确的。这也是为什么发生垃圾回收的时候我们的程序会卡死的原因。
需要注意垃圾回收完成后我们还需要进行内存碎片整理将不连续的空闲内存移到到一起以便空出足够的连续内存空间供后需用。
虽然自动内存管理机制有效地解决了内存泄露问题带来的代价是执行垃圾回收时会暂停进程如果暂停的时间过长程序看起来就像“卡死了”一样。
服务为什么会在高并发时忽然“卡死”
在高并发、高吞吐量场景下我们的程序会非常忙短时间内会创建大量的对象这些对象会迅速占满内存由于没有内存可用垃圾回收被迫开始启动并且这次被迫执行的垃圾回收面临的是占满整个内存的海量对象它执行的时间也会增加相应的这个回收过程会导致进程长时间暂停。
进程长时间暂停又会导致大量的请求积压等待结果垃圾回收刚刚结束更多的请求立刻涌来迅速占满内存再次被迫执行垃圾回收进入一个恶性循环如果垃圾回收的速度跟不上创建对象的速度还可能会产生内存溢出的现象。
高并发下的内存管理技巧
对于开发者来说垃圾回收是不可控的而且是无法避免的但是我们可以通过一些方法来降低垃圾回收的频率减少进程暂停的时长。
我们需要考虑在处理大量请求的同时尽量少的产生一次性对象特别是占用内存比较大的对象。我们可以按照这个思路来优化对象的业务代码。
对于需要频繁使用、占用内存较大的一次性对象我们可以考虑自行回收并重用这些对象例如我们可以为这些对象创建一个对象池收到请求后在对象池里面申请一个对象使用完后再放回到对象池中这样就可以反复地重复使用这些对象非常有效地避免频繁触发垃圾回收。