Java后端开发三年,你必须要了解JVM

发布者:上海IT外包来源:http://www.lanmon.net点击数:1360

JAVA程序员,三年是一个障碍,如果你三年后没有研究过JVM,那么你的程序员只能是一个砖头砖工具。 JVM的分析是否良好?
JVM是Java虚拟机的首字母缩写,它指的是JVM虚拟机,它属于虚拟计算机,模拟我们实际计算机上各种计算机的功能。
由于JVM的存在,JAVA不再需要关心何时释放内存,也不会像C ++程序员那样只需要一点内存。就是你,JVM虚拟机将帮助你完成这些事情。现在,我们来谈谈JAVA的JVM吧!
我们来看看JVM模型。在我们查看百度文档之前,我们说了几个方法区域,堆栈,堆栈和计数器。不,这很难接受,所以我读了一本深深理解JVM的书,它有点经验。
正如对JVM手册的深入理解所述,JVM运行时的数据区域分为几个不同的区域,包括方法区域,VM堆栈和本机方法堆栈。堆,程序计数器寄存器,下面是书中的图片:
Java后端开发三年,你必须要了解JVM
我们一个一个地解释:首先,程序计数器寄存器:程序计数器实际上用于存储下一条指令的地址。当我们执行指令时,我们必须首先知道它存储的指令的位置。将指令带到寄存器是获取指令,然后程序计数器中的存储器地址将递增1,然后执行子循环,程序计数器的小存储区是“线程 - 私人记忆“。
为什么是私人的?在对JVM书籍的深入理解中,据说通过线程的旋转来切换虚拟机的多线程以切换所分配的处理器的执行时间。也就是说,处理器在同一时刻只执行线程指令,但时间可能不平衡。也许第一分钟在一个线程中,第二分钟是执行b线程。但是,为了确保切换回来需要是一致的,那么每个线程中都会有一个单独的程序计数器,单独存储,以确保不会产生任何影响。所以他是一个“线程私人记忆”。程序计数器有几个功能:
如果线程正在执行Java方法,则此计数器记录正在执行的虚拟机字节码指令地址。
如果正在执行Native方法,则此计数器值为空(未定义)。
此内存区域是唯一未在Java虚拟机规范中指定任何OutOfMemoryError条件的区域。
分别解释这三个句子。这是对java虚拟机中原始单词的深入理解。第一句似乎非常简单。不,让我们说第二句话。
因为这个计数器记录了字节码指令地址,但是Native(本地方法);例如,由C实现的(System.currentTimeMillis())可以直接通过系统直接调用,而无需编译。如果执行字节码指令,则它等同于程序计数器。如果没有记录,那么他的计数器的值肯定是空的。
第三句,我们可以尝试编译一小段代码,然后反编译看看
Java后端开发三年,你必须要了解JVM
也就是说,实际上就是这样
公共类Test {public int test(){int a=10; //0 .. int b=20; //3 .. int c=30; //6 ..返回(a + b)* c; //11 . 13 . 14 .执行加法,减法,乘法和除法}}
上面的0,2,3,5,6,8 .是指令的偏移地址。 Bipush是推送指令。执行测试方法时,线程将创建相应的程序计数器并将0置于计数器中。2,3,5,6,8 ..这些指令地址,所以计数器不会改变内存的大小,也不会溢出。
我们再来谈谈它:JAVA虚拟机堆栈(VM Stack)
线程私有,生命周期和线程,这个虚拟机堆栈描述了由JAVA方法执行的内存模型,用于存储局部变量,操作数堆栈,方法导出等信息,上面的bipush是堆栈指令,这里最需要的是什么注意到他存储的数据。局部变量包含我们知道的基本数据类型,对象引用是一个地址。
在虚拟机规范中,他还说他的两个异常情况:
一个是StackOverflowError异常,堆栈内存溢出,这当然很容易理解,也就是说,堆栈的内存不够,你的请求线程太大了。 (固定长度堆栈)如果在动态扩展过程中应用程序的长度不够,则会抛出另一个异常OutOfMemoryError。
本机方法堆栈:
它类似于虚拟机堆栈。不同之处在于虚拟机堆栈执行JAVA方法,但本地方法堆栈是Native方法。其他例外是相同的。
JAVA堆(堆)在JVM书中也提到过,Heap是JAVA虚拟机中占用最多的内存,也是所有线程共享的内存区域。堆内存主要用于存储对象实例。
几乎所有的对象实例都在这里分配内存,JAVA堆是垃圾收集器管理的主要区域,所以现在重点是,在访谈中最常被问及的垃圾收集机制将被仔细讨论。
内存回收,现在是一代算法,堆也是,新一代,老一代,两个垃圾收集机制都使用不同的回收机制,在新一代,每次垃圾回收都发现大量的对象死掉,只有少量的生存,然后使用复制算法,你只需要支付少量的幸存对象复制成本来完成收集。
在过去,由于对象具有较高的存活率并且没有额外的空间来分发它,因此必须使用“mark-clean”或“tag-compress”算法进行恢复。回收机制首先查看堆的堆(来自And的不是绝对的。查看对象的位置。在GC的数量不同之后,然后from和to将相应地改变。
Java后端开发三年,你必须要了解JVM
分区一目了然。我们来研究算法的实现。
Minor GC:GC新一代,
完整的GC:老年人GC,
由于新一代物体的存活率相对较低,因此通常采用复制算法。老年人的存活率通常很高,通常使用“标记清洁”或“标记 - 完成”算法进行恢复。
我看了几天才明白我的意思,让我谈谈自己的看法,或画一幅画。
次要GC:
每次我们新的对象,我们将首先把它放在新一代的Enden区域,这是第一个。
Java后端开发三年,你必须要了解JVM
然后当Enden耗尽时,它将出现在回收中
Java后端开发三年,你必须要了解JVM
然后将幸存物体的副本送到Survior1(来自),等待回收再循环给他。
Java后端开发三年,你必须要了解JVM
然后清空Enden区域并回收它。Java后端开发三年,你必须要了解JVM
在这种情况下,GC首次完成,然后下降。
当Enden已满时,它将再次成为GC。
首先是这个
Java后端开发三年,你必须要了解JVM
然后将Enden和Survoir1的内容复制到Survior中。
Java后端开发三年,你必须要了解JVM
然后Enden和Survior将被回收
Java后端开发三年,你必须要了解JVM
那么来自Enden的过去相当于少数次,而Survior1的过去相当于移动了2次。
Java后端开发三年,你必须要了解JVM
新一代GC已经执行了两次。
再次使用Enden时,它将从Survior2复制到Survior1。
Java后端开发三年,你必须要了解JVM
恢复后,Surire1改变,1个对象直接从Enden复制,2个对象是Enden  - >
Survior2  - >
Survior1,3个物件来自Enden  - >
Surivior1  - >
Survior2  - >
将Survior1复制过来,这样一步一步的实现就是新一代的GC。
在这种情况下,为什么还有老年?事实上,如果在执行GC时某些物体没有被回收,那么每次从Surior(从)到Surior(到)时,移动次数将无限期累积。这相当于添加另一个动作。当他达到一定次数(默认值为15)时,它将移动到旧年龄,因此没有不会被回收的对象,但可以设置此数字。
-XX: MaxTenuringThreshold
像这样
Java后端开发三年,你必须要了解JVM
事实上,这只是一种情况,如果对象太大而无法生存,它将直接进入老年。
还有一个默认,长期活着也将进入老年,
而且,这种拷贝算法的垃圾收集机制相对浪费内存。每次有一个空闲的内存区域都不起作用,但优点是显而易见,简单而有效。
以上是GC中垃圾收集中新一代复制算法的分析。新一代的Minor GC也可以了解很多东西。以上是一些个人意见。图片清晰易懂。如果有什么不对劲,我希望我能和你一起走。指点一下。
IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部