ARTS-2-新型垃圾回收算法

松花皮蛋me 2019-03-24 16:35
文章首发于公众号 松花皮蛋的黑板报松花皮蛋的黑板报,作者就职于京东,在稳定性保障、敏捷开发、高级JAVA、微服务架构有深入的理解

ARTS的初衷

Algorithm: 主要是为了编程训练和学习。

Review:主要是为了学习英文

Tip:主要是为了总结和归纳在是常工作中所遇到的知识点。学习至少一个技术技巧。在工作中遇到的问题,踩过的坑,学习的点滴知识。

Share:主要是为了建立影响力,能够输出价值观。分享一篇有观点和思考的技术文章

https://www.zhihu.com/question/301150832

一、Algorithm

3sum题

Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

The solution set must not contain duplicate triplets.

Example:

Given array nums = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
       Arrays.sort(nums);
       int left = 0;
        int right = nums.length-1;
        List<List<Integer>> res = new ArrayList();
       for(int i=0;i<nums.length;i++) {
           if(i>0 && nums[i]==nums[i-1]) continue;
           left = i+1;
           right = nums.length-1;
           while(left<right) {
               int s = nums[i]+nums[left]+nums[right];
               if(s>0) {
                   right--;
               } else if(s<0) {
                   left++;
               } else{
                   List<Integer> tmp = new ArrayList();
                   tmp.add(nums[i]);
                   tmp.add(nums[left]);
                   tmp.add(nums[right]);
                   res.add(tmp);
                   left++;
                   right--;
                   while(left<right && nums[left]==nums[left-1]) {
                       left++;
                   }
                   while(left<right && nums[right]==nums[right+1]) {
                       right--;
                   }
               }
           }
       }
        return res;  
    }
}

二、Review

https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/Heres-how-to-get-by-without-Concurrent-Mark-Sweep
目前最流行的并发标记清除GC算法CMS(初始标记-并发标记-并发预清理-重新标记-并发清理-并发重置)将在JAVA9中被标记为deprecated,不过我们有更好的两个选择,从JAVA9开始默认的G1 GC算法和JAVA11开始支持的Z GC算法。G1另外优化了对重复String对象在内存中的计算,Z算法则是在垃圾回收时有较好的停顿时间(pause times less than 10ms)

总体来说,G1跟CMS一样,是一个低延时的收集器,同样牺牲了吞吐量,不过二者之间得到了很好的权衡。G1与CMS对比有以下不同点:

(1)、分代:CMS中,堆被分为PermGen、YoungGen、OldGen,而YoungGen又分了两个survivo区域。在G1中,堆被平均分成几个区域,在每个区域中,虽然也保留了新老代的概念,逻辑划分,但是收集器是以整个区域为单位收集的

(2)、算法:相对于CMS的”标记-清理”算法,G1会使用压缩算法,保证不产生多余的碎片,收集阶段,G1会将某个区域存活的对象拷贝到其他区域,然后将整个区域回收

(3)、停顿时间可控:为了缩短停顿时间,G1建立可预测停顿模型,这样在用户设置的停顿时间范围内,G1会选择适当的区域进行收集,确保停顿时间不超过用户指定时间

不过我觉得应该综合考虑内存碎片、平均停顿时间和吞吐量选择合适的GC算法,当然再结合一定的性能调优更好啦。

三、Tip

本周跟进了物理机容量层次视图,涉及到j-one发布系统和IDC系统接口、Cmdb的改造,和运维的手工录入操作,整体进展不够快,后面还是能尽快Close掉的需求不要拖到下周吧。

四、Share

从如何表现无限时间和如何推进谈谈Kafka中的时间轮算法


文章已于2019-07-15 14:20修改,变动:补充说明
阅读 277 次