你的位置:欧美黄瓜视频在线观看_呦男呦女视频精品导航_少妇苏霞白洁刺激A片_美女被强奷到高潮免费_强奷乱码中文字幕在线_久久青青草原一区二区_变态乱另类仑小说专区 > 欧美成人全部免费全部 >


玖玖资源站中文字幕在线

发布日期:2022-06-25 04:47    点击次数:120


玖玖资源站中文字幕在线

玖玖资源站中文字幕在线

 美女把尿口扒开让男人桶美女把尿口扒开让男人桶

这篇著作诠释了Java 杜撰机(JVM)的里面架构。下图显露了遵命 Java SE 7 门径的典型的 JVM 中枢里面组件。

 

JVM内幕:Java杜撰机详解

 

上图显露的组件分两个章节诠释。第一章究诘针对每个线程创建的组件,第二章节究诘了线程无关组件。

线程 JVM 系统线程 每个线程关系的 方法计数器 栈 腹地栈 栈落幕 栈帧 局部变量数组美女把尿口扒开让男人桶 操作数栈 动态贯穿 线程分享 堆 内存处置 非堆内存 即时编译 方法区 类文献结构 类加载器 更快的类加载 方法区在那边 类加载器参考 运行不时量池 极度表 标志表 Interned 字符串

线程

这里所说的线程指方法实行经过中的一个线程实体。JVM 允许一个诓骗并发实行多个线程。Hotspot JVM 中的 Java 线程与原生操作系统线程有径直的映射关系。当线程腹地存储、缓冲划分拨、同步对象、栈、方法计数器等准备好以后,就会创建一个操作系统原生线程。Java 线程扫尾,原生线程随之被回收。操作系统细致调换总计线程,并把少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根们分拨到任何可用的 CPU 上。当原生线程运滚动已矣,就会调用 Java 线程的 run() 方法。run() 复返时,被处理未拿获极度,原生线程将阐述由于少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根的扫尾是否要闭幕 JVM 进度(比如这个线程是临了一个非看护线程)。当线程扫尾时,会开释原生线程和 Java 线程的总计资源。

JVM 系统线程

若是使用 jconsole 八成其少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根调试器,你会看到许多线程在后台运行。这些后台线程与触发 public static void main(String[]) 函数的干线程以及干线程创建的其他线程一道运行。Hotspot JVM 后台运行的系统线程主要有底下几个:

 

JVM内幕:Java杜撰机详解

 

线程关系组件

每个运行的线程都包含底下这些组件:

方法计数器(PC)

PC 指现时教导(或操作码)的地址,腹地教导除外。若是现时方法是 native 方法,那么PC 的值为 undefined。总计的 CPU 都有一个 PC,典型气象下,每实行一条教导 PC 都会自增,因此 PC 存储了指向下一条要被实行的教导地址。JVM 用 PC 来追踪教导实行的位置,PC 将实质上是指向方法区(Method Area)的一个内存地址。

栈(Stack)

每个线程领有我方的栈,栈包含每个方法实行的栈帧。栈是一个后进先出(LIFO)的数据结构,因此现时实行的方法在栈的顶部。每次方法调用时,一个新的栈帧创建并压栈到栈顶。当方法正常复返或抛出未拿获的极度时,栈帧就会出栈。除了栈帧的压栈和出栈,栈不行被径直操作。是以不错在堆上分拨栈帧,何况不需要一语气内存。

Native栈

并非总计的 JVM 杀青都撑持腹地(native)方法,那些提供撑持的 JVM 一般都会为每个线程创建腹所在法栈。若是 JVM 用 C-linkage 模子杀青 JNI(Java Native Invocation),那么腹地栈等于一个 C 的栈。在这种情况下,腹所在法栈的参数轨则、复返值和典型的 C 方法相通。腹所在法一般来说不错(依赖 JVM 的杀青)反过来调用 JVM 中的 Java 方法。这种 native 方法调用 Java 会发生在栈(一般是 Java 栈)上;线程将离开腹所在法栈,并在 Java 栈上蛊卦一个新的栈帧。

栈的落幕

栈不错是动态分拨也不错固定大小。若是线程央求一个卓著允许鸿沟的空间,就会抛出一个StackOverflowError。若是线程需要一个新的栈帧,然而莫得鼓胀的内存不错分拨,就会抛出一个 OutOfMemoryError。

