又是飞花的季节了。多愁善感的林妹妹看到柳絮说:“嫁与东风春不管,凭尔去,忍淹留。”宝姐姐看了却来一句:“好风凭借力送我上青云”。

特别羡慕情商高的人,经常在想他们是怎么做到的。从来看不出他们不喜欢谁,满眼里都是真诚。渐渐的开始能够理解所有的人。比如:有些女孩爱化很浓的妆,后来才想到不是所有的人都天生皮肤细,清水洗把脸就可以出门。现实的女孩大都是梦碎之后被碎片扎的遍体鳞伤,更应该被呵护才是。爱钱是因为不是所有的人都有不依靠别人就能活的能力,谁最先想到的不是衣食住行呢。但我还是理解不了浪费粮食的,不管是植物还是动物,为了我付出了自己的生命,我好歹也应该让它成为我身体的一部分,和它一起好好的活着~~

我是一个心想事成的人,人生少走了很多弯路,少了很多思考,也少了很多对他人的理解。还好大脑的自动补全能力比较强。在超市里,我走到酒的那一排都会绕着走,因为总是感觉酒瓶子会掉下来碎掉。有次看《神盾局特工》看完了换一下节目才发现静音了。因为之前看过好几集了,看到字幕大脑里自动把声音补上了,竟然没发现。不知道这个能力和语言天赋之间有没有什么联系。但是我的大脑会存储很多的声音,很少存储图像。很少真正很关心一个人的长相。对于我,一个有磁性声音的人会更有魅力。不知道这个和写不好字的缺陷之间有没有什么联系[衰]。小鲜肉的这种能力在他一岁的时候就体现出来了。一个妈妈推着一个宝宝在前面走,他看到小推车上的水壶有一半在外面往下沉。他就大喊:要掉出来了,要掉出来了。别人没怎么样,他急得不行了。

心想事成是一种性格,而不是能力。小鲜肉如果有想做的事儿,想要的东西,他很少直接说。他会非要别人去猜他怎么想的。我却总是想办法让他自己说出来,因为这样的一种做事方式,他会终生受益的。比如说:俞伯牙如果是我这样的性格,来了一个人,不管是谁,他在弹琴,他就会说:我弹的高山,我弹的是流水。也就不会“知音难觅”一说了。这样的人因为少了让别人去理解自己这一步,所以更多会考虑怎么理解别人。这样的人还很单纯,单纯的人脸上会独有一种“笑起来很甜”。

《小王子》里的小主人公整个人生都在探索自己为什么会爱上那朵玫瑰。那花儿长的美,却矫情,虚荣,带给了他无尽的痛苦。最后受到了小狐狸的启发才发现:那花儿的独一无二在于他对花儿的付出,花儿对自己的驯服。其实哪有那么纠结?爱了就爱了呗。

在现实中,会是这样一种情况。两个男孩喜欢同一个女孩子。其中一个男孩总是在想:“我拥有什么资本能让她对我不离不弃呢,我有没有比另一个男孩更优秀,如果她看清楚了真实的我会不会不喜欢我?我的付出会不会一无所获?她是不是一个好女孩?”另一个男孩只在想一件事,那就是我喜欢那个女孩子我要让她知道。一个够聪明的女孩子就算心里喜欢的前一个,无论理智还是情感,她也不会选他(碰上我这种爱给自己找麻烦的人另当别论[汗])。因为这样人的性格产生的连锁反应是:总是在权衡利弊,人会越来越自私,自我为中心,不愿意付出。想的太多,做的太少,害怕承担后果,这样的人根本没有真心去爱一个人的基本能力。而后一个男孩:想到就去做了,他会想各种方法去达到目的,做了很多,承担了很多,会更有担当和责任心。为啥我会想这些呢?好歹咱也是中科院心理学的研究生,不能白学啊!

一定要相信周围的人都是很聪明的,自己是什么样的人,别人都是可以看出来的,所以也没有什么必要藏着掖着的。想了很多,也总有自己没有考虑到的因素。谷歌的对弈软件也不能百分百分取胜。所以,只要去做自己想做的事儿就可以了,想多想少,结果可能没有那么大的差别,失之东隅收之桑榆。做和不做,区别可就大了。

小狐狸对小王子说:“如果你驯服了我,我的生命就会充满阳光……我不吃面包,麦子对我本没有什么意义,麦田更不会让我产生联想,可一旦你驯服了我,一切都改变了,因为你有金色的头发,再看到麦田我就会想起你,而且我还会喜欢倾听风吹满麦浪的声音……” 小狐狸忍受着最终会哭一场的后果让小王子驯服了自己。最终小王子选择了回去找自己的玫瑰。但是小狐狸的生命从此鲜活起来,一切都有了意义。

额~~,说多了。在想离线数据这个项目的独特之处在哪里。它用到了很多和JVM打交道的地方,顺便将这个总结一下。

