前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >架构师之路--从原理角度来分析性能

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

作者头像
静儿
发布2018-07-24 16:27:33
3560
发布2018-07-24 16:27:33
举报
文章被收录于专栏:编程一生

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-05-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档