栈帧(Frame)

每次方法调用都会新建一个新的栈帧并把少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根压栈到栈顶。当方法正常复返八成调用经过中抛出未拿获的极度时,栈帧将出栈。更多对于极度处理的细节,不错参考底下的极度信息表章节。

每个栈帧包含:

局部变量数组 复返值 操作数栈 类现时方法的运行不时量池援用

局部变量数组

局部变量数组包含了方法实行经过中的总计变量,包括 this 援用、总计方法参数、其他局部变量。对于类方法(也等于静态方法),方法参数从下标 0 脱手,对于对象方法,位置0保留为 this。

有底下这些局部变量:

boolean byte char long short int float double reference returnAddress

除了 long 和 double 类型之外,总计的变量类型都占用局部变量数组的一个位置。long 和 double 需要占用局部变量数组两个一语气的位置,因为少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根们是 64 位双精度,其少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根类型都是 32 位单精度。

操作数栈

操作数栈在实行字节码教导经过中被用到,这种形态访佛于原生 CPU 寄存器。大部分 JVM 字节码把本事破耗在操作数栈的操作上:入栈、出栈、复制、交换、产生消费变量的操作。因此,局部变量数组和操作数栈之间的交换变量教导操作通过字节码频繁实行。比如,一个简短的变量运滚动语句将产生两条跟操作数栈交互的字节码。

int i; 

被编译成底下的字节码:

0: iconst_0 // Push 0 to top of the operand stack 1: istore_1 // Pop value from top of operand stack and store as local variable 1 

更多对于局部变量数组、操作数栈和运行不时量池之间交互的禁绝信息,不错在类文献结构部分找到。

动态贯穿

每个栈帧都有一个运行不时量池的援用。这个援用指向栈帧现时运行方法所在类的常量池。通过这个援用撑持动态贯穿(dynamic linking)。

C/C++ 代码一般被编译成对象文献,然后多个对象文献被贯穿到一道产生可实行文献八成 dll。在贯穿阶段,每个对象文献的标志援用被替换成了最终实行文献的相对偏移内存地址。在 Java中,贯穿阶段是运行时动态完成的。

当 Java 类文献编译时,总计变量和方法的援用都被当做标志援用存储在这个类的常量池中。标志援用是一个逻辑援用,实质上并不指向物理内存地址。JVM 不错遴荐标志援用领会的时机,一种是当类文献加载并校验通事后,这种领会形态被称为饥饿形态。另外一种是标志援用在第一次使用的时候被领会,这种领会形态称为惰性形态。不管奈何 ,JVM 必须要在第一次使用标志援用时完成领会并抛出可能发生的领会失实。绑定是将对象域、方法、类的标志援用替换为径直援用的经过。绑定只会发生一次。一朝绑定,标志援用会被完竣替换。若是一个类的标志援用还莫得被领会,那么就会载入这个类。每个径直援用都被存储为相对于存储结构(与运行时变量或方法的位置关系联的)偏移量。

线程间分享

堆被用来在运行时间拨类实例、数组。不行在栈上存储数组和对象。因为栈帧被策画为创建以后无法调治大小。栈帧只存储指向堆中对象或数组的援用。与局部变量数组(每个栈帧中的)中的原始类型和援用类型不同,对象老是存储在堆上以便在方法扫尾时不会被移除。对象只可由垃圾回收器移除。

为了撑持垃圾回收机制,堆被分为了底下三个区域:

更生代 时时被分为 Eden 和 Survivor 老年代 永恒代

内存处置

对象和数组恒久不会显式回收,而是由垃圾回收器自动回收。时时,经过是这么的:

新的对象和数组被创建并放入老年代。 Minor垃圾回收将发生在更生代。依旧存活的对象将从 eden 区移到 survivor 区。 Major垃圾回收一般会导致诓骗进度暂停,少妇护士下面好紧, 影音先锋亚洲熟女AV网丰满人妻国产在线, 老女肥熟av免费观看夹在两个男人中间,前面一根后面三根将在三个区内出动对象。仍然存活的对象将被再行生代出动到老年代。 每次进行老年代回收时也会进行永恒代回收。少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根们之中任何一个变满时,都会进行回收。

非堆内存

