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

  埃及艳后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一个存储空间。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序人生

如何愉快地写个小parser

(一) 在前几日的文章『软件随想录』里,我随性写了一句:「现在似乎已经不是lex/yacc 或 bison/flex的时代了。我亲眼看见一个同事在费力地用per...

62290
来自专栏阮一峰的网络日志

Javascript的10个设计缺陷

前几篇文章,我经常说Javascript的设计不够严谨,有很多失误。 今天的这一篇,前半部分就谈为什么会这样,后半部分将列举Javascript的10个设计缺陷...

37170
来自专栏HansBug's Lab

1740: [Usaco2005 mar]Yogurt factory 奶酪工厂

1740: [Usaco2005 mar]Yogurt factory 奶酪工厂 Time Limit: 5 Sec  Memory Limit: 64 MB ...

27250
来自专栏Java学习网

想成为优秀程序员必知的要点

想成为优秀程序员必知的要点 1.永远不要重复代码 不惜一切代价也要避免重复代码。如果你有几个不同的地方经常性地要使用某个代码片段,那么可以将它重构成函数。代码...

23470
来自专栏python3

python3--python的出生与应用

python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时间,决心...

19320
来自专栏恰童鞋骚年

【整理】待毕业.Net码农就业求职储备

声明:本文题目来源于互联网,仅供即将从学校毕业的.Net码农(当然,我本人也是菜逼一个)学习之用。当然,学习了这些题目不一定会拿到offer,但是针对就业求职做...

21830
来自专栏函数式编程语言及工具

细谈Slick(5)- 学习体会和将来实际应用的一些想法

   通过一段时间的学习和了解以及前面几篇关于Slick的讨论后对Slick这个函数式数据库编程工具有了些具体的了解。回顾我学习Slick的目的,产生了许多想法...

21480
来自专栏智能大石头

在递归函数中因不正确使用公共变量而形成死循环

昨天碰到了挺郁闷的错误,我写的一个递归函数,形成了死循环。代码如下: '递归删除频道,参数:频道ID Sub DeleteBoard(bid)     '删除...

36850
来自专栏北京马哥教育

shell十三问,为linux学习打基础(三)

本文整理并转自CU上的帖子[学习共享] shell 十三問?,此贴是2003年发表的,但却是相当不错的linux基础知识汇集贴,原帖主使用的台湾风格,本文加以简...

39260
来自专栏web前端教室

javascript ES6 初次相见

JS的ES6网上也热炒了好久了, 我一直也没怎么太细看, 今天想起来就写个东西, 也为分享,也为学习。 我喜欢接地气一点,所以网上的那些新名词我就不写了, 就写...

19870

扫码关注云+社区

领取腾讯云代金券