JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method) (该知识点引用 http://www.cnblogs.com/dingyingsi/p/3760730.html)

堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

类加载机制

  JVM把class文件加载到内存,并对数据进行校验、解析和初始化,最终形成JVM可以直接使用的Java类型的过程。

加载:

  将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时二进制数据结构,在堆中生成一个代表这个类的java.lang.class对象,作为方法区类数据的访问入口。这个过程需要类加载器的参与。

链接:  将java类的二进制代码合并到JVM的运行状态之中的过程

  验证: 确保加载的类信息符合JVM规划,没有安全方面的问题。

  准备:正式为类变量(static变量)分配内存并设置类变量的初始值的阶段,这些内存都将在方法区中进行分配。

  解析:虚拟机常量池的符号引用替换为直接引用的过程。

初始化:

  初始化阶段是执行类构造器<clinit>()方法的过程。类构造器<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生的。

  当初始化一个类的时候,如果发现其父类还没有进行过初始化、则需要先初始化其父类

  虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确加锁和同步

  当访问一个Java类的静态域时,只有真正声明这个域的类才会被初始化。

例如:

  

结果:

   

图解过程:

    

  示例代码:

      

 package com.huang.classLoader;
public class Demo01 {
static {
System.out.println("静态初始化Demo01");
}
public static void main(String[] args){
System.out.println("Demo01的main方法!");
A a = new A();
System.out.println(A.width);
A a2 = new A();
}
}
class A extends A_Father{
public static int width=100;
static {
System.out.println("静态初始化类A");
width = 300;
}
public A(){
System.out.println("创建A的类对象");
}
}
class A_Father{
static {
System.out.println("静态初始化A_Father");
}
}

 结果:   

静态初始化Demo01   //先加载Demo01
Demo01的main方法!  //然后调用main方法
静态初始化A_Father  //初始化A的父类
静态初始化类A    //然后初始化A
创建A的类对象  
300
创建A的类对象  //不需要重新加载类A

类是否初始化:

  类的主动引用(一定会发生类的初始化)

    new 一个类的对象

    调用类的静态成员(除了final常量)和静态方法

    使用java.lang.reflect包的方法对类进行反射调用

    当虚拟机启动, java Hello ,则一定会初始化Hello类,说白了就是先启动main方法所在的类

    当初始化一个类,如果其父类没有被初始化,则会先初始化他的父类

  类的被动引用(不会发生类的初始化)

    当访问一个静态域时,只有真正声明这个域的类才会被初始化

      通过子类引用父类的静态变量,不会导致子类初始化

    通过数组定义类引用,不会触发此类的初始化

    引用常量不会触发此类的初始化(常量在编译阶段就存入调用类的常亮池中了)

  例如:

package com.huang.classLoader;
public class Demo01 {
static {
System.out.println("静态初始化Demo01");
}
public static void main(String[] args) throws ClassNotFoundException {
//主动引用
// new A();
// System.out.println(A.width);
// Class.forName("com.huang.classLoader.A"); //被动引用
// System.out.println(A.MAX);
// A[] as = new A[10];
System.out.println(B.width);//B没有被初始化
}
} class B extends A{
static {
System.out.println("静态初始化B");
}
} class A extends A_Father{
public static final int MAX = 100;
public static int width=100;
static {
System.out.println("静态初始化类A");
width = 300;
}
public A(){
System.out.println("创建A的类对象");
}
}
class A_Father{
static {
System.out.println("静态初始化A_Father");
}
}

  

  

  

JVM运行和类加载过程的更多相关文章

  1. JVM(五):探究类加载过程-上

    JVM(五):探究类加载过程-上 本文我们来研究一个Java字节码文件(Class文件)是如何加载入内存中的,在這個过程中涉及类加载过程中的加载,验证,准备,解析(连接),初始化,使用,销毁过程,并探 ...

  2. JVM学习笔记——类加载过程

    JVM学习笔记——类加载过程 类加载模型——双亲委派模型(Parents Delegation Model)也可称为“溯源委派加载模型” Java的类加载器是一个运行时核心基础设施模块,主要是启动之初 ...

  3. JVM总括四-类加载过程、双亲委派模型、对象实例化过程

    JVM总括四-类加载过程.双亲委派模型.对象实例化过程 目录:JVM总括:目录 一. 类加载过程 类加载过程就是将.class文件转化为Class对象,类实例化的过程,(User user = new ...

  4. JVM(六):探究类加载过程-下

    JVM(六):探究类加载过程-下 上文说了类加载过程的5个阶段,着重介绍了各个阶段做的工作.在本文中,我们对执行加载阶段的主体进行探讨,学习类加载器的模型和逻辑,以及我们该如何自定义一个类加载器. 定 ...

  5. JVM核心之JVM运行和类加载全过程

    为什么研究类加载全过程? 有助于连接JVM运行过程 更深入了解java动态性(解热部署,动态加载),提高程序的灵活性 类加载机制 JVM把class文件加载到内存,并对数据进行校验.解析和初始化,最终 ...

  6. [jvm学习笔记]-类加载过程

    JVM类加载的过程 加载=>验证=>准备=>解析=>初始化 5个阶段所执行的具体动作 加载 在加载阶段,虚拟机需要完成3个事情1.通过一个类的全限定名获取定义此类的二进制字节流 ...

  7. JVM探究之 —— 类加载过程

    1. 类加载是什么 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 与那些在编译时需要进行连 ...

  8. JVM运行、类加载的全过程

    类加载机制:JVM把CLASS文件加载到内存,并对数据进行校验.解析和初始化,最终形成JVM可以直接使用的Java文件. 加载:把class文件字节码加载到内存中,并且将这些静态数据转换成方法区中的运 ...

  9. JVM核心——JVM运行和类加载全过程

    1.类加载全过程 (1)类加载机制 JVM把class文件加载到内存,并对数据进行校验.解析和初始化,最终形成JVM可以直接使用的Java类型的过程. 加载 将class文件字节码内容加载到内存中,并 ...

随机推荐

  1. sqlserver怎么将查询出来的数据存到新的数据库表中

    查询结果直接创建一个新表存放select * into [新表名] FROM [原表名]WHERE 车辆='小汽车' 若新建表要放在另一个数据库B中USE BGOSELECT * INTO [新表名] ...

  2. android: activity切换之效果

    Activity是android应用的重要部分;为了提高用户的体验度,加了Activity之间切换的动画效果,现在介绍的一种切换动画: 是什么效果,大家自已动手测试一下便知道: 先看进入的动画: pa ...

  3. 【python基础】之list列表

    python提供了一个被称为列表的数据类型,他可以存储一个有序的元素集合. 记住:一个列表可以存储任意大小的数据集合.列表是可变对象,有别于字符串str类,str类是不可变对象. 1.创建一个列表 l ...

  4. Chrome 插件集锦

    原文出处:CN_Simo 子曾曰:"工欲善其事,必先利其器.居是邦也."--语出<论语·卫灵公>:其后一百多年,荀子也在其<劝学>中倡言道:"吾尝 ...

  5. CF448C [Painting Fence]递归分治

    题目链接:http://codeforces.com/problemset/problem/448/C 题目大意:用宽度为1的刷子刷墙,墙是一长条一长条并在一起的.梳子可以一横或一竖一刷到底.求刷完整 ...

  6. iOS自定义视图- SJTextView

    需求: textView 需要placeholder用来提示输入 textView 要做字数限制 textView 禁止表情符号的输入 思考: 因为需求比较通用,便想通过自定义SJTextView来实 ...

  7. vs生成配置release自动恢复成debug无法配置的问题

    软件为visual studio 2015,右键单个项目选属性,设置“生成配置”release,保存后,再次右键属性,却发现又自动恢复成debug,怎么回事?是无法配置吗?点击生成试试,果然2b了. ...

  8. 笔记之《用python写网络爬虫》

    1 .3 背景调研 robots. txt Robots协议(也称为爬虫协议.机器人协议等)的全称是"网络爬虫排除标准"(Robots Exclusion Protocol),网站 ...

  9. DHCP协议

    来源摘取自百度百科 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服 ...

  10. wpf中子窗口的几个问题

    今天研究了一下wpf中的窗口,写这篇文章来总结一下今天的收获.(转载请注明出处~) 总所周知,窗口是windows系统中十分重要的一个元素(从名字上就能体现出来),而一个应用程序总是包含很多窗口(主窗 ...