松花皮蛋的黑板報
  • 分享在京東工作的技術感悟,還有JAVA技術和業內最佳實踐,大部分都是務實的、能看懂的、可復現的

掃一掃
關注公眾號

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

博客首頁文章列表 松花皮蛋me 2019-03-24 16:35

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中的時間輪算法

黑龙江6+1开奖结果查询