非堆内存指的是那些逻辑上属于 JVM 一部分对象,但实质上不在堆上创建。

非堆内存包括: 永恒代,包括: 方法区 驻留字符串(interned strings)

代码缓存(Code Cache):用于编译和存储那些被 JIT 编译器编译成原生代码的方法。

即时编译(JIT)

Java 字节码是诠释实行的,然而莫得径直在 JVM 宿主实行原生代码快。为了普及性能,Oracle Hotspot 杜撰契机找到实行最频繁的字节码片断并把少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根们编译成原盼望器码。编译出的原盼望器码被存储在非堆内存的代码缓存中。通过这种方法,Hotspot 杜撰机将衡量底下两种本事破费:将字节码编译本钱地代码需要的稀罕本事和诠释实行字节码破费更多的本事。

方法区

方法区存储了每个类的信息美女把尿口扒开让男人桶,比如:

Classloader 援用 运行不时量池 数值型常量 字段援用 方法援用 属性 字段数据 字段名 类型 修饰符 属性(Attribute) 针对每个字段的信息 方法数据 方法名 复返值类型 参数类型(按轨则) 修饰符 属性 每个方法 方法代码 字节码 操作数栈大小 局部变量大小 局部变量表 极度表 每个极度处理器 脱手点 扫尾点 极度处理代码的方法计数器(PC)偏移量 被拿获的极度类对应的常量池下标 每个方法

总计线程分享消亡个方法区,因此走访方法区数据的和动态贯穿的进度必须线程安全。若是两个线程试图走访一个还未加载的类的字段或方法,必须只加载一次,而且两个线程必须等少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根加载已矣智商接续实行。

类文献结构

一个编译后的类文献包含底下的结构:

 

JVM内幕:Java杜撰机详解

 

 

JVM内幕:Java杜撰机详解

 

不错用 javap 检讨编译后的 java class 文献字节码。

若是你编译底下这个简短的类:

第一步,用两手的大拇指和食指,抓住左右耳尖用力往上提30下;

当发生便祕排便困难时,家人先用热水泡一盆肥皂氺,患者移屁股至盆内以热肥皀氺熏洗屁股,几分钟后,就会觉得便意暂时消失,趁机擦干屁股,抓紧扶到床上侧卧或扒卧,此时,家人可将开塞露一支挤入患者肛门內。静卧5-10分钟,患者定觉便意浓浓,急赶入厕,则便会痛快排出,顿觉全身轻松舒服至极。

package org.jvminternals; public class SimpleClass {  public void sayHello() {  System.out.println("Hello");  } } 

运行底下的号令,就不错得回底下的落幕输出: javap -v -p -s -sysinfo -constants classes/org/jvminternals/SimpleClass.class。

 

JVM内幕:Java杜撰机详解

 

 

JVM内幕:Java杜撰机详解

 

这个 class 文献展示了三个主要部分:常量池、构造器方法和 sayHello 方法。

常量池:提供了时时由标志表提供的相通信息,禁绝形容见下文。 方法:每一个方法包含四个区域,A级毛片免费观看片 签名和走访标签 字节码 LineNumberTable:为调试器提供源码中的每一瞥对应的字节码信息。上头的例子中,Java 源码里的第 6 行与 sayHello 函数字节码序号 0 关系,第 7 行与字节码序号 8 关系。 LocalVariableTable:列出了总计栈帧中的局部变量。上头两个例子中,独一的局部变量等于 this。

这个 class 文献用到底下这些字节码操作符:

 

JVM内幕:Java杜撰机详解

 

跟任何典型的字节码通常,操作数与局部变量、操作数栈、运行不时量池的主要交互如下所示。

构造器函数包含两个教导。率先,this 变量被压栈到操作数栈,然后父类的构造器函数被调用,而这个构造器会消费 this,之后 this 被弹出操作数栈。

 

JVM内幕:Java杜撰机详解

 

sayHello() 方法愈加复杂,正如之前诠释的那样,因为少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根需要用运行不时量池中的指向标志援用的实在援用。第一个操作码 getstatic 从System类中将out静态变量压到操作数栈。下一个操作码 ldc 把字符串 “Hello” 压栈到操作数栈。临了 invokevirtual 操作符会调用 System.out 变量的 println 方法,从操作数栈作弹出”Hello” 变量手脚 println 的一个参数,并在现时哨程蛊卦一个新栈帧。

 

