虚拟机

类文件结构

北城余情 提交于 2020-02-17 06:46:55
1. 概述   计算机只认识0和1,所以我们写的程序需要经过编译器翻译成0和1构成的二进制格式才能由计算机执行,现在越来越多的程序语言选择了与操作系统和机器指令集无关的、平台中立的格式作为程序编译后的存储格式。各种不同平台的虚拟机与所有平台都统一使用的程序存储格式--字节码,是构成平台无关性的基石。同时Java虚拟机也在发展语言无关性,目前java虚拟机之上可以运行的语言有:Clojure、Groovy、JRuby、Jython和Scala等。实现语言无关性的基础仍然是虚拟机和字节码存储格式,java虚拟机不和包括java在内的任何语言绑定,它只和“Class文件“这种特定的二进制文件格式所关联,Class文件中包含了java虚拟机指令集和符号表以及若干辅助信息。Class文件是java虚拟机执行引擎的数据入口。 2.Class类文件的结构   Class文件是一组以8位字节为基础单位的二进制流。Class文件只有2种数据类型:无符号数和表。   无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成的字符串值。   表是由多个无符号数或者其它表作为数据项构成的复合数据类型。   (1) 魔数与Class文件的版本    

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 加载到

Docker入门

蓝咒 提交于 2020-02-16 23:25:19
文章目录 1、Docker简介 Docker简介 Docker的应用场景 Docker的架构 Docker 的优点 1、简化程序: 2、避免选择恐惧症: 3、节省开支: Docker 和虚拟机的区别 2、Centos7安装Docker 3、阿里云镜像仓库配置 1、Docker简介 Docker简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。 Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。 Docker官网:https://www.docker.com/ Docker的应用场景 Web 应用的自动化打包和发布。 自动化测试和持续集成、发布。 在服务型环境中部署和调整数据库或其他的后台应用。 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。 Docker的架构 Docker 使用客户端-服务器

学习<offer>笔记3

て烟熏妆下的殇ゞ 提交于 2020-02-16 19:44:39
JVM的内存区域 JVM的内存区域分为线程私有区域和线程共有区域,私有区域分为程序计数器,虚拟机栈、本地方法区、线程私有域的生命周期与线程相同,随线程的启动而创建,随线程的结束而结束,JVM中,每个线程都与操作系统的本地线程直接映射。线程共有区域分为堆、方法区。线程共有域随虚拟机的启动而创建,随虚拟机的关闭而销毁。 程序计数器 是一块很小的内存空间,作用是存储当前运行的线程所执行的字节码的行号指示器,每个线程都有一个独立的程序计数器,在方法执行时,该方法的程序计数器吉利的是实时虚拟机字节码指令的地址, 虚拟机栈 记录Java方法的执行过程,在当前栈中存储局部变量,操作数栈,动态链接,方法出口等信息,同时存储部分的运行时的数据机器数据结构,处理动态方法的链接方法的返回值和异常分派。在执行方法时虚拟机会创建一个与之对应的栈帧,方法的执行和方法的返回与虚拟机中的入栈和出栈对应。 本地方法区 本地方法区与虚拟机栈的作用类似,区别是虚拟机栈执行的是java方法,本地方法区执行Native方法 堆 在JVM运行过程中创建的对象和产生的数据都被存储在堆中,线程共享区域,也是垃圾回收器进行回收的最主要的区域, 方法区 作用是存储常量、静态变量、类信息、即时编译器编译后的机器码,运行常量池等数据 常量、静态变量都被存储在运行时常量池中,是方法区的一部分,在类信息文件中不但保存了类的版本,字段,方法

Win10系统采用虚拟机安装Ubuntu18.04进行NS3开发环境配置

给你一囗甜甜゛ 提交于 2020-02-16 15:36:38
VMware15 pro安装 下载后注册码 VG5HH-D6E04-0889Y-QXZET-QGUC8 网易Ubuntu镜像 选择ubuntu-18.04.4-desktop-amd64.iso VMware安装Ubuntu18.04 在Win10上配置VMware并安装Ubuntu 安装NS3依赖库 肯定有部分依赖包会配置不成功的, 该文档 指出各依赖库作用,部分没装上就可以不管 配置Java环境jdk sudo apt install openjdk-11-jre-headless [Oracle官网JDK下载页] https://www.oracle.com/java/technologies/javase-jdk13-downloads.html JDK下载镜像 下载该压缩文件jdk-13_linux-x64_bin.tar.gz cd /usr/local sudo mkdir java cd java sudo cp /mnt/hgfs/VMWare_Share/jdk-13_linux-x64_bin.tar.gz ./ sudo tar -zxvf jdk-13_linux-x64_bin.tar.gz 修改环境变量 sudo ./bin/jlink --module-path jmods --add-modules java.desktop --output

趣谈Linux操作系统学习笔记-内存管理(25讲)--内存映射上

