初始化

Java虚拟机 - 类初始化

徘徊边缘 提交于 2020-02-17 07:58:28
【深入Java虚拟机】之三:类初始化 类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的 Java 程序代码。虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化: 遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,如果类还没有进行过初始化,则需要先触发其初始化。生成这四条指令最常见的Java代码场景是:使用new关键字实例化对象时、读取或设置一个类的静态字段(static)时(被static修饰又被final修饰的,已在编译期把结果放入常量池的静态字段除外)、以及调用一个类的静态方法时。 使用Java.lang.refect包的方法对类进行反射调用时,如果类还没有进行过初始化,则需要先触发其初始化。 当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化。 当虚拟机启动时,用户需要指定一个要执行的主类,虚拟机会先执行该主类。 虚拟机规定只有这四种情况才会触发类的初始化,称为对一个类进行主动引用,除此之外所有引用类的方式都不会触发其初始化,称为被动引用。下面举一些例子来说明被动引用。 1、通过子类引用父类中的静态字段,这时对子类的引用为被动引用,因此不会初始化子类,只会初始化父类 [java] view plain copy class Father{ public static

Java day 4

那年仲夏 提交于 2020-02-17 07:48:16
1、随机数(Random:无参构造方法,用于生成随机数)使用步骤(和Scanner类似): (1)导包:import java.util.Random(); (2)创建对象:Random r=new Random(); (3)获取随机数:int number=r.nextInt(10) ;[注意:产生的随机数包括0不包括10] 2、数组:存储同一种数据类型的多个元素的容器 # 定义格式:(1)数据类型[ ] 数组名(常用);(2)数据类型 数组名[ ](很少用) 举例:a、int[ ] arr;定义了一个int类型的数组,数组名是arr; b、int arr[ ];定义了一个int类型的变量,变量名是arr数组 # 数据初始化(为数据开辟内存空间,并为数组中的每个元素赋予初值): (1)动态初始化(只给出长度,由系统给出初始化值):数据类型[ ] 数组名=new 数据类型 [ 数组长度]; (2)静态初始化(给出初始化值,由系统决定长度):数据类型[ ] 数组名=new 数据类型[ ]{元素1,元素2,元素3,...} (简化格式:数据类型[ ] 数组名=new {元素1, 元素2,元素3,...}) 3、Java中的内存分配: (1)栈:存储的是局部变量(定义在方法中的变量),使用完毕,立即回收; (2)堆:存储的是new出来的东西(实体,对象),每一个对象都有地址值

虚拟机是如何加载类的

北慕城南 提交于 2020-02-17 07:41:23
一、概述   首先先来看几个问题 jvm是如何加载这些Class文件的? jvm加载一个Class文件需要哪些步骤? Class文件中的信息进入到虚拟机后会发生什么变化?   接下来看看jvm加载class文件的概述:   jvm把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。这句话差不多已经回答上面三个问题的大部分了。   与那些在编译是需要进行连接工作的语言不同,在Java语言里面,类型的加载和连接过程都是在程序运行期间完成的,这样会在类加载是稍微增加一些性能开销,但是却能为Java应用程序提供高度的灵活性,Java中可以动态的扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。比如编写一个使用接口的应用程序,可以等到运行时在指定其实际的实现。这种组装应用程序的方式广泛应用于Java程序之中。 二、要点   类从被加载到jvm内存中开始,到卸载出内存为止,它的生命周期包括了一下步骤:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Useing)和卸载(Unloading)七个阶段。其中的验证、准备和解析三个部分统称为链接(Linking)

虚拟机类加载机制

假装没事ソ 提交于 2020-02-17 07:39:04
1、概述 在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用。 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的,会增加性能开销,但提供高度的灵活性,Java里天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。例如,如果编写一个面向接口的应用程序,可以等到运行时再指定其实际的实现类;用户可以通过Java预定义的和自定义类加载器,让一个本地的应用程序可以在运行时从网络或其他地方加载一个二进制流作为程序代码的一部分,这种组装应用程序的方式目前已广泛用于Java程序之中。从最基础的Applet、JSP到相对复杂的OSGi技术,都使用了Java语言运行期类加载的特性。 2、类加载的时机 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个部分统称为连接(Linking)。如下图所示: 加载、验证、准备

Java 中数组的内存分配

我的未来我决定 提交于 2020-02-17 07:12:51
Java 中数组的内存分配 1、Java 程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式。 2、数组基本概念 数组是存储同一种数据类型多个元素的容器。 数组既可以存储基本数据类型,也可以存储引用数据类型。 格式:数据类型[] 数组名 ; int[] arr; 数组的初始化方式: 动态初始化 : 初始化时只指定数组长度,由系统为数组分配初始值。 格式:数据类型[] 数组名 = new 数据类型[数组长度]; 数组长度其实就是数组中元素的个数。 int[] arr = new int[3]; 解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值。 静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度 格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...}; int[] arr = {1,2,3}; 解释:定义了一个int类型的数组,并且存进去{1,2,3}三个数。 3、Java中数组的内存分配 A、基本内存分配概念图解 int[] arr 存在于堆内存,new int[3] 存在于栈内存。 在堆内存中每一个 new 出来的对象都有一个唯一的地址值,就如同图中的 001,在 int[] arr = new int[3]; 相当于把堆内存的地址值 001

jvm系列(1):JVM问答

