原创

jvm那些事 一

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xixihaha_123/article/details/84736415

jvm是虚拟机,也是一种规范。遵循着冯.诺依曼体系结构的设计原理。jvm是通过在操作系统上建立虚拟机,再有自己定义一套统一的数据结构和操作指令,再将统一的语言翻译给各大操作系统,进而实现跨平台。也就是说jvm是java的核心,也是java一次编译到处运行的本质所在。

一、组成和原理

从根本上来说,jvm只是一种规范,是一个虚拟机,虽然遵循着冯诺依曼的computer的设计原理,但是它却不是真实的实体计算机。那么它的构成也不是存储器、控制器、运算器、输入输出等设备。所以用合理的话说,jvm更像是运行在操作系统中的应用或者进程。那么它的组成也就是所谓的功能模块构成。现有比较流行的jvm:oracle jvm、hp jvm、ibm jvm等

java的开发人员都知道,jdk是java开发必备的,而jdk的构成中有一部分是jre,也就是java运行环境,而jvm则是jre中最核心的部分。



 那么从这个图片上可以看到jvm的重要性。同样在实际的项目应用中,性能优化、OOM处理最终处理方案都是基于此。像oracle的jvm 有两个不同实现:java hotspot client vm 和 java hotspot server vm ,区别在于前者减少启动的时间和内存占用;后者则提供更加优秀的程序运行速度。



 

接下来,来看看jvm的组成:Class Loader 、Runtime data area 、 execution engine、native interface。



 1、classloader 是负责加载class 文件的,class文件在文件开头有特定的文件标示,并且classloader只负责class文件的加载。至于运行则有execution engine决定

2、native interface 负责调用本地接口,也就是调用不同语言的接口供java使用。同时这些本地方法都会在native method stack 中有所记录,在调用该方法时,就可以通过execution engine 加载对应的本地lib。现在这些本地方法的接口调用基本采用socket通信和webservice等方式取代。

3、execution engine是执行引擎。主要是在class 文件加载完成后,会将指令和数据放入内存,那么关于这些内容的解释成操作系统所接受的内容,便有execution engine完成。

4、runtime data area 则是存放数据的,主要由:stack、 heap、method area 、pc register、native method stack 。也就是关于java的内存都集中在此。

 关于java runtime data areas:  


 上图只是jvm中关于runtime data areas 的划分,可能不同的jvm实现最终这些内容和上图是有出入。
 

我们还是使用该图进行粗略描述

