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

jvm基础(2)的更多相关文章

  1. JVM 基础知识

    JVM 基础知识(GC) 2013-12-10 00:16 3190人阅读 评论(1) 收藏 举报 分类: Java(49) 目录(?)[+] 几年前写过一篇关于JVM调优的文章,前段时间拿出来看了看 ...

  2. java 笔记(1)-—— JVM基础,内存数据,内存释放,垃圾回收,即时编译技术JIT,高精度类型

    1.java中5个存放数据的地方: (1).寄存器(Registers):位于CPU内部,是速度最快的存储区,但是数量和容量有限.在java中不能直接操作寄存器. (2).栈(Stack):栈位于通用 ...

  3. JVM基础:深入学习JVM堆与JVM栈

    转自:http://developer.51cto.com/art/201009/227812.htm JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM堆解决的是数据存储的问题, ...

  4. JVM基础知识(1)-JVM内存区域与内存溢出

    JVM基础知识(1)-JVM内存区域与内存溢出 0. 目录 什么是JVM 运行时数据区域 HotSpot虚拟机对象探秘 OutOfMemoryError异常 1. 什么是JVM 1.1. 什么是JVM ...

  5. Jvm基础(2)-Java内存模型

    Jvm基础(2)-Java内存模型 主内存和工作内存 Java内存模型包括主内存和工作内存两个部分:主内存用来存储线程之间的共享变量:而工作内存中存储每个线程的相关变量. 如下图所示: 需要注意的是: ...

  6. 剑指Offer——知识点储备-JVM基础

    剑指Offer--知识点储备-JVM基础 1.java内存与内存溢出 1.1 JVM分为哪些区,每一个区干嘛的?(见java虚拟机38页) (1)程序计数器(线程私有) 当前线程执行字节码的信号指示器 ...

  7. JVM基础系列第15讲:JDK性能监控命令

    查看虚拟机进程:jps 命令 jps 命令可以列出所有的 Java 进程.如果 jps 不加任何参数,可以列出 Java 程序的进程 ID 以及 Main 函数短名称,如下所示. $ jps 6540 ...

  8. JVM基础系列第14讲:JVM参数之GC日志配置

    说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志.而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数.今天就让 ...

  9. JVM基础系列第13讲:JVM参数之追踪类信息

    我们都知道 JVM 在启动的时候会去加载类信息,那么我们怎么得知他加载了哪些类,又卸载了哪些类呢?我们这一节就来介绍四个 JVM 参数,使用它们我们就可以清晰地知道 JVM 的类加载信息. 为了方便演 ...

  10. JVM基础系列第11讲:JVM参数之堆栈空间配置

    JVM 中最重要的一部分就是堆空间了,基本上大多数的线上 JVM 问题都是因为堆空间造成的 OutOfMemoryError.因此掌握 JVM 关于堆空间的参数配置对于排查线上问题非常重要. tips ...

随机推荐

  1. IDA动态调试技术及Dump内存

    IDA动态调试技术及Dump内存 来源 https://blog.csdn.net/u010019468/article/details/78491815 最近研究SO文件调试和dump内存时,为了完 ...

  2. Android2.2源码属性服务分析

    属性服务property service 大家都知道,在windows中有个注册表,里面存储的是一些键值对.注册表的作用就是:系统或者应用程序将自己的一些属性存储在注册表中,即使系统或应用程序重启,它 ...

  3. 解决 Jackson反序列化 Unexpected token ... , expected VALUE_STRING: need JSON String that contains type id (for subtype of ...)

    首先检查是否是 objectMapper.enableDefaultTyping(); 的受害者.优先考虑删除该配置. 使用Jackson把数组的json字符串反序列化为List时候报了个JsonMa ...

  4. Java-Pi的几种实现

    1.无穷级数计算 p = 1 - 1/3 + 1/5 -1/7+..... π=4p 2.使用 Nilakantha 级数 π = 3 + 4/(2*3*4) - 4/(4*5*6) + 4/(6*7 ...

  5. 【CF1016A】Death Note(签到)

    题意:无限页的书,每页可以写m个名字,给你一个长度为n的序列,序列为你每天要写的名字数,输出你每天要翻的页数. n<=2e5,m,a[i]<=1e9 思路: #include<cst ...

  6. iOS8下定位问题解决

    项目是以前iOS7的,升级iOS8后,无法成功获取用户位置.后来才发现iOS8 使用定位需要在infoplist文件中加2个key,然后manager需要加一个方法,指定定位授权机制   在plist ...

  7. mysql tinyint bit

    Java bit 对应 mysql tinyint(1)    false = 0 ,true = 1.

  8. LeetCode OJ--Rotate Image

    http://oj.leetcode.com/problems/rotate-image/ 将矩阵顺时针旋转90度.要求为原地算法. 注意对输入的测试,矩阵为空,长度为1,为2时…… #include ...

  9. AC日记——[网络流24题]骑士共存 cogs 746

    746. [网络流24题] 骑士共存 ★★☆   输入文件:knight.in   输出文件:knight.out   简单对比时间限制:1 s   内存限制:128 MB 骑士共存问题 «问题描述: ...

  10. js-控制浏览器和移动端的后退按钮 . popstate

    //控制浏览器和移动端的后退按钮 if (window.history && window.history.pushState) { $(window).on('popstate', ...