我既然把内存参数配置设置成了这个样子。我当然要知道这么庞大的资源都干了啥。特别是半夜跑全量的时候,我有次测试了一晚上,第二天早上睡觉中午醒来发现那台机器登录不了了。找运维,他们也登录不了,最后只好重启了服务器。我分析发现新生代设置的不合适,导致它没有空间进行full gc。结果内存全满了。最喜欢做这样的项目了,用现成的框架,程序会死,把机器弄死很不容易的[偷笑]

首先说我们线上JVM用的Hotspot,因为是64位机器,只支持server模式的。使用默认的JIT编译器模式。Java7。因为在java8中移除了永久代,牺牲了一点性能来获取更高的安全保障。但这个程序是个后台服务,升级java8反而不合适了。

处理数据对象特别大,有的压缩前30多M。因为搜索哥哥们规定实时消息一个专辑下要包含所有的视频,有的专辑下面有几万个视频[哭笑]。所以在处理这一条数据的时候,处理完的部分仍在内存中。为了可维护,晚上全量推送和其他时段的实时推送数据处理部分逻辑共用。晚上全量是用50个线程的线程池来跑的。如果50个线程内部串行,虽然我做了策略,分派处理内容的时候,将超大的专辑独立出来。一个线程处理几百个小专辑,但是大专辑只处理两三个。但是一个专辑就要十几分钟。但是专辑的分为多个区域,多种语言的,每种都要独立成一条数据,全量文件专辑我定义了共440个线程,每个线程独立压缩生成一个文件,增量时发消息也是扔到MQ里不用管。这些不需要通信的地方完全可以异步处理。异步又涉及到总是新建线程的堆回收问题。所以我将这些线程类都放到了对象池里进行管理。但是全量的时候的堆占用还是很大很大的,Full GC也很频繁。空间换时间嘛,所以JVM参数配的看起来很夸张,但真不是浪费。专辑的数据量是十万级,视频的数据量是千万级。原来的离线推送系统只发送ID给搜索那边,跑全量也要4个小时。所以之前是一周跑一次全量。我做的新系统,全量生成的专辑共15个G,视频占31个G。专辑和视频跑完全量一台用20多分钟,另一台长一些(因为另一台的数据库的机器不是同一运行商,时间开销在网路上),现在我们是一天一个全量。

-Xss这个参数的最终设置,我当时是整晚没睡觉测试的。因为这个参数是每个线程的堆栈大小。是方法执行的内存区,每个方法执行时会在虚拟机栈中创建栈帧。设置的小,跑起来会慢,设置的大,跑起来快,CPU计算速度就上去了。这里面还涉及到了虚拟机的逃逸分析,可能引起CPU跑满。说到这里我是不是还得说说虚拟机栈帧的结构啊。

栈帧(Stack Frame)结构

栈帧是用于支持虚拟机进行方法执行的数据结构,是属性运行时数据区的虚拟机站的栈元素。栈帧包括:

1>局部变量表(locals大小,编译期确定),一组变量存储空间,容量以slot为最小单位。

2>操作栈(stack大小,编译期确定),操作栈元素的数据类型必须与字节码指令序列严格匹配。

3>动态链接,指向运行时常量池中该栈帧所属方法的引用,为了动态连接使用。

前面是静态解析

对于运行期转化为直接引用,是动态解析

4>方法返回地址。

正常退出:执行引擎遇到方法返回的字节码,将返回值传递给调用者

异常退出:遇到Exception没被捕获时没有返回值

5>额外附加信息:由具体虚拟机实现。

说到这里我是不是还应该画一张java的内存模型啊。大体是这个样子的:

在这个地方想起来一个习惯,就是我用的集成开发环境是Eclipse,喜欢用它因为它是纯java写的。而且我经常把它搞死。每次把它弄死了我都会很认真的去分析它死掉的原因。对深入了解jvm很有帮助。

有必要贴一下垃圾收集日志。这是线上比较老的GC日志。因为我已经把打印gc日志这个选项关闭很久了。大家可能注意到了我的新生代设置的特别大,37g。这不仅仅是因为测试时服务器挂过。而是我说了,处理的数据对象特别大,这些对象都是朝生暮死的。如果新生代设置的不够大,这些大对象就会直接进入老年代,大大降低了垃圾回收的效率。大家也可以看出来,对新生代的垃圾回收是相当有成效的,99%都被回收了。

这里介绍一下数据结构中的栈和堆与内存分配中的栈和堆:

数据结构中的栈是一种后进先出性质的数据结构,像一个桶。取数据不能像数组那样想取哪个取哪个。必须先把想取的数据之后进来的数据全pop出去。

数据结构中的堆通常指二叉堆。分为最大堆和最小堆(我还用这个数据结构实现一种加密机制获得了专利)。它的存取就要比栈灵活。

如果是C++出身的程序员对于内存分配的栈和堆理解就完全不是问题。因为java就是c++写的。内存中的栈区处理相对较高的地址以地址,不断的分配,分配的地址增大。栈地址是相反的。所以在c++语言中和jvm中,栈都是系统自动分配空间的,速度快。而堆是需要申请的,我记得是malloc函数。栈上的数据的生存周期是在函数的运行过程中,运行后就释放掉,不可以再访问。堆上的数据只要程序员不释放空间,就一直可以访问到。这就是为什么java栈是线程隔离的,而堆是线程共享的。

