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)

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)

寻找已经加载的类

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  2972

-XX:-PrintGCDetails

jinfo -flag +PrintGCDetails  2972

jinfo -flag PrintGCDetails  2972

-XX:+PrintGCDetails

  jmap

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

    如:jmap -histo 2972 >c:\s.txt

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

  jstack

    打印线程dump,打印锁信息

    m 打印java和native的帧信息

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

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

  jConsole

    图形化监控工具

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

  Visual VM

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

9.java堆分析

时间: 2024-10-31 10:04:16

jvm基础(2)的相关文章

jvm基础理解

一.jvm运行时内存区域 包含堆,虚拟机栈,本地栈(调用native方法时用到),方法区(perm区),程序计数器. 假设32位操作系统,这时系统限制每个进程大小为2G.这样上述这些区域(对于本地栈及程序计数器来讲,是无法设置的,hotspot有提供-Xoss参数用于设置本地方法栈.但实际是无效的)可以用相应参数设置,共同划分全部2G内存. 注意还有一块直接内存,不属于JAVA运行时区域.但是它的空间用得太多的话,还是受限于物理内存和虚拟内存总大小,因此也会抛出OutOfMemory.典型的re

JVM基础:深入学习JVM堆与JVM栈(转)

JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM堆解决的是数据存储的问题,即数据怎么放.放在哪儿,另外JVM堆中存的是对象.JVM栈中存的是基本数据类型和JVM堆中对象的引用. JVM基础概念:JVM堆与JVM栈 数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值."引用值"代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置. 基本类型

【转】JVM基础概念总结:数据类型、堆与栈

JVM基础概念总结:数据类型.堆与栈.基本类型与引用类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置. 基本类型包括:byte, short, int, long, char, float, double, Boolean, returnAddress 引用类型包括:类类型,接口类型和数组. 堆与栈 堆和栈是

关于Java面试知识点解析——JVM基础篇

跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽.切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己的发展,偏移自己规划的轨迹),还是钱给少了,不受重视. 准备不充分的面试,完全是浪费时间,更是对自己的不负责(如果title很高,当我没说).今天给大家分享下 Java面试知识点解析--JVM基础篇 1)Java 是如何实现跨平台的? 注意:跨平台的是 Java 程序,而不是 JVM.JVM 是用 C/C++ 开发的,是

JVM基础和调优(二)

主要讲述java虚拟机的内存体系结构 了解了JVM 的一些基础之后,我们来看看java虚拟机内存的体系结构,这个是理解JVM垃圾收集算法的前提,理解了内存结构我们才能够针对不同的部分根据我们的程序进行优化.前面已经说明了,java的堆和栈,但是只是局部的说了一下,没有在java内存体系中说明. 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成图形,所以只要你有耐心,仔细,认真,并发挥你的想象力

JVM基础和调优(一)

最近的项目中,出现了内存和性能的问题,需要优化,所以趁着这个机会,把自己关于java虚拟机的东整理一下,不对的地方,欢迎指出. 数据类型,因为在java的优化的过程中,检测到的数据类型一般比较的基础,毕竟复杂的数据类型就是有基础的组合而来的. Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,表示的是数据本身的值,是数据中的最基础的部分,一般包含: byte,short,int,long,char,float,double,Boolean,returnAddr

JVM基础01-内存分配

一.什么是JVM Java作为主流编程语言: 它摆脱了硬件的束缚,一处编写,处处运行: 它提供了一种相对安全的内存管理和访问机制,避免了大部分的内存泄露和指针越界问题: 它实现了热点代码的检测和运行时编译优化,这使得Java应用能够随着时间的推移而获取更高的性能: 结构严谨,API丰富 .... 上图就是JVM的物理结构图,什么是JVM? JVM是JAVA最核心的基础,一切的JAVA程序都依赖于JVM,而且依赖于JVM的语言并不仅仅是JAVA,还有其他的著名语言例如JRuby,Scala等等.而

[Java] Java 技术和 JVM 基础

Java 由 Sun 公司在 1995 首次发布,既是一门编程语言,也是一个计算平台. Java 运行时版本 Java Runtime Edition 当你下载 Java 完时候,你会得到一个 Java Runtime Time(JRE).JRE 由三部分组成 : JVM,Java 平台的核心类,支持 Java 平台的库.这三部分是执行 Java 应用运行的基础. Java 编程语言 Java 是一门面向对象的编程语言,包括以下特性: 平台独立 - Java 应用被编译成字节码存储在 .clas

jvm基础概念和参数

1.Trace跟踪参数 -verbose:gc -XX:+printGC -XX:+PrintGCDetails 打印GC详细信息 -XX:+PrintGCTimeStamps 打印CG发生的时间戳 -Xloggc:log/gc.log 指定GC log的位置,以文件输出 -XX:+PrintHeapAtGC 每次一次GC后,都打印堆信息 -XX:+TraceClassLoading 监控类的加载 -XX:+PrintClassHistogram 按下Ctrl+Break后,打印类的信息, 分别

JVM基础(5)-垃圾回收机制

一.对象引用的类型 Java 中的垃圾回收一般是在 Java 堆中进行,因为堆中几乎存放了 Java 中所有的对象实例.谈到 Java 堆中的垃圾回收,自然要谈到引用.在 JDK1.2 之前,Java 中的引用定义很很纯粹:如果 reference 类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用.但在 JDK1.2 之后,Java 对引用的概念进行了扩充,将其分为强引用(Strong Reference).软引用(Soft Reference).弱引用(Weak