符号计算

JVM的类加载机制全面解析

大兔子大兔子 提交于 2019-12-06 11:39:53
什么是类加载机制 JVM把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被JVM直接使用的Java类型,这就是JVM的类加载机制。 如果你对Class文件的结构还不熟悉,可以参考之前的文章 Class文件结构全面解析(上) 和 Class文件结构全面解析(下) 。 欢迎关注微信公众号: 万猫学社 ,每周一分享Java技术干货。 类的生命周期 类从被加载到内存中,到被卸载出内存,一共分为以下几步: 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Resolution) 初始化(Initialization) 使用(Using) 卸载(Unloading) 类加载的全过程,包括其中的 加载 、 验证 、 准备 、 解析 、 初始化 几个阶段。 欢迎关注微信公众号: 万猫学社 ,每周一分享Java技术干货。 加载 加载是类加载的第一阶段,在这一步中JVM规范要求完成了以下三件事: 通过一个类的全限定名来获取定义这个类的二进制字节流。 将这个字节流多代表的静态存储结构转化为方法区的运行时数据结构。 在内存中生成一个代表这个类的java.lang.Class对象。 以上要求其实并不具体,JVM的具体实现和应用都是比较灵活的。比如:获取这个类的二进制字节流,并没有说从哪获取,怎么获取

C++ 第2章 变量、基本数据类型

