前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java虚拟机与虚拟机调优

java虚拟机与虚拟机调优

作者头像
用户1220053
发布2021-08-24 16:31:51
7690
发布2021-08-24 16:31:51
举报
文章被收录于专栏:DT乱“码”DT乱“码”

这是陈东景于2021年8月22日晚11点45分原创作品,转载请标明出处!!!!

在面试中经常会被面试官问到JVM的内存模型,GC回收机制和有没有做过JVM调优的问题。其实这种问题怎么说呢?你会不会,答得上来答不上来都不影响你进行实际项目开发的操作。面试官问这种问题,一方面表达他是搞技术的,一方面在考察应聘者是不是搞技术的,还有一个目的就是装 13 用,或者他什么都不懂,见人喜欢问这个问题,就随便问问看看你答得怎样。

为什么这么说。在实际开发中,你得到了一台计算机,不管是windows的还是linux的还是其他操作系统,你想开发java程序或者java项目,你首先必须安装JDK(java开发工具包,包含JRE)或者JRE(java运行环境,只提供java程序运行,不提供开发时的第三方引用)。那么JDK里是啥玩意呢?JDK,java开发工具包,干活总得有工具,就如搬砖砌墙需要砖,铲子,水泥。没有工具也是可以的,就是需要从0开始写代码,自己造工具,编写个编译和运行环境,最终能把你的程序转换成二进制的机器码就行。但是,我们之所以伟大和省心,是因为我们站在了巨人的肩膀上,所以我们就不需要造工具了,用就完了。因为JDK里包含JRE,这一贴重点讲讲JRE里的东西。就是本帖的标题java虚拟机。因为JRE里就包含了一个JVM,它是你JAVA程序运行的一个逻辑机器。可能还有很多初学者和年轻的工程师都不知道JVM在哪里。哈哈哈,但是一个不需要知道虚拟机在什么地方的coder,每天却可以乐此不疲的开发者无数的java程序,即使JVM报错,抛出各种异常,什么内存溢出,内存泄漏,找不到类等等,他们都能根据自己的直觉解决掉问题,使程序正常运行,可能还有大部分的初级者觉得是他那个eclipse或者IDE把程序运行起来的。所以我说JVM你会不会,答得上来答不上来都不影响你进行实际项目开发的操作。

记得我们开始学JAVA的时候,老师就跟你吹牛java多么多么牛逼,第一点:java是面向对象编程的,一切都是对象,偶尔还调侃一下在里面可以找到对象,或者自己就可以造很多对象。这种调侃真是要命!事实证明大多数的程序员只是停留在闷骚的级别,单身狗很多,哈哈哈。第二点:java是跨平台的,一次编译,到处运行。这两点几乎在课堂上或者培训机构听得耳朵都起茧。多年后,我研究发现老师说的第一点都不太对,只能说java是面向对象编程的,但并不是纯面向对象编程,也并不是一切都是对象(这里留个悬念以后讲),这一次重点讲第二点:java是跨平台的,一次编译,到处运行。所谓java是跨平台的,一次编译,到处运行。指的就是java程序在java虚拟机上编译为字节码文件(class文件),提交给JVM运行后,以后只要有JVM的地方,这一套编译后的代码,移植后都可以运行,不依赖于物理集操作系统的版本,指令集。这就是java的跨平台性。那JVM是个什么东西呢?以前一听到有个虚字的东西我就觉虚,就如当初学习软件工程这个专业的时候,老师跟我们说,软件是一种看不见,摸不着的东西。这真是要命!这真是比虚还虚!多年以后发现大多数的老师整天也是浑水摸鱼,照本宣科,完全不动脑子,自己可能都还是在云里雾里,就胡说八道的多。我现在感觉我和他们很像,每天也胡说八道,哈哈哈。

废话少说,那JVM是个什么东西呢?这个概念,我觉我们根据这三个字母从后面往前理解,会理解的比较透彻。M机器,指的是计算机,或者电脑,或者一个计算单元等等。机器应该理解是一个具有冯诺依曼体系结构物理计算器。V是虚拟的意思,就是虚构的,我不喜欢用虚构这个词,感觉像童话,让人感觉不存在,我们应该理解为它是通过逻辑实现的一套和物理计算器结构类似的逻辑计算器。VM就是虚拟机的意思,其中虚拟机它是依托物理机的,没有物理机,虚拟机就是一堆一文不值的死代码,所以VM是存在的,而且也是看的见得,并不是虚构的。J就是JAVA的意思,表明虚拟机的类型,因为虚拟机有很多,各种操作系统的都有,JVM就是专门为JAVA程序提供编译运行的一套逻辑计算机。

