标签:caff 标记 清除 检查 做了 创建 引用 运行时 时间
前一段时间总结了spring和springmvc相关的知识,面试中常问到的除了这些基本的框架之外,还有底层的基础知识,比如与java虚拟机相关的知识点,这一部分也是面试中经常问到的,在面试中高级java工程师的时候,这一部分是很重要的一个点,倘若一个程序员在这一块没有了解或者看过学习过相关的知识,那么他的基础就是相对薄弱的,面试成功的可能性也会降低很多.
这篇文章会把java的整体运行结构和jvm的关系做个梳理,但是不再用大篇幅的文字叙述的内容,这样不容易记忆,而且容易产生厌看的情绪.所以我决定使用采用绘图+少部分文字描述为主.
Java虚拟机(英语:Java Virtual Machine,缩写为JVM),一种能够运行Java bytecode的虚拟机,以堆栈结构机器来进行实做。最早由太阳微系统所研发并实现第一个实现版本,是Java平台的一部分,能够运行以Java语言写作的软件程序Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码-字节码,就可以在多种平台上不加修改地运行。通过对中央处理器CPU所执行的软件实现,实现能执行编译过的Java程序码与应用程序)。
作为一种编程语言的虚拟机,实际上不只是专用于Java语言,只要生成的编译文件匹配JVM对加载编译文件格式要求,任何语言都可以由JVM编译运行。此外,除了甲骨文,也有其他开源或闭源的实现。--摘自维基百科
上图能够清晰的展示我们从新编译一个java类到jvm中执行的全部流程,对堆栈等地方的功能做一个解释:
在整个jvm运行时数据区,要对jvm进行优化,那么堆内存是重点优化对象.原因是栈本身所占的内存比率很小,而java中所有new对象全部放在堆内存区域.那么对这些对象的回收控制策略就非常重要.
上图展示了堆内存的内部结构,值得注意的是,在1.8之前和之后,java的永久代被取消,被元空间所代替(元空间就是电脑本省的物理内存),下面对各个区的作用做简单的解释:
年轻代:
存活区:minorGC存活的对象保存的区域,存活区有两块空间S0和S1,有一块始终为空,该区域保存对象向老年代晋升(停止-复制算法)
;
老年代:经历了数次GC之后还保留的对象,这些对象经历了多次GC仍然存活,但是也有可能在接下来的某一次被清除掉,同时要注意,假如是new一个很大的对象,那么是直接保存到老年代来,如果老年代空间不够了,会出现MajorGC(FullGC)进行老年代的清理,非常耗费性能(不建议使用system.gc()的原因
);
在发生MajorGC的时候,jvm会检查每次晋升入老年代的对象的大小是否大于老年代剩余空间的大小,若大于,直接触发一次FullGC,否则可以自定义是否允许担保失败(关键字设置:XX:+HandlePromotionFailure
)(标记-清理算法
);
元空间(永久代):jdk1.8之后,取消了永久代,变成了元空间,不再在堆内存里面保存类,字符串常量等,采用了元空间之后,不会再出现堆溢出的异常.
通过调整jvm的相关参数,可以优化堆内存,提高jvm的运行效率,下面对几个重要参数做一下总结:
-Xss:设置每一个线程所占用的栈的大小
在jdk1.7之后,正式发布了G1回收算法;
在此之前,GC算法的发展进程如下:
G1(并发)收集器
G1收集器(或者垃圾优先收集器)的设计初衷是为了尽量缩短处理超大堆(大于4GB)时产生的停顿。相对于CMS的优势而言是内存碎片的产生率大大降低。
以上就是GC算法发展史,具体的各个算法有什么不同,暂时还没有特别深入的研究和比较,后续会再开一篇补上.
这篇文章对java运行的流程和jvm的关系,以及jvm的内部结构,和jvm的堆内存优化,做了一个总结,但是GC算法是一个大头,一篇文章的篇幅实在是无法详述,后续再接再厉,争取把这一快吃透.
标签:caff 标记 清除 检查 做了 创建 引用 运行时 时间
原文地址:https://www.cnblogs.com/yunjiandubu/p/10324912.html