本以为JVM中有一个强大的垃圾收集器,能够实时监控资源并即时清除已经死掉的对象。事实上直到现在为止还没有万能的收集器,我们选择的只是对具体应用最合适的收集器,下面就简单说说集中收集器吧。 Serial 收集器 最基本、发展历史最悠久的收集器,在JDK 1.3.1之前是虚拟机新生代收集的唯一选择。它是一个单线程收集器,在它就行垃圾收集工作时,必须暂停其他所有的线程,直到它收集结束。 具有简单高效的优点(没有线程交互的开销),现在依然是虚拟机运行在Client模式下的默认新生代收集器。 ParNew 收集器 Serial收集器的多线程版本,除了多线程收集之外,与Serial相比并没有太多创新。除了Serial收集器外,目前只有ParNew收集器能与CMS收集器配合工作,是运行在Server模式下虚拟机中首选的新生代收集器。 在单CPU的环境下,ParNew收集器不会比Serial收集器有更好的效果,但是随着CPU数量的增加,对GC时系统资源的有效利用还是有很多好处的。 Parallel 继续阅读 >>


李猛 18/08/14 08:51:34
1、brk释放内存和sbrk分配内存 #include<unistd.h> int brk(void *end_data_segment); 成功返回0,否则为-1 将内存边界设置为参数所指定位置 void *sbrk(intptr_t increment); 成功返回之前的内存边界,失败返回(void*)-1 增加内存边界,返回为新分配内存的起始位置(sbrk(0)就是获得堆位置) 使用的例子 #include <iostream> #include <unistd.h> using namespace std; int main() { int* phead; // 指向首位置 int* pnow; // 指向当前指针位置 pnow = sbrk(0); // 先分配空闲区域 phead = pnow; // 固定首位置不变 for(int i=2; i<10000; i++) { 继续阅读 >>


陈文浩 18/08/13 15:41:54
信号是由用户、系统或者进程发送给目标进程的信息,用来通知目标进程的状态改变或系统异常。 发送信号 kill #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); 该函数可以把sig信号发送给pid指定的目标进程 pid 参数 含义 pid > 0 信号发送给PID为pid的进程 pid = 0 信号发送给本进程组内的其他进程 pid = -1 信号发送给除init进程外的所有进程,但发送者需要拥有对目标发送信号的权限 pid < -1 信号发送给组ID为-pid的进程组中的所有成员 特别的如果sig为0的时候,kill函数不发送任何信号。 kill函数成功时返回0,失败返回-1,并设置errno errno 含义 EINVAL 无效的信号 EPERM 继续阅读 >>


李佳灏 18/08/13 15:26:36
生产者——消费者模型顾名思义,就是一个或多个线程往仓库生产东西,另外的线程从仓库拿东西,在咱们的线程池中也有所应用。咱们看看维基的解释: 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。 说了这么多,大家还是有点晕乎乎的,咱们看代码吧 #include<stdio.h> #include<unistd.h> #include<string.h> #include<pthread.h> //1 : 1 #defi 继续阅读 >>


李佳灏 18/08/13 08:34:37
August 6, 2018 Fix some issue #18 Fix crash when users serach last 3 days log bug tracker Thread 1 "gnome-logs" received signal SIGSEGV, Segmentation fault. 0x00007ffff595f5b4 in g_date_time_to_unix () from /lib/x86_64-linux-gnu/libglib-2.0.so.0 (gdb) bt #0 0x00007ffff595f5b4 in g_date_time_to_unix () at /lib/x86_64-linux-gnu/libglib-2.0.so.0 #1 0x000055555555ea7c in query_set_day_timestamps (query=0x555556772ce0, start_day_offset=<optimized 继续阅读 >>