正如上面说的JVM是一套和物理计算器结构类似的逻辑计算器。那么物理机有的功能它应该大部分都有才读。没错!JVM里面就是通过逻辑算法上实现了cpu,寄存器,程序运算器,内存等这些功能,就如同它复制出了一份物理机的样板。只是这一套样板专门是为java定制的。这也是JAVA成功风靡世界二十年的重要基础。接下来我们讲一下JAVA虚拟机调优!

说到JVM调优,就需要理解JVM的内存模型,因为JVM就是一个逻辑上的计算机,所以它必须得有内存分配。没有内存的计算机我没见过,见过的也算是坏的。那么JVM的内存结构是怎样的,它又是怎样使用的呢?这里我只讲基础的,篇幅有限不做深入探讨。

JVM的最基本的两块内存模块,栈区和堆区,所谓栈区,从字面理解,就是规划的很好,使用的很明确,有条有理的内存空间,就如你的书架,一个一个格子,让你把书摆的整整齐齐。从这个栈字就可以让人这么想象,哈哈哈。那么堆区呢?啥玩意,就是随便扔,随便堆东西的内存空间,杂七杂八的就堆在这里,可大可小,可伸可缩,就如你的床,衣服你随便扔,书包你随便扔上去,你还可以躺上去。就这么理解吧,没错,爱咋滴!哈哈哈。

回归正传,在JVM内存中栈区是用来存储类名,对象的引用,静态变量,静态方法区的,它在java运行初始化就开始载入,所以一个java程序的规模实际上和java栈区使用的内存是成正比的,类越多,对象的引用也多,静态变量越多,静态方法和变量也多,对栈区的内存消耗越大。那么堆区是用来干嘛的呢。这就是java里支撑面向对象编程的重要内存空间,java里通过new一个对象的操作来新建一个对象,堆区就是用来存储这一块的内容,只有在new对象的时候才去开辟一片空间。所以java程序的业务规模是和java堆内存使用成正比的,业务规模越大,越复杂产生的new对象越多,需要的堆内存越多。JVM虚拟机里有个重要的模块叫GC,就是专门管理java堆内存的。因为堆内存在使用后如果没有管理回收重写使用,堆内存很快就会爆满,程序无法继续运行。所以这里又要讲到GC。JVM里的GC很好实现了C++里手工释放内存的过程。

那么GC是怎么回收内存空间的,怎么做才能让GC更好的回收内存,这里其实就是JVM的调优啦。根据对象的生命周期,一个对象从new,到被使用,再到无用,完成自己生命的过程都是需要使用堆内存的。那GC什么时候回收这无用的对象的内存呢?在对象的生命过程中,GC把对象定义为新生代,老年代,永久代。对象刚被创建,GC根据算法定义它为新生代,等待被使用,对象创建后被使用,停留较长时间没被再次使用或者一直都没被使用,被定义为老年代,对象被定义后频繁被使用,一直都在使用中,被定义为永久代。GC就是一直监控着新生代和永久代,回收着老年代,反反复复做这个过程。进行内存管理。那这个和JVM调优有什么关系呢?试想,如果我们的程序里大量的产生新对象,而且这种对象是无用的,比如声明很多不适用的对象和方法,是不是额外增加了对内存的消耗,又比如,程序代码里出现的死循环,是不是产生大量无法回收的永久代对象,还有,对象的使用周期,如果大量的对象都是频繁使用生命周期极短,又反复产生,GC是不是回收完了就又要马上分配内存,释放的内存很少,或者直接定义为永久代不回收,等等。JVM的优化其实需要反映在代码层面的优化和业务逻辑实现上的优化。百分之九十九的初级程序员和产品设计者几乎不会考虑这个问题。因为现在的物理机,虚拟机内存都足够大让他们随意玩。还有一个GC调优,是根据程序运行日志设置JVM的初始化内存大小,找到一个平衡,合理的使用内存,既不分配过大,也足够使用,这是为物理机节省内存空间,这里我都就不多说了,初级JVM优化水平。哈哈哈。

这一贴就写到这里。不喜勿喷,希望对你们有用。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档