异常将上下文初始化事件发送到类的侦听器实例_深入浅出JVM性能调优——JVM内存( 二 )


本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,它可以做任何他想做的事情,本地方法不受虚拟机控制 。
5、程序计数器
每一个运行的线程都会有它的程序计数器(PC寄存器),与线程的生命周期一样 。执行某个方法时,PC寄存器的内容总是下一条将被执行的地址,这个地址可以是一个本地指针,也可以是在方法字节码中相对于该方法起始指令的偏移量 。如果该线程正在执行一个本地方法,那么此时PC寄存器的值是。
程序计数器是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成 。多线程环境下,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储 。
二、类加载机制
写好的源代码,需要编译后加载到虚拟机才能运行 。java 源文件编译成 class 文件后,jvm 通过类加载器把 class 文件加载到虚拟机,然后经过类连接(类连接又包括验证、准备、解析三个阶段),最后经过初始化,字节码就可以被解释执行了 。对于一些热点代码,虚拟机还存在一道即时编译,会把字节码编译成本地平台相关的机器码,以提高热点代码的执行效率 。
装载、验证、准备、初始化这几个阶段的顺序是确定的,类型的加载过程必须按照这种顺序开始,而解析阶段可以在初始化阶段之后再开始,一般是在第一次使用到这个对象时才会开始解析 。这些阶段通常都是互相交叉地混合进行的,会在一个阶段执行的过程中调用、激活另一个阶段,比如发现引用了另一个类,那么就会先触发另一个类的加载过程 。
接下来通过如下类和代码来详细分析下类加载的过程:
1 package com.lyyzoo.jvm.test01;
2
3 public class Person {
4
5public static final String SEX_MAN = "Male";
6public static final String SEX_WOMAN = "Female";
7
8static {
9System.out.println("Person static init");
10System.out.println("SEX_MAN: " + SEX_MAN);
11}
12
13public void sayHello(T str) {
14System.out.println("Person say hello: " + str);
15}
16 }
17
18
19 /
20
21
22 package com.lyyzoo.jvm.test01;
23
24 import java.io.Serializable;
25
26 public class User extends Person implements Serializable {
27private static final long serialVersionUID = -4482416396338787067L;
28
29// 静态常量
30public static final String FIELD_NAME = "username";
31public static final int AGE_MAX = 100;
32
33// 静态变量
34private static String staticName = "Rambo";
35private static int staticAge = 20;
36
37// 类属性
38private String name = "兰博";
39private int age = 25;
40
41// 静态代码块
42static {
43System.out.println("user static init");
44System.out.println("staticName=" + staticName);
45System.out.println("staticAge=" + staticAge);
46}
47
48public User() {
49}
50
51public User(String name, int age) {
52this.name = name;
53this.age = age;
54}
55
56// 实例方法
57public void printInfo() {
58System.out.println("name:" + name + ", age:" + age);
59}
60
61// 静态方法
62public static void staticPrintInfo() {
63System.out.println("FIELD_NAME:" + FIELD_NAME + ", AGE_MAX:" + AGE_MAX);
64}
65
66// 泛型方法重载
67@Override
68public void sayHello(String str) {
69super.sayHello(str);
70System.out.println("User say hello: " + str);