JVM内幕:Java杜撰机详解

 

类加载器

JVM 启动时会用 bootstrap 类加载器加载一个运滚动类,然后这个类会在public static void main(String[])调用之前完成贯穿和运滚动。实行这个方法会实行加载、贯穿、运滚动需要的稀罕类和接口。

加载(Loading)是这么一个经过,找到代表这个类的 class 文献或把柄特定的名字找到接口类型,然后读取到一个字节数组中。接着,这些字节会被领会老师少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根们是否代表一个 Class 对象并包含正确的 major、minor 版块信息。径直父类的类和接口也会被加载进来。这些操作一朝完成,类八成接口对象就从二进制示意中创建出来了。

贯穿(Linking)是校验类或接口并准备类型和父类父接口的经过。贯穿经过包含三步:校验(verifying)、准备(preparing)、部分领会(optionally resolving)。

校验会阐述类八成接口示意是否结构正确,以及是否遵命 Java 谈话和 JVM 的语义条目,比如会进行底下的查验:

形势一致且形势化正确的标志表 final 方法和类莫得被重载 方法遵命走访限制关节词 方法参数的数目、类型正确 字节码莫得欠妥的操作栈数据 变量在读取之前被运滚动过 变量值的类型正确

在考据阶段做这些查验意味着不需要在运行阶段做这些查验。贯穿阶段的查验降速了类加载的速率,然而少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根幸免了实行这些字节码时的屡次查验。

准备经过包括为静态存储和 JVM 使用的数据结构(比如方法表)分拨内存空间。静态变量创建并运滚动为默许值,然而运滚动代码不在这个阶段实行,因为这是运滚动经过的一部分。

领会是可选的阶段。少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根包括通过加载援用的类和接口来查验这些标志援用是否正确。若是不是发生在这个阶段,标志援用的领会要比及字节码教导使用这个援用的时候才会进行。

类八成接口运滚动由类或接口运滚动方法的实行构成。

 

JVM内幕:Java杜撰机详解

 

JVM 中有多个类加载器,分饰不同的变装。每个类加载器由少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根的父加载器加载。bootstrap 加载器除外,少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根是总计最顶层的类加载器。

Bootstrap 加载器一般由腹地代码杀青,因为少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根在 JVM 加载以后的早期阶段就被运滚动了。bootstrap 加载器细致载入基础的 Java API,比如包含 rt.jar。少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根只加载领有较高信任级别的启动旅途下找到的类,因此跳过了许多普通类需要做的校验责任。 Extension 加载器加载了圭臬 Java 膨胀 API 中的类,比如 security 的膨胀函数。 System 加载器是诓骗的默许类加载器,比如从 classpath 中加载诓骗类。 用户自界说类加载器也不错用来加载诓骗类。使用自界说的类加载器有许多特殊的原因:运行时从新加载类八成把加载的类分隔为不同的组,典型的用法比如 web 工作器 Tomcat。

 

JVM内幕:Java杜撰机详解

 

加快类加载

分享类数据(CDS)是Hotspot JVM 5.0 的时候引入的新特点。在 JVM 装配经过中,装配进度会加载一系列中枢 JVM 类(比如 rt.jar)到一个分享的内存映射区域。CDS 减少了加载这些类需要的本事,普及了 JVM 启动的速率,允许这些类被不同的 JVM 实例分享,同期也减少了内存破费。

方法区在那边

The Java Virtual Machine Specification Java SE 7 Edition 中写得很了了:“尽管方法区逻辑上属于堆的一部分,简短的杀青不错遴荐不合少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根进行回收和压缩。”。Oracle JVM 的 jconsle 显露方法区和 code cache 区被当做为非堆内存,而 OpenJDK 则显露 CodeCache 被当做 VM 中对象堆(ObjectHeap)的一个安祥的域。

Classloader 援用

总计的类加载之后都包含一个加载本人的加载器的援用,反过来每个类加载器都包含少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根们加载的总计类的援用。

运行不时量池

JVM 惊奇了一个按类型划分的常量池,一个访佛于标志表的运行时数据结构。尽管少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根包含更大批据。Java 字节码需要数据。这个数据时时因为太大不行径直存储在字节码中,改步改玉的是存储在常量池中,字节码包含这个常量池的援用。运行不时量池被用来上头先容过的动态贯穿。

