本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,它可以做任何他想做的事情,本地方法不受虚拟机控制 。
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);
- 大唐名将程咬金凌烟阁二十四功臣之一
- 岳家*中第一猛将杨再兴:万箭穿身屹立不倒!
- 共探工业数智化,TVP河南工业互联网论坛将重磅召开!
- 戴尔 PC 将完全退出中国!完整时间表曝光
- 明朝将领胡大海为什么会被部下活活打*
- 二战名将排名,二战十大名将排名
- 美军内部出现高人,将是我国最可怕对手?美媒:此人建议非常长远 中国之最简谱教学视频
- 《无畏契约》国服上线,这款FPS将带动CN电竞进入新纪元 团队游戏中国之最
- ios mysql APP,iOS11将内置文件管理器?
- ios mysql APP_iOS11将内置文件管理器?