感情迁移 提交于 2020-02-17 06:37:12
一:JVM基础知识 1)Java 是如何实现跨平台的? 注意:跨平台的是 Java 程序,而不是 JVM。JVM 是用 C/C++ 开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的 JVM 答:我们编写的 Java 源码,编译后会生成一种 .class 文件,称为字节码文件。Java 虚拟机(JVM)就是负责将字节码文件翻译成特定平台下的机器码然后运行,也就是说,只要在不同平台上安装对应的 JVM,就可以运行字节码文件,运行我们编写的 Java 程序。 而这个过程,我们编写的 Java 程序没有做任何改变,仅仅是通过 JVM 这一 “中间层” ,就能在不同平台上运行,真正实现了 “一次编译,到处运行” 的目的。 2)什么是 JVM ? 解析:不仅仅是基本概念,还有 JVM 的作用。 答:JVM,即 Java Virtual Machine,Java 虚拟机。它通过模拟一个计算机来达到一个计算机所具有的的计算功能。JVM 能够跨计算机体系结构来执行 Java 字节码,主要是由于 JVM 屏蔽了与各个计算机平台相关的软件或者硬件之间的差异,使得与平台相关的耦合统一由 JVM 提供者来实现。 3)JVM 由哪些部分组成? 解析:这是对 JVM 体系结构的考察 答:JVM 的结构基本上由 4 部分组成: 类加载器,在 JVM 启动时或者类运行时将需要的 class 加载到

多线程CreateThread函数的用法及注意事项

一曲冷凌霜 提交于 2020-02-17 01:56:11
当使用CreateProcess调用时,系统将创建一个进程和一个主线程。CreateThread将在主线程的基础上创建一个新线程,大致做如下步骤:   1在内核对象中分配一个线程标识/句柄,可供管理,由CreateThread返回   2把线程退出码置为STILL_ACTIVE,把线程挂起计数置1   3分配context结构   4分配两页的物理存储以准备栈,保护页设置为PAGE_READWRITE,第2页设为PAGE_GUARD   5lpStartAddr和lpvThread值被放在栈顶,使它们成为传送给StartOfThread的参数   6把context结构的栈指针指向栈顶(第5步)指令指针指向startOfThread函数 语法:   hThread = CreateThread(&security_attributes, dwStackSize, ThreadProc,pParam, dwFlags, &idThread) ; HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,      // pointer to security attributes DWORD dwStackSize,                  // initial thread stack size

JAVA基础,字符串

不羁岁月 提交于 2020-02-17 01:46:39
字符串String(一个字符数组,常量,不可变): 1. 创建并初始化字符串:   1). 使用字符串常量直接初始化 String s="hello!";   2). 使用构造方法创建并初始化     String();//初始化一个对象,表示空字符序列     String(value);//利用已存在的字符串常量创建一个新的对象     String (char[] value);//利用一个字符数组创建一个字符串     String(char[] value,int offset,int count);//截取字符数组offset到count的字符创建一个非空串     String(StringBuffer buffer);//利用StringBuffer对象初始化String对象 2. 字符串的常用方法:   获取字符串信息:     下标:indexOf(子字符)lastIndexOf(子字符)     字符:charAt(下标)     字节数组:getBytes()     字符数组:toCharArray()     长度:length()   判断字符串     相等:equals(字符串)     前缀:startsWith(前缀)     后缀:endsWith(后缀)     大小:compareTo()     子字符串:reagionMatches(

pygame最小开发框架(嵩天老师视频笔记)

£可爱£侵袭症+ 提交于 2020-02-16 23:44:11
pygame最小开发框架 开发框架四个基本步骤 1. 引入pygame和sys sys是python的标准库,提供python运行时环境变量的操控 sys.exit()用于退出游戏 2. 初始化init()及设置 pygam.init()能够对pygame内部各功能模块进行初始化 初始化显示窗口 :pygame.display.set_mode(size) , 参数size是一个元组分别表示窗口的长度和宽度。 初始化窗体的标题:pygame.display.set.caption() 4. 获取事件并逐类响应 pygame中的所有事件:键盘敲击,鼠标移动都形成一个队列。 可以使用pygame.event.get() 从pygame的事件队列中取出事件并从队列中删除事件 pygame.QUIT是python中定义的退出事件常量 通过event.type == pygame.QUIT 判断是否推出 5. 刷新屏幕 函数pygame.display.update()刷新屏幕 代码演示 import pygame , sys pygame . init ( ) screen = pygame . display . set_mode ( ( 600 , 400 ) ) pygame . display . set_caption ( "pygame游戏之旅" ) while True :

CentOS-7 初始化配置

99封情书 提交于 2020-02-16 22:01:19
CentOS-7 初始化配置 init_scripts.sh #!/bin/bash cd `dirname $0` # 关闭selinux setenforce 0 sed -i '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config # 禁用NetworkManager systemctl stop NetworkManager systemctl disable NetworkManager # 调整log级别 #sed -i 's/\#LogLevel=info/LogLevel=notice/g' /etc/systemd/system.conf #systemctl daemon-reexec # 配置ssh sed -i -e "/GSSAPIAuthentication/s/yes/no/g" -e "/GSSAPICleanupCredentials/s/yes/no/g" -e"s/^#UseDNS\ no/UseDNS\ no/" -e"s/^#UseDNS\ yes/UseDNS\ no/" /etc/ssh/sshd_config echo -ne "ClientAliveInterval 60\nClientAliveCountMax 10" >> /etc/ssh/sshd_config