jvm知识点
1、内存模型程序计数器、方法区、堆、栈,本地方法栈
程序计数器:较小内存空间、可以认为是当前线程所执行的字节码的行号指示器。(线程私有)
栈:虚拟机栈也是线程私有,生命周期和线程相同,虚拟机栈描述java方法执行的内存模型,线程在执行每个方法时都会同时创建一个栈帧,用来存储局部变量表、操作栈、动态链接、方法出口等信息。调用方法时执行入栈,方法返回时执行出栈。(线程私有)
堆:java堆被所有线程共享的内存区域,存放对象的实例,也是垃圾收集器管理的主要区域,java堆分为新生代和老生代。与存放的内容无关,都存放的是对象实例。(线程共享)
方法区:和堆类似,为线程共享区域,勇于存储被java虚拟机加载的类信息、常量、静态变量。及编译器编译后的代码等数据。(线程共享)
本地方法栈:与虚拟机栈类似,虚拟机栈为虚拟机执行java方法服务,本地方法栈使用到native方法(非java方法,其他语言编写)服务。(线程私有)
2、类加载机制
类的加载指的是将编译好的class类文件中的字节码读入到内存中,将其放在方法区内并创建对应的Class对象。
详见类加载机制。
3、GC垃圾回收
java堆内存被分代管理:年轻代、老年代、永久代。
年轻代:存放新创建的对象
老年代:存放从年轻代晋升而来的,存活时间较久的对象
永久代:保存类信息等内容
垃圾回收算法:
1)引用计数算法:
给对象添加引用计数器,引用+1,失效-1,为0则回收
缺点:循环引用时无效
2)根搜索算法:
定义名为“GC Root”的对象作为起始点,搜索走过的路径为引用链,当对象无法到达“GC Root”时则认为可回收。
3)标记-清除算法:
首先标记出要回收的对象,在标记完后统一回收所有的被标记的对象 缺点:效率问题和空间问题(需要先标记,产生大量不连续的碎片,导致程序需要分配较大对象时找不到连续足够大的内存空间从而需要出发另一次的垃圾回收动作)
4)复制算法:
将内存划分为大小相等的两块,每次只用一块,当这块内存用完了,将存活的对象复制到另一块上,然后把使用过的内存一次清理掉
优点:每次只对一块进行GC,不考虑内存碎片的问题,实现简单,运行高效
缺点:内存缩小一半
5)标记-整理算法:
让所有存活的对象都向一端移动,然后直接清理掉端边界以外的所有内存。
6)分代收集算法:
对年轻代、老年代、持久代分别进行收集,对持久代几乎无显著影响。
4、性能调优
java性能分析thread dump和heap dump和heap
heap dump记录的是内存信息,threaddump记录的是cpu信息 heapdump文件为二进制文件,保存某一时刻JVM堆中的使用情况,HeapDump是指定时刻java堆栈的快照,heap analyzer工具通过分析heapdump文件,哪些对象占用了太多的堆栈空间,来发现导致内存泄露或者可能引起内存泄露的对象。
threaddump 文件主要保存的是java应用中各线程在某一时刻的运行的位置,即执行到哪一个类的哪一个方法哪一个行上。thread dump是一个文本文件,打开后可以看到每一个线程的执行栈,以stacktrace的方式显示。通过对thread dump的分析可以得到应用是否“卡”在某一点上,即在某一点运行的时间太长,如数据库查询,长期得不到响应,最终导致系统崩溃。单个的thread dump文件一般来说是没有什么用处的,因为它只是记录了某一个绝对时间点的情况。比较有用的是,线程在一个时间段内的执行情况。
5、执行模式
6、编译优化
------------------------待完善------------------------