1、stack是java的栈内存,等同于c的栈。注意栈的内存是不连续的,因为每一个线程都有自己的栈。栈里则存放stack frame。stackframe包括:局部变量、执行环境、操作数栈。局部变量:存放某一个类中的所用到的局部变量;执行环境:保存解析java字节码过程中所需要的信息(上次调用方法、局部变量指针、操作数栈的栈顶和栈低指针);操作数栈:用于存储运算所需的操作数和结果。一般来说,stackframe只在方法被调用时创建;在某一个线程,某一个时间点,只有一个框架是活动的,即为current frame,方法则为current method 。局部变量和操作数栈上的操作总是引用当前框架。当stackframe中方法执行完成或者调用其他stackframe中的方法时,则当前的栈变为另一个stackframe。stack大小一般分为动态和静态两种,动态按照线程需要分配;(具体看查:http://www.programering.com/a/MzM3QzNwATA.html 和 java虚拟机框架)

待续。。。。。。

展开阅读全文

工作一年半那些

02-03

年末了,总会发现一些事情没有做,一些事情做得不够好,一些事情似乎没有必要去做。大约又是发现长了一岁,所以很多事情一考虑,就很头大。失眠啦,烦躁啦,什么的,哎。rnrn工作一年半,之前担心的事情,也渐渐清晰了,之前的价值观,现在也在渐渐改变,再固执的我,现在也发现年轻时候做了一些错事。现在回过头去看大学的那班孩子,总想说:瞧!那群SB。其实骂不是他们,而是骂的自己的过去。rnrn现在手头上的这份工作是大学期间找的第四份工作。由于挂科太多,技术底气不足(现在发现,只是我之前接触的高手太高),面的都是中小型企业。四份工作,一份外包不考虑,一份被刷,后来考虑呆在广州,这确定了现时这份工作。这家公司其实挺好,加班不多,一年时间,或许半年是在自我修行,纪律问题也很好说话,可惜氛围太差,不够聪明的人太多了。我对自己的定位是:我还是比较合适当凤尾,不合适当鸡头的人。9年义务教育,3年高中,4年大学,一路靠着自己的小聪明,和啃老的心态走了过来,发现自己在聪明人里,才会看到自己的差距,在一堆不怎么聪明的人里,总会得意忘了形。最近总想说,一念嗔心起,百万障门开,其实自我提醒就是这个。说到这个,我总想对高中一个同学说对不起,那会儿我骂他书呆子,他其实是个极其聪明的人,我嫉妒他了,现在只能望其项背了。顺带提一句,不知道现时持读书无用论的人还多不多,除去做生意或者拼爹的那些少数成功例子,其实你会发现,高等学府的人,无论如何,活得是比我这们这些二流大学出来的要好,至少在我的圈子是这样,一个氛围确实很重要,可是其实大家都打DOTA,是不是?rnrn其实,现在年纪越来越大,就越担心氛围对自己造成的影响,毕竟已经到了一个很容易形成定性思维的年纪了,除了想问题越来越绝对,发散思维也越来越差,记忆力也在衰减,回忆儿时的梦想,就会觉得越来越恐惧。哪一天,我要是没看代码就对着另外一名程序员说,你这样做不对。我觉得我就无法在技术这条道路上走下去了。现在的工作氛围就是我担心的事情,每每我判断一个人蠢不蠢,我总会用这样一个例子,那就是讨论int是多少字节的问题,虽然极少数人会讨论,或者讨论的人会就机器字数来讨论这个设计问题,但这就不是蠢问题了,蠢问题是他为什么不用sizeof(int)去验证,而要花一上午的时间来做这个无价值的事情。类似的事情很多,我就处在这个氛围之下,或多或少会被带进去。rnrn在这家公司里,我还是很佩服我的主管,他是个聪明人,教给我很多事情,例如从写学习型代码,转向写生产型代码。他虽然对各种技术不发烧,这限制了他的眼界,但是他考虑事情确实很周到,也很长远。如果他不一次又一次地将我的方案推倒,而是采用验证的思想证明我的方案是错误的,还有把我晾在项目外闲着,我其实挺喜欢这个人。这次年终总评,我发现我还是不错的,我不知道是不是其它人太差了,还是他其实还是欣赏我这个人的。当然,我也明白,他希望他手下的人能扎实完成工作,而不是提些有的没的。总之,我觉得他老了吧,大约。与之同时,一两个老兵,也教会了我代码设计上的一些东西,我也很感谢他们。rnrn除了氛围,一个就是远见的问题。我们这些当兵的混社会的,都希望跟着老大吃香喝辣,弟兄们把生命都交给你了,唯一的希望是你能负责。这也是我对公司的唯一要求。技术人的生命很短暂,过不了混饭的日子。我不知道公司到底有没有为我们员工设定了一个发展曲线,所以每当我一闲下来就很害怕。一闲下来,我就会拼命学习一些乱七八糟的东西,希望能跳出坑里,但我也明白营养不大。我背后有一个家庭,还有一堆琐碎的事,一些不通情达理的人,还有自己也不争气,我也知道自己在迂回战斗着,跑了很久,结果在原地打转。我渴望懂得更多东西,让自己变得更有价值,这是现在唯一能欺骗我还年轻着的借口了吧。rnrn所以,我十天半个月,就会想着离职,找工作,我太不专心了,但我觉得不只是我的问题。rnrn最近在看Joel在写的一本叫《软件随想录》的东西,虽然我觉得我在他面前充其量就一个SB吧,哈哈,但我还是觉得他说的一些东西很对。程序员应该学会写作,还有微观经济学,这才能让别人看到自己,而不是写着一堆优秀代码,然后让它们死在github或者sourceforge上。rnrn所以我考虑维护一下自己的博客:http://blog.csdn.net/gyj0754rnrn近期考虑把linux内核、linux驱动编程、android源代码分析和android编程的一些读书笔记共享一下。虽然这些内容或许网络上已经有人整理了,但出于训练、记忆强化和语言功底的磨练吧。写出来到底还是希望有人点评,毕竟只是一些未投入生产化的知识。rnrnrn不欢迎广告,讨论int,骂人,还有一开口就说不可能的人^_^ 论坛

没有更多推荐了,返回首页

博客模板©2019 由CSDN提供 模版主题为:skin3-template by CSDN官方博客 设计