• jvm基础(2)


    7.类装载器

      (1)class装载验证流程:

        A加载。这是装载类的第一个阶段,执行的动作包括:取得类的二进制流,转为方法区数据结构,在java堆中生成对应的java.lang.Class对象。

        B链接。

          验证,验证的目的是保证class流的格式正确性,包括A.文件格式的验证,是否以0xCAFEBABE开头,版本号是否合理,B.元数据验证,是否有父类,是否继承final类,非抽象类实现了所有的抽象方法等,C.字节码验证,运行检查,栈数据类型和操作码数据参数是否吻合,跳转指令是否跳转到合法的地址,D.符号引用验证,常量池中描述类是否存在,访问的方法和字段是否存在且有足够的权限。

          准备,分配内存,并为类设置初始值 (方法区中),比如说public static int v=1;在准备阶段v会被设置为0,在初始化阶段的<clinit>才会被设置为1,对于static final类型,在准备阶段就会被赋上正确的值。

          解析,符号引用替换为直接引用,字符串引用对象不一定被加载,指针或者地址偏移量引用对象一定在内存。

        C初始化。执行类构造器<clinit>,包括static变量赋值语句、static{}语句,子类的<clinit>调用前保证父类的<clinit>被调用,<clinit>是线程安全的。

      (2)类装载器ClassLoader

        ClassLoader是一个抽象类,ClassLoader的实例将读入Java字节码将类装载到JVM中,ClassLoader可以定制,满足不同的字节码流获取方式,ClassLoader负责类装载过程中的加载阶段。

      (3)JDK中ClassLoader默认设计模式

        ClassLoader的重要方法

        public Class<?> loadClass(String name) throws ClassNotFoundException  载入并返回一个Class

        protected final Class<?> defineClass(byte[] b, int off, int len)  定义一个类,不公开调用

        protected Class<?> findClass(String name) throws ClassNotFoundException  loadClass回调该方法,自定义ClassLoader的推荐做法

        protected final Class<?> findLoadedClass(String name)  寻找已经加载的类

        默认设计模式分类:

        BootStrap ClassLoader (启动ClassLoader)

        Extension ClassLoader (扩展ClassLoader)

        App ClassLoader (应用ClassLoader/系统ClassLoader)

        Custom ClassLoader(自定义ClassLoader)

        每个ClassLoader都有一个Parent作为父亲

        。。。。。。

      (4)热替换。当一个class被替换后,系统无需重启,替换的类立即生效。

    8.性能监测

      linux系统的性能查看工具,参加我的另一篇博客http://www.cnblogs.com/zhutianpeng/p/4248237.html

      jdk自带的性能查看工具:

      jps

        列出java进程,类似于ps命令

        参数-q可以指定jps只输出进程ID ,不输出类的短名称

        参数-m可以用于输出传递给Java进程(主函数)的参数

        参数-l可以用于输出主函数的完整路径

        参数-v可以显示传递给JVM的参数

        例如jps -m -l -v

      jinfo

        可以用来查看正在运行的Java应用程序的扩展参数,甚至支持在运行时,修改部分参数

        -flag <name>:打印指定JVM的参数值

        -flag [+|-]<name>:设置指定JVM参数的布尔值

        -flag <name>=<value>:设置指定JVM参数的值

        例如:

        显示了新生代对象晋升到老年代对象的最大年龄 jinfo -flag MaxTenuringThreshold 2972 

                              -XX:MaxTenuringThreshold=15

        显示是否打印GC详细信息 jinfo -flag PrintGCDetails  2972

                    -XX:-PrintGCDetails

        运行时修改参数,控制是否输出GC日志 jinfo -flag PrintGCDetails  2015

                                                                 -XX:-PrintGCDetails

                                                                 jinfo -flag +PrintGCDetails  2015

                                                                 jinfo -flag PrintGCDetails  2015

                                                                 -XX:+PrintGCDetails

      jmap

        生成Java应用程序的堆快照和对象的统计信息

        如:jmap -histo 2015 >c:s.txt

        dump堆:jmap -dump:format=b,file=/tmp/heap.hprof 2015

      jstack

        打印线程dump,打印锁信息

        m 打印java和native的帧信息

        F 强制dump,当jstack没有响应时使用

        如:jstack 120>>/tmp/a.txt

      jConsole

        图形化监控工具

        可以查看Java应用程序的运行概况,监控堆信息、永久区使用情况、类加载情况等

      Visual VM

        Visual VM是一个功能强大的多合一故障诊断和性能监控的可视化工具

    9.java堆分析

      jvm中内存包括:堆,永久区,线程栈,直接内存。

      OOM原因及处理方法:

        堆溢出:占用大量堆空间,直接溢出,解决办法:增加堆空间和及时释放内存。

        永久区溢出:生成大量的类,解决办法:增大perm区和允许 class回收。

        栈溢出:这里的栈溢出指,在创建线程的时候,需要为线程分配栈空间,这个栈空间是向操作系统请求的,如果操作系统无法给出足够的空间,就会抛出OOM。解决办法:减少堆内存,减少线程栈大小。

        直接内存溢出:ByteBuffer.allocateDirect()无法从操作系统获得足够的空间。解决办法:减少堆内存,有意出发GC。

      分析工具:visual VM,MAT

  • 相关阅读:
    20140830 函数 递归
    函数 20140829
    结构体20140827
    20140826 集合
    20140822数组,应用举例
    140821 字符串,数字,日期及应用举例
    20140819 例子
    HTML基础
    登陆远程服务器
    索引 视图 游标
  • 原文地址:https://www.cnblogs.com/zhutianpeng/p/4275465.html
Copyright © 2020-2023  润新知