架构师之路--从原理角度来分析性能

时间:2022-03-11 19:39:49

  埃及艳后Cleopatra,很小的时候看过妈妈买的一本书里把她的名字翻译成克娄巴特拉,里面有很多描写她美貌的场景描写。然而这个以美貌著称的奇女子,我看到书里,凯撒和安东尼真正倾心的是Cleopatra背后的埃及文明及Cleopatra的智慧。罗马是个好战的国家,人民没有很多的精力去创造各种文明和手工艺品。而Cleapatra在这些大佬面前的出场,总结两个字:“华丽”。这种华丽会让罗马这些篡位的暴发户首领眼前一亮。在柏林,有全世界最好的艳后肖像。她的头发结的是个简单的发髻,风格朴实,鼻子是稍有点长的鹰钩鼻,嘴也算不上性感,没有耳环,没有项链。并非一个性感尤物的相貌。我可以理解。可以理解她坐在金碧辉煌的豪华大船的*,穿着绚丽,体态骄傲而高贵,旁边是面貌平常的修女来反衬她的美,那是政治。而留给后人的肖像,作为一个女孩子更想让人记住的,是更内在本质的东西。古代资料记载,她聪明,诙谐,精通多种语言,喜爱学习和阅读,还有惊人的毅力。后人评价说:“如果Cleopatra的鼻子再塌一点,世界的面貌将会改变。” 我想,其实智慧才是她最可贵的资产。

 

  本文首发于静儿1986的博客,原文地址是http://www.cnblogs.com/xiexj/p/6874654.html

  部门开会讨论方案。经常有一个很可爱的现象:“方案讲解过程中,会被其他人批的体无完肤,但是最后该做的还是会做。”事情就是这样,批判只是为了提醒实施过程该注意的问题,可能会有性能问题,一致性问题,并发问题,可能需要怎样解决。但是提意见的人往往没有决定权,因为有个真理叫做:“你试过吗?”。然而这种讨论会要先参加,提出自己的意见,然后看着过程的实施,检验自己的想法,是很有利于提高的。没有提意见的理论基础,没有意见可提,最终开会都不会让你来参加的话,可能工作很多年也只是会做项目而已。不过就我自己而言,现在的问题是一切从技术角度出发,应该多从业务和数据分析的角度整体,大局的重新审视一些目前的工作。终于有借口明天找我家微微一笑很倾城的男神老大聊聊天了。

  提到性能,先看看存储数据的六个区域:

  1>寄存器:这是最快的存储设备,因为它实际上在处理器内部,就是平时说的CPU。在Java内存模型中,所谓的工作内存就是将主内存的数据拷贝一些到寄存器中来提高计算速度。

  2>栈:这个存在于随机存取存储器区。其硬件基础是内存条。记得我以前在人人的时候,有时候台式机开不了机了,我有快捷解决方案:“向主机箱踢两脚。”真的好使哦,因为开不了机是因为内存条松了。后来踢也不好使了,我就把机箱盖儿打开手动把内存条紧了紧。好了,通过这个例子大家应该明白了,如果没有内存条,是开不了机的。这个速度仅次于寄存器的设备通过寄存器中的栈指针与寄存器直接交互。其实一段程序的所有元素的生命周期都存于栈中,包括对象的引用。

  3>堆:通常说的内存池主要是指这部分,主要存储Java对象。不同于Java栈,编译器不需要知道堆中的东西要存储多长时间,所以有它的灵活性。这种动态分配导致其分配和回收都需要比栈更长的时间。

  4>直接内存:直接内存并不是虚拟机内存的一部分,jdk1.4中引入NIO,引入了通道与缓冲区的IO方式,它可以调用Native方法直接分配堆外内存,这个堆外内存就是本机内存,不会影响到堆内存的大小。

  5>只读存储器:安卓手机都用这个东西来存放应用。因为应用一经安装,就不再改变。像我这种做服务器端开发的,这个不详细介绍。

  6>磁盘:Java是在C++上开发的,但是有更多限制。不能像C++一样控制堆的分配,自己在栈中给对象分配空间,更不能建议编辑器给寄存器分配空间。但是Java对磁盘的存取却是用程序直接控制的。Java可以让对象持久化,同时这些对象也可以恢复成一个普通的随机存储储存器中的对象。Java提供了轻量级持久化的支持,而JDBC和Hibernate在数据库中提供了更为精细的存储支持。

  7>其他机器:Java有一种叫流对象,是将对象转换为比特流来传输到其他设备。和持久化对象一样,流对象也可以恢复成普通对象。

  大家知道基本的数据类型在方法内执行的时候都是直接值拷贝到栈当中。当然它也可以包装成非基本类型存到堆中。方法调用时像其他对象一样只取它的引用。自动拆装包嘛。其中数字的类型都是带符号的。Java提供两种高精度的数值类型,BigInteger和BigDecimal,它们没有对应的基本数据类型。计算都要调用对象的方法,而不能直接使用运算符。当然这个要慢,就是所谓的用速度换精准度。我之前创业的生鲜网项目(已经创业失败了)因为涉及很多钱的东西,大量用到这种数据类型。说到数据类型,大家都知道成员变量都会有一个默认值,而局部变量没有。其实只要知道JVM原理就能明白:成员变量都需要在方法区中为其预先分配空间。而局部变量只是在栈中用到,所以没有默认值。

  说到方法区,Hotspot基本是用持久代来实现方法区,当然jdk1.8之后改成metaspace元空间了。静态类的成员变量和方法都是存在方法区中,而方法区是线程共享区域,所以只有一个。而普通java类是在堆中分配内存,分配是在调用new的时候完成的,一个new一个存储空间。

  上周六原同事微信我,想让我给他们公司做顾问,做一下团队管理方面的建议和指导。我说那就不仅仅是团队管理的问题,还涉及到团队建设,业务选型,架构总体设计等诸多方面,暂定下周先去他们公司做一次访谈。

  

