做企业网站 asp的cms系统哪个好,外贸网站建设是做什么的,哪有培训seo,南京制作网页培训机构一、JVM体系结构#xff1a; 类装载器ClassLoader#xff1a;用来装载.class文件执行引擎#xff1a;执行字节码#xff0c;或者执行本地方法运行时数据区#xff1a;方法区、堆、Java栈、程序计数器、本地方法栈1、方法区#xff1a; 也称“永久代”#xff0c;“非堆”…一、JVM体系结构 类装载器ClassLoader用来装载.class文件执行引擎执行字节码或者执行本地方法运行时数据区方法区、堆、Java栈、程序计数器、本地方法栈1、方法区 也称“永久代”“非堆”用于储存虚拟机加载的类信息常量静态变量是各个线程共享的内存区域。
运行时常量池方法区的一部分Class文件中除了有类的版本字段方法接口等描述信息外还有一项信息就是常量池用于存放编译器生成的各种符号引用这部分内容将在类加载后放到方法区的运行时常量池中。
2、虚拟机栈 描述的是java方法执行的内存模型每个方法被执行的时候都会创建一个“栈帧”用于存储局部变量包括参数操作栈方法出口等信息。每个方法被调用到执行完成的过程就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。生命周期与线程相同是线程私有的。
局部变量表存放八种基本类型对象引用其中64位长度的long和double类型的数据会占用两个局部变量的空间其余数据类型只占一个。局部变量表是在编译时完成分配的当进入一个方法时这个方法需要在栈帧中分配多大的局部变量是完全确定的在运行期间不再改变。
3、本地方法栈 与虚拟机栈基本类似为Native方法本地方法服务。
4、堆 也叫java堆GC堆。是JVM中所管理的内存中最大的一块内存区域是线程共享的在JVM启动时创建。存放了对象的实例及数组所有new的对象。
5、程序计数器 是最小的一块内存它的作用是当前线程所执行的字节码的行号指示器在虚拟机的模型里字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令分支循环异常处理线程恢复等基础功能都需要依赖计数器完成。
二、JVM执行程序的过程
1、加载.class文件
2、管理并分配内存
3、执行垃圾收集内存回收碎片整理
四、JVM的生命周期 JVM实例和JVM执行引擎实例
1JVM实例对应了一个独立运行的java程序——进程级别 一个运行时的Java虚拟机(JVM)负责运行一个Java程序。当启动一个Java程序时一个虚拟机实例诞生当程序关闭退出这个虚拟机实例也就随之消亡。如果在同一台计算机上同时运行多个Java程序将得到多个Java虚拟机实例每个Java程序都运行于它自己的Java虚拟机实例中。2JVM执行引擎实例则对应了属于运行程序的线程——线程级别
三、JVM调优
JVM内存调优
对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数。 过多的GC和Full GC是会占用很多的系统资源主要是CPU影响系统的吞吐量。 使用JDK提供的内存查看工具比如JConsole和Java VisualVM。
GC机制
GC的基本原理将内存中不再被使用的对象进行回收GC中用于回收的方法称为收集器由于GC需要消耗一些资源和时间Java在对对象的生命周期特征进行分析后按照新生代、旧生代的方式来对对象进行收集以尽可能的缩短GC对应用造成的暂停。
哪些内存需要回收
JVM的内存结构包括五大区域程序计数器、虚拟机栈、本地方法栈、堆区、方法区。其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生、随线程而灭因此这几个区域的内存分配和回收都具备确定性就不需要过多考虑回收的问题因为方法结束或者线程结束时内存自然就跟随着回收了。而Java堆区和方法区则不一样这部分内存的分配和回收是动态的正是垃圾收集器所需关注的部分。
无论引用计数算法还是可达性分析算法都是基于强引用而言的。
分代收集Generational Collection算法
分代收集算法是目前大部分JVM的垃圾收集器采用的算法。 它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代Tenured Generation和年轻代Young Generation在堆区之外还有一个代就是永久代Permanet Generation它用来存储class类、常量、方法描述等。对永久代的回收主要回收两部分内容废弃常量和无用的类。
老年代的特点是每次垃圾收集时只有少量对象需要被回收而年轻代的特点是每次垃圾回收时都有大量的对象需要被回收那么就可以根据不同代的特点采取最适合的收集算法。
在年轻代中jvm使用的是Mark-copy标记-复制算法
老年代Old Generation的回收算法老年代的特点是每次回收都只回收少量对象一般使用的是Mark-Compact标记-整理算法。
常用的垃圾回收算法
标记-清除Mark-Sweep算法
标记-清除算法分为两个阶段标记阶段和清除阶段。标记阶段的任务是标记出所有需要被回收的对象清除阶段就是回收被标记的对象所占用的空间。
主要缺点 一个是效率问题标记和清除过程的效率都不高。 另一个是空间问题标记清除之后会产生大量不连续的内存碎片空间碎片太多可能会导致当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前出发另一次垃圾收集动作。
复制Copying算法 为了解决Mark-Sweep算法的缺陷Copying算法就被提了出来。它将可用内存按容量划分为大小相等的两块每次只使用其中的一块。当这一块的内存用完了就将还存活着的对象复制到另外一块上面然后再把已使用的内存空间一次清理掉这样一来就不容易出现内存碎片的问题。
这种算法虽然实现简单运行高效且不容易产生内存碎片但是却对内存空间的使用做出了高昂的代价因为能够使用的内存缩减到原来的一半。
很显然Copying算法的效率跟存活对象的数目多少有很大的关系如果存活对象很多那么Copying算法的效率将会大大降低。
标记-整理Mark-Compact算法
为了解决Copying算法的缺陷充分利用内存空间提出了Mark-Compact算法。该算法标记阶段和Mark-Sweep一样但是在完成标记之后它不是直接清理可回收对象而是将存活对象都向一端移动然后清理掉端边界以外的内存。
分代收集Generational Collection算法
分代收集算法是目前大部分JVM的垃圾收集器采用的算法。
它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。
一般情况下将堆区划分为老年代Tenured Generation和年轻代Young Generation在堆区之外还有一个代就是永久代Permanet Generation它用来存储class类、常量、方法描述等。对永久代的回收主要回收两部分内容废弃常量和无用的类。
老年代的特点是每次垃圾收集时只有少量对象需要被回收而年轻代的特点是每次垃圾回收时都有大量的对象需要被回收那么就可以根据不同代的特点采取最适合的收集算法。
年轻代Young Generation的回收算法
在年轻代中jvm使用的是Mark-copy标记-复制算法
a所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。
b年轻代分三个区。一个Eden区两个 Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时还存活的对象将被复制到Survivor区两个中的一个当这个 Survivor区满时此区的存活对象将被复制到另外一个Survivor区当另外一个Survivor区也满了的时候从第一个Survivor区复制过来的并且此时还存活的对象将被复制到“年老区(Tenured)”。需要注意Survivor的两个区是对称的没先后关系所以同一个区中可能同时存在从Eden复制过来对象和从前一个Survivor复制过来的对象而复制到年老区的只有从第一个Survivor区过来的对象。而且Survivor区总有一个是空的。
c当survivor1区不足以存放 eden和survivor0的存活对象时就将存活对象直接存放到老年代。若是老年代也满了就会触发一次Full GC也就是新生代、老年代都进行回收。
d新生代发生的GC也叫做Minor GCMinorGC发生频率比较高(不一定等Eden区满了才触发)。
老年代Old Generation的回收算法
老年代的特点是每次回收都只回收少量对象一般使用的是Mark-Compact标记-整理算法。
a在年轻代中经历了N次垃圾回收后仍然存活的对象就会被放到年老代中。因此可以认为年老代中存放的都是一些生命周期较长的对象。
b内存比新生代也大很多(大概比例是1:2)当老年代内存满时触发Major GC或Full GCFull GC发生频率比较低老年代对象存活时间比较长存活率标记高。
永久代Permanent Generation的回收算法 永久代(permanent generation) 也称为“方法区(method area)”他存储class对象和字符串常量。所以这块内存区域绝对不是永久的存放从老年代存活下来的对象的。在这块内存中有可能发生垃圾回收。发生在这里垃圾回收也被称为major GC。
新生代和老年代 新生代短生存期的对象在老年代长生存期的对象存活了超过16次GC时间
几乎所有新生成的对象首先都是放在年轻代的
堆内存分配策略明确以下三点
1对象优先在Eden分配。
2大对象直接进入老年代。
3长期存活的对象将进入老年代。当连续分配对象时对象会逐渐从Eden到Survivor最后到老年代。
对垃圾回收机制说明以下三点
新生代GCMinor GC/Scavenge GC发生在新生代的垃圾收集动作。因为Java对象大多都具有朝生夕灭的特性因此Minor GC非常频繁(不一定等Eden区满了才触发)一般回收速度也比较快。在新生代中每次垃圾收集时都会发现有大量对象死去只有少量存活因此可选用复制算法来完成收集。
老年代GCMajor GC/Full GC发生在老年代的垃圾回收动作。Major GC经常会伴随至少一次Minor GC。由于老年代中的对象生命周期比较长因此Major GC并不频繁一般都是等待老年代满了后才进行Full GC而且其速度一般会比Minor GC慢10倍以上。另外如果分配了Direct Memory在老年代中进行Full GC时会顺便清理掉Direct Memory中的废弃对象。而老年代中因为对象存活率高、没有额外空间对它进行分配担保就必须使用标记—清除算法或标记—整理算法来进行回收。
老年代与新生代不同老年代对象存活的时间比较长、比较稳定因此采用标记(Mark)算法来进行回收所谓标记就是扫描出存活的对象然后再进行回收未被标记的对象回收后对用空出的空间要么进行合并、要么标记出来便于下次进行分配总之目的就是要减少内存碎片带来的效率损耗。