老子叫甜甜 提交于 2019-12-06 10:58:31
/* 基本内置类型: 算术类型 空类型 位 / 比特( bit ): 0/1 字节 byte : 8 个二进制位(计算机存储信息的基本单位)即 8 比特 / 位 字 word : 若干个字节组成一个字(可以存放一条计算机指令或数据) 字长 word size : CPU 中每个字包含的二进制的长度(即位数) 位 / 比特 bit: 0/1 --> 字节 byte ( 8 比特 :00000000 ) --> 字 (若干字节) 算术类型: 整型( 包含字符和布尔类型在内)和 浮点型 C++ 算术类型: 类型 含义 最小尺寸 main 返回 0 表示成功 Bool 布尔类型 未定义 真转换成 1 假转换成 0 Char 字符 8 位 即 8 个二进制位 一个字节 Wchar_t 宽字符 16 位 Char16_t Unnicode 字符 16 位 Char32_t Unicode 字符 32 位 Short 短整型 16 Int 整型 16 Long 长整型 32 Long long 长整型 64 Float (6 位有效数) 单精度浮点数 6 位有效数字 Double 双精度浮点数 10 位有效数 Long double 扩展精度浮点数 10 基本的字符类型是 char 一个 char 的空间应该确保可以存放机器基本字符集中任意字符对应的数字值。也就是说, 一个 char

在浏览器输入URL回车之后发生了什么?(超详细版)

≡放荡痞女 提交于 2019-12-06 10:57:44
前言   这个问题已经是老生常谈了,更是经常被作为面试的压轴题出现,网上也有很多文章,但最近闲的无聊,然后就自己做了一篇笔记,感觉比之前理解更透彻了。   这篇笔记是我这两天看了数十篇文章总结出来的,所以相对全面一点,但由于我是做前端的,所以会比较重点分析浏览器渲染页面那一部分,至于其他部分我会罗列出关键词,感兴趣的可以自行查阅, 注意: 本文的步骤是建立在,请求的是一个简单的 HTTP 请求,没有 HTTPS、HTTP2、最简单的 DNS、没有代理、并且服务器没有任何问题的基础上,尽管这是不切实际的。 大致流程 URL 解析 DNS 查询 TCP 连接 处理请求 接受响应 渲染页面 一、URL 解析   地址解析:     首先判断你输入的是一个合法的 URL 还是一个待搜索的关键词,并且根据你输入的内容进行自动完成、字符编码等操作。   HSTS     由于安全隐患,会使用 HSTS 强制客户端使用 HTTPS 访问页面。详见: 你所不知道的 HSTS [1] 。   其他操作     浏览器还会进行一些额外的操作,比如安全检查、访问限制(之前国产浏览器限制 996.icu)。   检查缓存      二、DNS 查询   基本步骤        1. 浏览器缓存     浏览器会先检查是否在缓存中,没有则调用系统库函数进行查询。   2. 操作系统缓存    

JAVA Class文件和类加载机制

别等时光非礼了梦想. 提交于 2019-12-06 08:44:05
1 class文件结构 Class文件结构是了解虚拟机的重要基础之一,如果想深入的了解虚拟机,Class文件结构是不能不了解的。 Class文件是一组以8位字节为基础单位的二进制流,各项数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,如果是超过8位字节以上空间的数据项,则会按照高位在前的方式(Big-Endian)分割成若干个8位字节进行存储。(Big-Endian模式具体可见 详解大端模式和小端模式 ) Class文件中包含了Java虚拟机指令集和符号表以及若干其他辅助信息。 Class文件格式只有两种数据类型:无符号数和表。 无符号数属于基本的数据类型,以u1,u2,u4,u8来分别代表1个字节,2个字节,4个字节和8个字节的无符号数;可用来描述数字,索引引用,数量值或者按照UTF-8编码构成的字符串值。 表是由 多个无符号数或者其他表作为数据项构成的复合数据类型 ,所有表都习惯性地以“_info”结尾。表用于描述由层次关系的复合结构的数据。 整个Class文件本质上就是一张表 class文件的内容中没有任何的分隔符号,所以在上表中的数据项,无论是顺序还是数量,都是被严格限定的,哪个字节代表什么含义,长度多少,先后顺序如何,都不允许改变。 1.1 魔数和class文件的版本 Class文件的头4个字节成为魔数(Magic Number)

源码,反码,补码

瘦欲@ 提交于 2019-12-06 07:13:46
原文地址: https://www.imooc.com/article/16813?block_id=tuijian_wz 我的总结:太多地方说负数的补码=反码+1,理解了这篇文章之后,发现,这仅仅是个巧合,补码和反码有关系,但是没有直接关系。 本文从原码讲起。通过简述原码,反码和补码存在的作用,加深对补码的认识。力争让你对补码的概念不再局限于: 负数的补码等于反码加一 。 接触过计算机或电子信息相关课程的同学,应该都或多或少看过补码这哥仨。每次都是在课本的最前几页,来上这么一段: 什么反码是原码除符号位,按位取反。补码等于反码加一。 然后给整得莫名其妙,稀里糊涂地,接着就是翻页,反正后面的内容也跟三码没多大关系。 我原来也是看了好几遍都没看懂。古人云:事不过三。学C语言的时候,看过一次。不懂?看《计算机基本组成原理》的时候看过,还是不懂!到了大三,上《单片微机原理与接口技术》的时候仍旧是不懂。到了期末,复习的时候,和宿舍的人瞎聊。说讲讲这些码呀,我说我也不是很清楚呀。然后就一边说怎么求码,一边算。玩着玩着,突然就明白了。我说好,打住。不说了,放假我在好好整理下思路,于是就有了这篇额。。算讨论帖吧。 好了,废话不多说。开始我们的原码,反码,补码之旅。 (一)预备知识 认识二进制,十六进制。会二进制与十进制的相互转化运算 由计算机的硬件决定,任何存储于计算机中的数据,其

Java虚拟机-类加载机制

我只是一个虾纸丫 提交于 2019-12-06 04:42:55
目录 概述 类加载的时机 加载 类加载的过程 加载 验证 准备 解析 初始化 类加载器 类与类加载器 双亲委派模型 破坏双亲委派模型 概述 虚拟机把描述类的数据从Class文件加载到内存,并且对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 编译时无需进行连接工作,类的加载、连接和初始化过程都是在程序运行期间完成的。如面向接口的应用程序可以等到运行时再指定其实际的实现类;用户可以通过预定义或者自定义的类加载器,让本地的应用程序可以在运行时从网络或者其他地方加载一个二进制流作为程序代码的一部分。 类加载的时机 类从被加载到虚拟机内存中开始,到卸载出内存为止,生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。 加载 5种情况必须立即对类进行初始化: 使用new实例化对象、读取或者设置一个类的静态字段(被final修饰在编译期以及把结果放入常量池的静态字段除外)、调用一个类的静态方法。 使用java.lang.reflect包的方法对类进行反射调用时,对应的类没有经过初始化,则需要触发其初始化。 初始化一个类时如果其父类没有初始化,则需要先触发父类的初始化

C++ 类型转换

扶醉桌前 提交于 2019-12-06 04:33:09
类型转换: 在 C++ 中, 如果两种类型相关联, 如果程序需要一种类型的运算对象时,可以用另一种关联类型的对象或值来代替。 也就是说,这两种类型可以互相转换, 即两种类型是关联的。 int ival = 3.541+ 3; 编译器会警告 运算会损失精度 。 隐式类型转换: C ++ 不会将两个数直接相加, 而是先根据类型转换规则 将对象转换成统一的类型后再求值。 隐式类型转换: 这种类型转换 是编译器 自动执行, 不需要程序员介入 。 表达式中先把 int 转换成 double , 计算结果为 double , 然后在把 double 转换成 int 赋值给变量 ival 隐式转换的情况: 下面 编译器会自动转换对象的 类型。 大多数表达式中, 比 int 小的类型首先提升成较大的整数类型 。 作为 条件 的表达式 中, 非布尔值转换成布尔值 初始化中, 如果算术运算或关系运算的对象 有 多种类型, 需要转换成同一种类型 C++ 常规类型自动类型转换规则 ( 1 )如果有一个操作数的类型是 long double ,则将另一个操作数转换为 long double 。 ( 2 )否则,如果有一个操作数的类型是 double ,则将另一个操作数转换为 double 。 ( 3 )否则,如果有一个操作数的类型是 float ,则将另一个操作数转换为 float 。 ( 4 )否则

java如何防止反编译

跟風遠走 提交于 2019-12-06 03:03:06
出处: java如何防止反编译     一些防止java代码被反编译的方法 综述(写在前面的废话)   Java从诞生以来,其基因就是开放精神,也正因此,其可以得到广泛爱好者的支持和奉献,最终很快发展壮大,以至于有今天之风光!但随着java的应用领域越来越广,特别是一些功能要发布到终端用户手中(如Android开发的app),有时候,公司为了商业技术的保密考虑,不希望这里面的一些核心代码能够被人破解(破解之后,甚至可以被简单改改就发布出去,说严重点,就可能会扰乱公司的正常软件的市场行为),这时候就要求这些java代码不能够被反编译。   这里要先说一下反编译的现象。因为java一直秉持着开放共享的理念,所以大家也都知道,我们一般共享一个自己写的jar包时,同时会共享一个对应的source包。但这些依然与反编译没有什么关系,但java的共享理念,不只是建议我们这样做,而且它自己也在底层上“强迫”我们这么做!在java写的.java文件后,使用javac编译成class文件,在编译的过程,不像C/C++或C#那样编译时进行加密或混淆,它是直接对其进行符号化、标记化的编译处理,于是,也产生了一个逆向工程的问题:可以根据class文件反向解析成原来的java文件!这就是反编译的由来。   但很多时候,有些公司出于如上述的原因考虑时,真的不希望自己写的代码被别人反编译

C Primer Plus 第3章 数据和C

断了今生、忘了曾经 提交于 2019-12-05 20:54:41
3.1示例程序 程序清单3.1 rhodium.c程序 ------ /*rhodium.c用金属铑衡量您的体重*/ #include <stdio.h> int main (void) { folat weight,value;//folat类型可以处理带有小数点的数字 printf("Are you worth you weight in rhodium? \n"); printf("Let's check it out. \n"); printf("Please enter your weight in pounds: "); scanf("%f",&weight);//%f指示scanf从键盘读取一个浮点值,&weight指定将输入值赋给名为weight的变量中; value=770*weight*14.5833; printf("Your weight in rhodium is worth $%.2f. \n",value);//%f使用.2修饰词使浮点值显示到小数点后两位; printf("You are easily worth that ! If rhodium prices drop,\n"); printf("eat more to maintain your value.\n"); return 0; } 3.2 变量与常量数据