刘嘉辉 18/08/12 12:27:36
MIT 6.828 在网上一直有很高的地位,但是由于上手难度太难,而且是MIT研究生的课程,让大家都望而却步. 但是如果想要深入透彻的了解计算机系统的架构和设计,这门课又是有很大帮助. 作为一个计算机学生,一个热爱学习,热爱技术的学生,我还是决定要去试试水. 后面将会慢慢讲解我遇到的所有问题和解决办法。如果有任何错误或者建议都可以和我交流。这里贴下我的邮箱 hellochen19970916@gmail.com (90后哦 haha) 本机环境 虚拟机VMware Fusion Ubuntu 16.04.4 参考资料 MIT 6.282 lab1 本人GItHub地址 课程描述 MIT 6.828 fall2017 本篇博客主要讲解本人在环境配置遇到的问题的解决的方法.(初学MIT 6.828课程,如果有错误欢迎指出) 首先 Software Setup You must use an x86 Athena machine; that is, uname -a shoul 继续阅读 >>


陈苏扬 18/08/12 05:01:14
项目需求: 将map中的内容部分填充到表格 没有数据的填写符号” - ” Go 的html/template包对HTML模板提供了丰富的模板语言。主要用于Web应用程序,在客户端的浏览中以结构化的方式显示数据。 go提供的模板填充接口,支持各种所以结构。 当渲染模板时,要访问模板中的数据,最前的变量是通过{{. }} 来访问。其中花括号中的点(.) 称为管道和root。 模板使用语法: {{/* comment */}} 定义一个注释 {{.Title}} 在嵌套元素中显示Title对应的字段 {{.}} 显示根元素 {{if .Title}} {{else}} {{end}} if else条件选择 {{range .Title}} {{.}} {{end}} 在Title上做循环显示每个元素 接口调用代码: func getResultHtml(mapInfo map[string]string) string { buf := new(bytes. 继续阅读 >>


卢晓丹 18/08/11 21:27:57
题目1 : 单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 示例: board = [ [‘A’,’B’,’C’,’E’], [‘S’,’F’,’C’,’S’], [‘A’,’D’,’E’,’E’] ] 给定 word = “ABCCED”, 返回 true. 给定 word = “SEE”, 返回 true. 给定 word = “ABCB”, 返回 false. 解题思路:简单DFS,注意边界条件的判断和点的回溯(index和visted) #include <iostream> #include <vector> #include <string> using namespace std; class Solution { public: strin 继续阅读 >>


刘生玺 18/08/11 09:54:45
生产者消费者模型 生产者消费者模型 一、 生产者消费者问题 二、 问题分析 三、 伪代码实现 四、代码实现(C++) 五、 互斥锁与条件变量的使用比较 一、 生产者消费者问题 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。 . 要解决该问题,就必须让生产者在缓冲区满时休眠(要么干脆就放弃数据),等到下次消费者消耗缓冲区中的数据的时候,生产者才能被唤醒,开始往缓冲区添加数据。同样,也可以让消费者在缓冲区空时进入休眠,等 继续阅读 >>


王良 18/08/11 00:43:20
特点 Linux 内核于内核2.6.25提供了一种创建定时器的 API, 那就是 Linux 特有的 timerfd API, 并且该定时器可以从文件描述符中读取其创建的定时器到期通知. 这也意味着, 可以将文件描述符通过多路复用监听并读取, 而其他的定时器想要将一个 (或多个) 定时器与一组文件描述符放在一起同时监听可不是一件容易的事. 函数接口 timerfd 系列 API 有三个系统调用 : 第一个系统调用, 该系统调用创建一个新的定时器对象 : #include <sys/timerfd.h> int timerfd_create(int clockid, int flags); //成功返回一个指代该对象的文件描述符, 失败返回-1及errno 第一个参数 clockid 可以设置为 CLOCK_REALTIME 和 CLOCK_MONOTONIC CLOCK_REALTIME 可设定的系统级实时时钟. 相对时间,从1970. 继续阅读 >>


吕子健 18/08/10 22:26:11