时光总嘲笑我的痴心妄想 提交于 2020-02-16 13:49:06
mmap 的原理 每一个进程都有一个列表 vm_area_struct 1 struct mm_struct { 2 struct vm_area_struct *mmap; /* list of VMAs */ 3 ...... 4 } 5 6 7 struct vm_area_struct { 8 /* 9 * For areas with an address space and backing store, 10 * linkage into the address_space->i_mmap interval tree. 11 */ 12 struct { 13 struct rb_node rb; 14 unsigned long rb_subtree_last; 15 } shared; 16 17 /* 18 * A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma 19 * list, after a COW of one of the file pages. A MAP_SHARED vma 20 * can only be in the i_mmap tree. An anonymous MAP_PRIVATE, stack 21 * or brk vma (with NULL

JDK JRE JVM

淺唱寂寞╮ 提交于 2020-02-16 13:08:58
使用java很久,但是一直不清楚JDK,JRE,JVM直接的关系,今天特地梳理一下。 JDK:Java Development ToolKit(Java开发工具包),JDK是整个JAVA的核心,包括Java运行环境(Java Runtime Environment),一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。 最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了属于自己的JDK,例如国外IBM公司开发了属于自己的JDK,国内淘宝也开发了属于自己的JDK,各个组织开发自己的JDK都是为了在某些方面得到一些提高,以适应自己的需求,比如IBM的JDK据说运行效率就比SUN的JDK高的多。但不管怎么说,我们还是需要先把基础的Sun JDK掌握好。 JDK有以下三种版本: J2SE,standard edition,标准版,是我们通常用的一个版本; J2EE,enterpsise edtion,企业版,使用这种JDK开发J2EE应用程序; J2ME,micro edtion,主要用于移动设备、嵌入式设备上的java应用程序。 我们常常用JDK来代指Java API,Java API是Java的应用程序接口,其实就是前辈们写好的一些java Class,包括一些重要的语言结构以及基本图形

关于 JDK jre jvm

∥☆過路亽.° 提交于 2020-02-16 12:56:23
JDK 全名是 JAVA development kit 是JAVA语言的软件开发工具 包;是整个JAVA开发的核心,没有JDK的话,无法编译Java程序,如果想只运行Java程序,要确保已安装相应的JRE。 JDK包含的基本组件包括: javac – 编译器,将源程序转成字节码; jar – 打包工具,将相关的类文件打包成一个文件; javadoc – 文档生成器,从源码注释中提取文档; jdb – debugger,查错工具; java – 运行编译后的java程序(.class后缀的); java.lang 这个是系统的基础类,比如String等都是这里面的,这个包是唯一一个可以不用引入(import)就可以使用的包。 java.io: 这里面是所有输入输出有关的类,比如文件操作等。 java.nio:为了完善io包中的功能,提高io包中性能而写的一个新包 ,例如NIO非堵塞应用 java.net: 这里面是与网络有关的类,比如URL,URLConnection等。 java.util: 这个是系统辅助类,特别是集合类Collection,List,Map等。java.spl: 这个是数据库操作的类,Connection, Statement,ResultSet等。 javax.servlet:这个是JSP,Servlet等使用到的类。 jre: JRE(Java

云架构师进阶攻略

独自空忆成欢 提交于 2020-02-16 07:56:15
https://mp.weixin.qq.com/s/tHRl5OQHY2mNXqKwACCVWw?utm_source=tuicool&utm_medium=referral 一、架构的三个维度和六个层面 1.1、三大架构 在互联网时代,要做好一个合格的云架构师,需要熟悉三大架构。 第一个是IT架构,其实就是计算,网络,存储。这是云架构师的基本功,也是最传统的云架构师应该首先掌握的部分,良好设计的IT架构,可以降低CAPEX和OPEX,减轻运维的负担。数据中心,虚拟化,云平台,容器平台都属于IT架构的范畴。 第二个是应用架构,随着应用从传统应用向互联网应用转型,仅仅搞定资源层面的弹性还不够,常常会出现创建了大批机器,仍然撑不住高并发流量。因而基于微服务的互联网架构,越来越成为云架构师所必需的技能。良好设计的应用架构,可以实现快速迭代和高并发。数据库,缓存,消息队列等PaaS,以及基于SpringCloud和Dubbo的微服务框架,都属于应用架构的范畴。 第三个是数据架构,数据成为人工智能时代的核心资产,在做互联网化转型的同时,往往进行的也是数字化转型,并有战略的进行数据收集,这就需要云架构师同时又大数据思维。有意识的建设统一的数据平台,并给予数据进行数字化运营。搜索引擎,Hadoop,Spark,人工智能都属于数据架构的范畴。 1.2、六个层面 上面的三个维度是从人的角度出发的

Java-内存区域

一曲冷凌霜 提交于 2020-02-16 06:38:09
对于Java程序员来说,在虚拟机的自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,而且不容易出现内存泄漏和内存溢出问题,看起来由虚拟机管理内存一切都很美好。不过,也正是因为Java程序员把内存控制的权力交给了Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那排查错误将会成为一项异常艰难的工作。 ————《深入浅出Java虚拟机》 程序计数器Program Counter Register 程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号解释器。 在虚拟机的概念模型中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行 一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“ 线程私有 ”的内存。 Java虚拟机栈Java Virtual Machine Stacks Java虚拟机栈也是 线程私有 的