java离线数据处理_JVM知识在离线数据中的运用相关推荐

  1. java实现小顶堆 在指定数据中找出前n大的数

    小顶堆: 我们利用的特性:每个节点都比左右孩子小 图示: 取数组前n个数,构成小顶堆 然后从数组里面获取数据,如果比堆顶小,直接抛弃,如果比堆顶大,就替换堆顶,并调整堆,使堆始终满足小顶堆的特性 93 ...

  2. java离线数据处理_DATAX 异构数据源离线同步工具

    解压gz包 运行解压命令,我这里解压到home目录 tar -zxvf ./datax.tar.gz linux解压以后目录有 bin conf job lib log log_perf plugin ...

  3. 关于域用户的离线缓存登录知识分享

    关于域用户的离线缓存登录知识分享 微软设计缓存登录的目的? 缓存登录主要是为了解决当公司域控制器发生故障联系不上DC或用户拿笔记本电脑回家不拔×××的情况下,依然能够登录到系统,进行办公.如果用户登录 ...

  4. 离线数据处理与流数据处理的区别

    离线数据处理--批处理 串行计算 流数据处理--流水线 并行计算 如图所示,离线数据处理采用的是串行计算,流数据处理采用的是并行计算的方式,相比之下,流数据处理的时效性更好. 更多分布式计算入门课程: ...

  5. java indexeddb_IndexedDB 打造靠谱 Web 离线数据库

    在知乎和我在平常工作中,常常会看到一个问题: 前端现在还火吗? 这个我只想说: 隔岸观火的人永远无法明白起火的原因,只有置身风暴,才能找到风眼之所在 --『秦时明月』 你 TM 看都不看前端现在的发展 ...

  6. 从数据中进行学习-基础知识

    1. 大数据 大数据是一种理念.一种解决问题的方法和一系列技术的集合.他与传统BI一样,都是从数据中挖掘有价值的信息,以满足商业目标:但它的独特之处在于:分布式.并行化. 优秀的数据科学家需要具备的素 ...

  7. 资料搜集-JAVA系统的梳理知识

    <!-- TOC -->- [Java](#java)- [基础](#基础)- [并发](#并发)- [JVM](#jvm)- [Java8 新特性](#java8-新特性)- [代码优化 ...

  8. 4 万字超强总结!Java 这些必备基础知识不可少

    点击「关注」公众号,回复"1024"获取2TB学习资源! 什么是Java Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概 ...

  9. C_一文读懂推荐系统知识体系(数据派THU 李中杰)

    1. 推荐系统的3个W 1.1 是什么(What is it?) 推荐系统就是根据用户的历史行为.社交关系.兴趣点.所处上下文环境等信息去判断用户当前需要或感兴趣的物品/服务的一类应用. 1.2 为什 ...

最新文章

  1. xpdf将pdf转换为html,(WordExcelPDF文件转换成HTML整理.docx
  2. python中index函数_python中index函数的用法
  3. VisualVM安装使用详解
  4. 苏宁大数据怎么运营_苏宁易购的经营模式
  5. PHP 错误与异常 笔记与总结(6)将错误日志保存在系统日志中
  6. UNIX 环境高级编程(一) apue.h 文件与apue.3e的安装
  7. Android-LayoutInflater布局文件解析过程分析
  8. 中国各省会城市经纬度位置
  9. 易语言夜神模拟器操控模块调用方法
  10. IDEA 2020 配置Emmylua插件仍无法调试Lua代码问题
  11. SIPP对接fs压力测试
  12. red5 1.0.7 集成tomcat 并且 进行整合 官方例子oflaDemo
  13. 操作系统第2章作业题答案
  14. Mybatis如果存在该条数据则修改,否则新增
  15. Android 自定义二维码
  16. 35岁前要培养的66种思维(上)
  17. sklearn的分层抽样
  18. android nfc开发 简书,Android-NFC基础
  19. Java验证对象的属性值是否都为空
  20. 中兴ZXHN F412/F460/F660等破解超级密码、破解用户限制、关闭远程控制、恢复路由器拨号

热门文章

  1. implements接口运用方法
  2. Django基于大数据的应届生求职系统
  3. 查询mysql的服务名_数据库名实例名服务名
  4. linux做子域dns,Linux下的DNS服务器配置实践(三)-子域授权、转发、视图
  5. python 抢课脚本_CC~NU抢课脚本
  6. matlabI 配置成vsCODE风格的暗色主题
  7. erase怎么用c语言,C++ erase()函数使用时的注意点
  8. 147859-97-0|pGlu-HWSHDWKPG-NH2
  9. C语言课程设计-学籍管理系统
  10. 玛塔机器人函数_玛塔学员世界机器人大赛首秀:能编写超50道指令,创意海洋保护方案超惊艳!...