常量池中不错存储多种类型的数据:

数字型 字符串型 类援用型 域援用型 方法援用

示例代码如下:

Object foo = new Object(); 

写成字节码将是底下这么:

0: new #2 // Class java/lang/Object 1: dup 2: invokespecial #3 // Method java/ lang/Object "<init>"( ) V 

new 操作码的后头紧随着操作数 #2 。这个操作数是常量池的一个索引,示意少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根指向常量池的第二个实体。第二个实体是一个类的援用,这个实体反过来援用了另一个在常量池中包含 UTF8 编码的字符串类名的实体(// Class java/lang/Object)。然后,这个标志援用被用来寻找 java.lang.Object 类。new 操作码创建一个类实例并运滚动变量。新类实例的援用则被添加到操作数栈。dup 操作码创建一个操作数栈顶元素援用的稀罕拷贝。临了用 invokespecial 来调用第 2 行的实例运滚动方法。操作码也包含一个指向常量池的援用。运滚动方法把操作数栈出栈的顶部援用当做此方法的一个参数。临了这个新对象只好一个援用,这个对象照旧完成了创建及运滚动。

若是你编译底下的类:

package org.jvminternals; public class SimpleClass {    public void sayHello() {  System.out.println("Hello");  }   } 

生成的类文献常量池将是这个样式:

 

JVM内幕:Java杜撰机详解

 

这个常量池包含了底下的类型:

 

JVM内幕:Java杜撰机详解

 

极度表

极度表像这么存储每个极度处理信息:

肇端点(Start point) 扫尾点(End point) 极度处理代码的 PC 偏移量 被拿获极度的常量池索引

若是一个方法有界说 try-catch 八成 try-finally 极度处理器,那么就会创建一个极度表。少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根为每个极度处理器和 finally 代码块存储必要的信息,包括处理器粉饰的代码块区域和处理极度的类型。

当方法抛出极度时,JVM 会寻找匹配的极度处理器。若是莫得找到,那么方法会立即扫尾并弹出现时栈帧,这个极度会被从新抛到调用这个方法的方法中(在新的栈帧中)。若是总计的栈帧都被弹出还莫得找到匹配的极度处理器,那么这个线程就会闭幕。若是这个极度在临了一个非看护进度抛出(比如这个线程是干线程),那么也有会导致 JVM 进度闭幕。

Finally 极度处理器匹配总计的极度类型,且不管什么极度抛出 finally 代码块都会实行。在这种情况下,当莫得极度抛出时,finally 代码块照旧会在方法临了实行。这种靠在代码 return 之前跳转到 finally 代码块来杀青。

标志表

除了按类型来分的运行不时量池,Hotspot JVM 在永恒代还包含一个标志表。这个标志表是一个哈希表,保存了标志指针到标志的映射关系(也等于 Hashtable

援用计数被用来限制一个标志从标志表从移除的经过。比如当一个类被卸载时,少妇护士下面好紧,丰满人妻国产在线,夹在两个男人中间,前面一根后面三根领有的在常量池中总计标志的援用计数将减少。当标志表中的标志援用计数为 0 时,标志表会以为这个标志不再被援用,将从标志表中卸载。标志表和后头先容的字符串表都被保存在一个门径化的结构中,以便普及成果并保证每个实例只出现一次。

字符串表

Java 谈话门径条目相通的(即包含相通序列的 Unicode 指针序列)字符串字面量必须指向相通的 String 实例。除此之外,在一个字符串实例上调用 String.intern() 方法的复返援用必须与字符串是字面量时的通常。因此,底下的代码复返 true:

("j" + "v" + "m").intern() == "jvm" 

Hotspot JVM 中 interned 字符串保存在字符串表中。字符串表是一个哈希表,保存着对象指针到标志的映射关系(也等于Hashtable

当类加载时,字符串字面量被编译器自动 intern 并加入到标志表。除此之外,String 类的实例不错调用 String.intern() 显式地 intern。当调用 String.intern() 方法时美女把尿口扒开让男人桶,若是标志表照旧包含了这个字符串,那么就会复返标志内外的这个援用,若是不是,那么这个字符串就被加入到字符串表中同期复返这个援用。



    热点资讯

    相关资讯