先介绍一下原同事的公司:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
车到加油高薪急招 中高级JAVA、中级.NET、PM、高级数据分析等职位
 
公司简介
车到( http: //www.51autogo.com/ )专注于为油企提供加油站综合运营解决方案,其他核心团队具有深厚成品油行业经验,分别来自壳牌、BP、百度、腾讯、销售易等跨国油企和互联网公司。核心优势是同时拥有国内最大的线上营销、线下运营一体化运营网络。
通过轻资产模式,车到快速建立了全国加油站服务网络,通过为加油站提供品牌、系统、运营等多种服务,可帮助其快速提升销量和利润,短短几年内在行业内获得了领先地位。目前已与壳牌、延长、海油、中化道达尔等多家大型油企、数百家民营油企建立了深度合作关系。2016年合作油站近千座、流水金额超过36亿。
 
高级JAVA
岗位职责:
1、  参与公司项目的开发,配合需求方和团队完成项目的代码开发以及相关文档编写
2、  承担核心功能代码编写,重点项目的系统架构设计以及开发;
3、  深入理解业务需求,分析和发现系统的瓶颈,推动产品性能和架构优化;
4、  技术文档的编写;
5、  有能力对平台框架的性能进行优化/功能升级;
6、  新人指导、培训以及Code Review,主导技术难题攻关,提升团队整体技术水平;
 
任职要求:
1、  全日制本科、硕士及以上学历,985/211院校计算机相关专业毕业,英语读写良好;
2、  3年及以上实际Java后端研发经验,1年以上互联网系统架构设计经验;
3、  熟练掌握java及面向对象设计开发,对部分java技术有深入研究,研究过优秀开源软件的源码并有心得者优先;
4、  有较强的逻辑思维能力,善于分析、归纳、解决问题, 能够独立或带队进行项目开发;
5、  对主流框架有深入理解(如Spring MVC,Spring,MyBatis等)并且熟练使用;
6、  对MQ、RPC、缓存有较为深入研究,理解IO、多线程等基础框架,对JVM的原理有一定的了解;
7、  熟悉Mysql数据库和优化方案、主流应用服务器tomcat,jetty等 配置与部署。
8、  了解linux基本命令使用。
 
高级数据分析
岗位描述:
1、对于各类营销活动的执行、活动效果进行数据追踪、用户行为分析;
2、专项就流失用户唤醒、用户差异化营销等项目进行数据统计和分析;
3、能够深入了解研究相关的数据问题和痛点,通过商业分析为研究报告的运营决策、数据产品方向提供数据支持;
4、通过数据报告、产品和建模成果改进数据产品,推动数据驱动研究的实践和发展。
5、对公司销售运营数据进行分析汇总,为公司运营提供数据支持,能够与运营和产品团队深入沟通,并向产品团队提出有效需求;针对研究的新问题、新方向提出数据分析解决方案并对油站营销方案提供有效建议;
 
岗位要求
1、4年以上相关工作经历,统计、数学、计算机软件、数量经济或其他相关国家统招重点院校本科及以上学历;
2、了解Hadoop、SPSS等数据平台技术,对企业数据架构有清晰的思路,对数据中间层设计、搭建及维护有一定的经验;
3、熟练运用office、SQL,掌握R語言,能高效的与技术和产品团队进行沟通;
4、良好的研究嗅觉,有良好的数据分析、挖掘和建模的经验;

  这就是我对他们公司的所有了解,源于他总是找我给他公司招人。我现在对于他们究竟要做什么线上产品,最终要达到什么效果,人员情况都不了解。下周见他们老总之前要做充分的准备。