《程序员的自我修养》读书笔记 第二章 编译和链接

戏子无情 提交于 2019-12-05 20:51:15
2.1 被隐藏了的过程 在平常的应用程序开发中一般都不需要关注编译和链接过程,因为在IDE开发环境中一般都将编译和链接合到一起一步完成,直接生成可执行文件;通常将这个过程称为 构建(Buil) 。 对于最经典的C语言版"Hello World"的代码: #include <stdio.h> int main() { printf("Hello World\n"); return 0; } 我们在Linux下使用GCC来编译该代码时,只需使用几行简单的命令就完成对上述代码的编译等一系列过程(假设源码文件名为hello.c),生成可直接运行的的程序: $gcc hello.c $./a.oout Hello World 事实上,上述过程可分解为4个步骤,分别是 预处理(preprocess) 、 编译(compilation) 、 汇编(assembly) 和 链接(linking) ,其中前三个阶段都是文本形式的处理,如下图所示: 下面分别大致介绍下各个步骤的作用。 预编译 预编译过程主要处理那些源代码文件中以“#”开始的预编译指令。比如“#include”、“#define”等,常见的处理规则如下: 将所有的“#define”删除,并且展开所有的宏定义。 处理所有条件预编译指令,比如“#if”、“#ifdef”、“#endif”等。 处理“#include”预编译指令