G1 GC는 Generational GC의 단점을 보완한다!
-> CMS GC를 대체하기 위한 Low-Pause & Concurrent Garbage Collector 임.
-> Stop-The-World에 의한 Pause Time을 예측할 수 있음(Soft Real-Time)
-> Compaction을 동반하므로, Fragmentation을 줄일 수 있음
-> 세대별(Generational)로 객체를 관리하며 Parallel/Concurrent 수행방식은 기존의 Collector아 비슷하나, Young영역과 Old영역의 구분을 특정하지 않는 일정한 크기의 Region으로 관리됨
주요 point :
*예측
*Compaction
- - - - - - - - - -
단계 :
Evacuation Pause : Minor GC와 동일한 작업으로, Young 영역을 G 한다. (STW 발생)
Concurrent Cycle : Old 영역을 GC하기 위한 사전 단계로, live 객체를 Marking 한다.
Mixed GC : Old 영역에 대한 GC를 마무리하는 단계로, Young 영역과 Old 영역을 동시에 GC한다.
- - - - - - - - - -
Evacuation Pause
- 대부분의 단계가 Parallel로 수행
- STW 발생
Ext Root Scanning : 각 GC Thread들이 Global, Register, Thread stack 등에서 root 노드 검색
Update RS : Remembered Set* 정보를 갱신
Scan RS : 업데이트 된 remembered Set 정보를 기반으로 Reference를 가진 객체들를 탐색
Object Copy : Scan RS에서 탐색한 객체들을 다른 Region으로 복사. Eden -> Survivor , Survivior -> Old
Termination : 종료 Thread가 다른 Thread 들의..
*용어설명
*Remembered Set : 해당 Region내의 각체로 Refernece하는 객체들의 목록
*Collection Set : GC시 수집될 Region들의 목록
- - - - - - - - - -
Concurrent Cycle
- IHOP에서 지정한 수치가 넘어가면 Trigger됨.
- initial-mark 이후 수행됨 (initial-mark는 Young GC시 함께 수행)
Root Region Scan
Concurrent mark
Remark
Cleanup : Region 내 살아있는 객체 정보를 갱신하고, Empty region을 식별(STW 발생)
Concurrent Cleanup : Empty Region을 Reset하고, 미사용 영역에 추가함(Empty Region이 없으면 Skip)
*용어설명
*IHOP(InitiatingHeapOccupancyPercent) : Heap이 일정 비율만큼 차지하면 Marking을 수행하도록 하는 옵션. 기본값은 45(%)
- - - - - - - - - -
Mixed GC
- Evacuation Pause(Young GC)와 동일
- Young 영역과 Old 영역이 동시에 수집됨
- 여러 번으로 나누어 수행됨
- STW 발생
(살아있는 객체가 적은 Young/Old 영역들이 GC 및 Compaction의 대상이 됨(GC 목표시간/빈도 반영)
Ext Root Scanning
Update RS
Scan RS
Object Copy
Termination
- - - - - - - - - -
G1 GC를 요약하면 다음과 같다 !
- JAVA 1.7부터 정식 지원
- 여러개의 영역(Region)으로 나누어 관리되며, 각 영역의 역할(Eden/Young/Old)은 쉽게 변경이 가능
- MinorGC는 Evacuation Pause로 수행, MajorGC는 최대한 Application과 동시에 수행할 수 있도록 Concurrent Cycle과 Mixed GC(Evacuation Pause)로 구부하여 수행됨
- 각 Region에는 살아있는 객체 정보를 가지고 있으며, 이것을 바탕으로 먼저 Garbage 되어야 하는 Region을 결정
- GC 수행 시 Compaction을 수행함으로 인해 Fragmentation을 줄여 연속된 메모리 할당에 효율적
- 객체 크기가 Region의 1/2보다 큰 경우, humongous 영역으로 관리
장점 !
- 상대적으로 GC 성능 우수
- 수행시간 예측 가능, STW 지속시간을 줄일 수 있음
- FullGC 지속시간 및 빈도를 줄일 수 있음
- - - - - - - - - -
2016년 12월 6일 화요일
2016년 7월 25일 월요일
dfs 알고리즘 : NQueen
package N_Queen;
import java.util.Scanner;
public class source {
static int n;
static int arr[][] = new int[15][15];
static boolean chk[] = new boolean[15];
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
System.out.println(back(1));
}
static int back(int k){
if (k==n+1) return 1;
int total=0;
for (int i=1;i<=n; i++){
if(chk[i]) continue;
boolean impossible = false;
for(int j=1; j<k; j++){
if (i-j>0 && arr[k-j][i-j]==1) impossible = true;
if (i+j<=n && arr[k-j][i+j]==1) impossible = true;
}
if(impossible) continue;
arr[k][i] = 1;
chk[i] = true;
total += back(k+1);
arr[k][i] = 0;
chk[i] = false;
}
return total;
}
}
2016년 7월 4일 월요일
2016년 2월 5일 금요일
composite key in hive with hbase
CREATE TABLE hbase_table_3(key string, value2 int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" = ":key,a:b"
);
INSERT OVERWRITE TABLE hbase_table_3
SELECT coalesce(concat(stock_symbol,'-',year(trade_date)),'NULL'), count(*)
FROM stock_trade
group by coalesce(concat(stock_symbol,'-',year(trade_date)),'NULL');
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" = ":key,a:b"
);
INSERT OVERWRITE TABLE hbase_table_3
SELECT coalesce(concat(stock_symbol,'-',year(trade_date)),'NULL'), count(*)
FROM stock_trade
group by coalesce(concat(stock_symbol,'-',year(trade_date)),'NULL');
2016년 1월 16일 토요일
Fitbit REST API : Getting an access_token
After Obtaining User's Consent,
Fitbit.com will redirect to your server.
This is a code for the server.
I'll store access_token and refresh_token.
Fitbit.com will redirect to your server.
This is a code for the server.
I'll store access_token and refresh_token.
@RequestMapping(value="/restTest", method=RequestMethod.GET) public String restTest(@RequestParam(value="code", required=false) String code) { StringBuilder sb = new StringBuilder(); if(code!=null) { HttpClient httpclient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(REST_URL_TO_GET_TOKEN);
httpPost.setHeader("Authorization",AUTH_APPID_APPSECRET);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("client_id", CLIENT_ID));
nvps.add(new BasicNameValuePair("grant_type", "authorization_code"));
nvps.add(new BasicNameValuePair("redirect_uri", REDIRECT_URL));
nvps.add(new BasicNameValuePair("code", code)); StringBuilder contentSb = new StringBuilder();
try { httpPost.setEntity(new UrlEncodedFormEntity(nvps));
HttpResponse response = httpclient.execute(httpPost);
HttpEntity resEntity = response.getEntity(); if (resEntity != null) { BufferedReader rd = new BufferedReader(new InputStreamReader( response.getEntity().getContent()));
String line = null;
while ((line = rd.readLine()) != null) { contentSb.append(line);
} } httpPost.abort();
} catch (Exception e) { sb.append("Exception::" + e.getStackTrace().toString());
} sb.append(contentSb.toString()); } //if(code!=null)
return sb.toString();
}
Authorization Header Example
This example assumes that the
code URI parameter value in the callback URI was 1234567890.POST https://api.fitbit.com/oauth2/token
Authorization: Basic Y2xpZW50X2lkOmNsaWVudCBzZWNyZXQ=
Content-Type: application/x-www-form-urlencoded
client_id=22942C&grant_type=authorization_code&redirect_uri=http%3A%2F%2Fexample.com%2Fcallback&code=1234567890
Example Response:
{
"access_token": "eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0MzAzNDM3MzUsInNjb3BlcyI6Indwcm8gd2xvYyB3bnV0IHdzbGUgd3NldCB3aHIgd3dlaSB3YWN0IHdzb2MiLCJzdWIiOiJBQkNERUYiLCJhdWQiOiJJSktMTU4iLCJpc3MiOiJGaXRiaXQiLCJ0eXAiOiJhY2Nlc3NfdG9rZW4iLCJpYXQiOjE0MzAzNDAxMzV9.z0VHrIEzjsBnjiNMBey6wtu26yHTnSWz_qlqoEpUlpc",
"expires_in": 3600,
"refresh_token": "c643a63c072f0f05478e9d18b991db80ef6061e4f8e6c822d83fed53e5fafdd7",
"token_type": "Bearer",
"user_id": "26FWFL"
}
2015년 12월 4일 금요일
카산드라에서 하둡으로
SSTable에 대한 이해(cassandra)
http://bcho.tistory.com/657
aeigisthus 참고
NETFILX Tech blod 내용 (2012.2)
http://techblog.netflix.com/2012/02/aegisthus-bulk-data-pipeline-out-of.html
--> rdb와 hdfs간의 데이터 이동은 여간해선 sqoop으로 해결.
피드 구독하기:
글 (Atom)