zoukankan      html  css  js  c++  java
  • 简析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内存结构

     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

  • 相关阅读:
    构建自己的C/C++插件开发框架(四)——核心层设计和实现
    构建自己的C/C++插件开发框架(二)——总体功能
    对企业来说,要放在第一位的是什么
    深入理解C++的动态绑定和静态绑定
    构建自己的C/C++插件开发框架(三)——总体结构
    管道和过滤器
    层模式——面向模式的体系结构学习笔记
    使用信元流(TLVStream)规范、简化模块(C/C++)间交互
    推荐博客
    Android 操作系统的内存回收机制
  • 原文地址:https://www.cnblogs.com/qqguoqin/p/12786863.html
Copyright © 2011-2022 走看看