简析JVM

JVM总体知识点

类的加载机制

类的加载过程是指将编译后的class文件读入到内存中,然后在堆区创建一个java.lang.Class对象,用于封装类在方法区内的数据结构。类加载的最终目的是封装类在方法区的数据结构,并向程序设计者提供访问方法区数据的接口。

类的生命周期分为5个阶段:加载,连接,初始化,使用,卸载。

类的加载过程主要完成3件事:

通过类的限定名来获取定义此类的二进制字节流,2.将这个字节流代表的静态存储结构转为方法区的运行时数据结构,3在堆中生成一个代表此类的java.lang.class对象作为访问方法区这些数据结构的入口。

连接这个过程分3个阶段(校验,准备,解析):校验class文件中包含的信息是否符合jvm的规范,具体的校验通过对文件格式,元数据,字节码,符号引用验证来完成;准备是为类变量分配内存,并将其初始化为默认值;解析是把类型中的符号引用转换为直接引用。

初始化:执行类的构造器方法的过程。完成类的初始化可以用new,class.newInstance(反射机制),Constructor的newInstance,clone,使用(反)序列机制创建对象。

使用:完成类的初始化后,就可以在程序中进行使用。

卸载:当类被加载,连接和初始化后,它的生命周期就开始了,当代表类的class对象不再被引用时,class对象就会结束生命周期,类在方法区内的数据就会被卸载,因此一个类何时被结束生命取决于代表它的class对象何时结束生命。

JVM内存结构

扫描二维码关注公众号,回复: 11138931 查看本文章

 java程序在运行时需要在内存中分配空间,为了提高运行效率,就对数据进行了不同空间的划分,因为每一片区域都有特定的数据处理方式和内存管理方式。具体划分为5个内存空间:

栈:负责java程序的运行,它是在线程创建的时候创建的,所以生命周期也是和线程的生命周期一致,同时消亡,线程结束,栈也就释放了。

       存放局部变量。每一个线程包含一个栈,栈中只保存基础数据和自定义对象的引用。栈中数据私有,不能被其他线程访问。特点是栈内存的数据用完就释放。

堆:存放所有new对象本身,每个对象都包含与之对应的class信息(class信息的目的是得到操作指令),JVM只有一个堆区,被所有线程共享

方法区:被虚拟机加载的类信息,常量,静态常量等,被所有线程共享,方法区中包含所有的class(class是指类的原始代码,要创建一个类,首先要把该类的代码加载到方法区,并且初始化)和static变量。

程序计数器(和系统有关):方法区中的方法字节码由引擎读取下一条指令,它是一个非常小的内存空间。

本地方法栈:主要作用是登记本地方法,然后在执行引擎执行的时候加载本地方法库

GC(包括GC算法,垃圾回收器)

GC的作用域是在方法区和堆。常见的垃圾回收算法:标记-清除,复制,标记-压缩,分代收集

JVM调优化

1.初始化内存和最大内存尽量保持一致,避免内存不够用继续扩充内存。最大内存不要超过物理内存。

2.gc频率不要太高,时间不要太长

常见调优工具:

jps:查看所有的jvm进程,包括进程ID,进程启动路径

jsstack:观察jvm中当前所有线程的运行情况和线程当前状态

了解JRE,JDK,JVM三者的关系

JRE(Java Development Kit).JRE(Java Runtime Enviroment),JVM(Java Virtual machine).

JDK包含JRE,而JRE包含JVM

猜你喜欢

转载自www.cnblogs.com/qqguoqin/p/12786863.html
今日推荐