虚拟机

Java内存区域

耗尽温柔 提交于 2020-03-09 05:15:53
运行时数据区域: 程序计数器 : 通过改变计数器的值来选取下一条字节码指令,为了线程切换后能恢复到正确的执行位置,每条线程都有一个独立的程序计数器,即“线程私有”如果线程执行的是Java方法,那么计数器记录的是正在执行的虚拟机字节码指令的地址,如果是native方法,则计数器的值为空,此区域没有OutOfMemoryError情况。 Java虚拟机栈 : 线程私有,描述Java方法执行的内存模型,每个方法都会创建栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等。。方法调用直至完成,对应栈帧入栈到出栈。局部变量表内存空间在编译期间完成分配,运行期间不会改变其大小。线程请求栈的深度大于所允许的深度,则抛出StackOverflowError异常;如果扩展时无法申请到足够的内存,就抛出OutOfMemoryError异常。 设置本地方法栈大小-Xoss(其实无效,应使用后面的),栈容量只由-Xss设定。 单个线程下,抛出的都是StackOverflowError。 如果是建立过多线程导致的内存溢出,可以通过减少最大堆和减少栈容量(每个线程被分配到的栈大小)来换取更多的线程。 本地方法栈 : 执行Native方法,会有StackOverflowError和OutOfMemoryError异常。 Java堆 : jvm中最大的一块,线程共享,唯一目的是存放对象实例

面试题之JVM内存区域

余生颓废 提交于 2020-03-09 05:15:40
1、Java内存区域(运行时数据区域):   jdk1.8之前:虚拟机运行内存分栈、堆和方法区这几种。 栈:虚拟机栈、本地方法栈、程序计数器。(线程私有,每个线程都拥有各自的) 程序计数器:一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。主要有2个作用: 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪里了。 注意:唯一一个不会出现OutOfMemoryError的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。 Java虚拟机栈:生命周期与线程相同(随着线程创建而创建,随着线程死亡而死亡),描述的是Java方法执行的内存模型,每次方法调用的数据都是通过栈传递的。Java内存大概就是堆内存和栈内存,栈是虚拟机栈或是虚拟机栈中局部变量表部分。(实际上,Java虚拟机栈是由一个个栈帧组成,每个栈帧中都拥有:局部变量表、操作数、动态链接、方法出口信息) 局部变量表主要存放了编译器可知的各种数据类型 (boolean、byte、char、short、int、float、long、double)、 对象引用 (reference类型,不同于对象本身,可能是指向一个代表对象起始地址的引用指针

Java内存解析

心已入冬 提交于 2020-03-09 03:06:49
内存解析: . 堆(Heap): 此内存区域的唯一目的就是存放 对象实例 ,几乎所有的对象实例都在这里分配内存。 这一点在 Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。 栈(Stack): 是指虚拟机栈。虚拟机栈用于存储 局部变量 等。 方法区(Method Area): 用于存储 已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码 等数据。 . 若有不当之处,欢迎指正! 来源: CSDN 作者: 懵懂的kk 链接: https://blog.csdn.net/qq_42653576/article/details/104729147

JVM内存模型

我的梦境 提交于 2020-03-09 01:01:39
JVM的内存划分: 方法区: 是线程共享的,常量静态变量的JIT(即时编译器)编译后代码也在方法区存放。用来 存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。 虽然Java虚拟机规范把方法区描述为堆得一个逻辑部分,但是他却有个别名Non-Heap(非堆),目的是为了与Java堆区分。 堆内存: 是 线程共享的,垃圾回收的主要场所 。Java虚拟机所管理的 内存最大的一块 ,在 虚拟机启动时创建。 此内存区域的 唯一目的就是存放对象实例 (也就是new出来的),几乎所有的对象实例以及数组都在这里分配。Java堆是垃圾收集管理器的主要区域,因此也被称作GC堆。 程序计数器: 当前线程执行的字节码的位置指示器。是一块较小的内存空间,可以看做是 当前线程所执行的符号指示器。 两个主要作用: 字节码解释器通过改变程序计数器来一次读取指令,从而实现代码的流程控制,如:顺序执行,选择,循环,异常处理。 在多线程的情况下,程序计数器用于记录当前程序执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行的位置。 注意: 程序计数器是 唯一一个不会出现OutOfMemoryError的内存区域 ,他的生命周期随着现成的创建而创建,随着线程的结束而死亡。 Java虚拟机(栈内存): 保存局部变量,基本数据类型以及堆内存中对象的引用变量。是线程私有的

JVM,DVM虚拟机

允我心安 提交于 2020-03-09 00:44:59
Java虚拟机–JVM,类加载器,双亲委派 https://www.iteye.com/blog/welcome66-2216572 1、JVM(Java Virtual Machine),java虚拟机 JVM就是虚拟出来的计算机,有自己完善的架构,处理器,堆栈,寄存器,指令系统。使用jvm就是为了支持与操作系统无关,java跨平台的原理,因为java代码都在这上运行, .java 文件通过javac命令编译后生成. class 字节码文件,JVM的java解释器负责把.class字节码文件转化为特定的机器码文件运行。 1.进程级别,守护线程和非守护线程(用户线程) 守护线程:后台线程,为前台线程提供便利服务,比如GC线程。不要在守护线程中执行业务逻辑操作(比如对数据的读写等)。 非守护线程:前台线程 设置守护线程: public final void setDaemon ( boolean on ) 判断守护线程: public final boolean isDaemon ( ) 2.生命周期: 启动:启动java是开启,起点是public static void main 运行:main起点,两种线程:守护线程(JVM),非守护线程(JAVA),java也可以创建自己的守护线程 消亡:程序终止则退出,也可以用System.exit或Runtime类来退出 3.体系结构

QEMU,KVM及QEMU-KVM介绍

假如想象 提交于 2020-03-08 23:48:22
What's QEMU QEMU是一个主机上的VMM(virtual machine monitor),通过动态二进制转换来模拟CPU,并提供一系列的硬件模型,使guest os认为自己和硬件直接打交道,其实是同QEMU模拟出来的硬件打交道,QEMU再将这些指令翻译给真正硬件进行操作。通过这种模式,guest os可以和主机上的硬盘,网卡,CPU,CD-ROM,音频设备和USB设备进行交互。但由于所有指令都需要经过QEMU来翻译,因而性能会比较差: What's KVM? KVM实际是linux内核提供的虚拟化架构,可将内核直接充当hypervisor来使用。KVM需要处理器硬件本身支持虚拟化扩展,如intel VT 和AMD AMD-V技术。KVM自2.6.20版本后已合入主干并发行,除此之外,还以模块形式被移植到FreeBSD和illumos中。除了支持x86的处理器,同时也支持S/390,PowerPC,IA-61以及ARM等平台。 工作原理 KVM包含一个内核模块kvm.ko用来实现核心虚拟化功能,以及一个和处理器强相关的模块如kvm-intel.ko或kvm-amd.ko。KVM本身不实现任何模拟,仅仅是暴露了一个/dev/kvm接口,这个接口可被宿主机用来主要负责vCPU的创建,虚拟内存的地址空间分配,vCPU寄存器的读写以及vCPU的运行。有了KVM以后,guest

KVM之CPU虚拟化

做~自己de王妃 提交于 2020-03-08 22:21:27
1.1 为什么要虚拟化CPU 虚拟化技术是指在x86的系统中,一个或以上的客操作系统(Guest Operating System,简称:Guest OS)在一个主操作系统(Host Operating System,简称:Host OS)下运行的一种技术。这种技术只要求对客操作系统有很少的修改或甚至根本没有修改。x86处理器架构起先并不满足波佩克与戈德堡虚拟化需求(Popek and Goldberg virtualization requirements),这使得在x86处理器下对普通虚拟机的操作变得十分复杂。在2005年与2006年,英特尔与AMD分别在它们的x86架构上解决了这个问题以及其他的虚拟化困难。 1.2 关于CPU的Ring0、Ring1··· ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之…… 拿Linux+x86来说, 操作系统(内核)的代码运行在最高运行级别ring0上,可以使用特权指令,控制中断、修改页表、访问设备等等。 应用程序的代码运行在最低运行级别上ring3上,不能做受控操作。如果要做,比如要访问磁盘,写文件,那就要通过执行系统调用(函数),执行系统调用的时候,CPU的运行级别会发生从ring3到ring0的切换,并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问

OpenStack入门之核心组件梳理(2)——Nova篇

浪子不回头ぞ 提交于 2020-03-08 22:20:22
OpenStack入门之核心组件梳理(2)——Nova篇 前言 ​ 上篇文章我们从概念到原理,层层递进深入讲述了Keystone项目,而本文旨在继续介绍OpenStack核心组件之一的Nova组件项目。 ​ 相对于Keystone项目,Nova项目是作为OpenStack这个大开源项目最早也是最成熟的项目,从这一层面上也体现出Nova项目所提供的计算服务从始至终都是OpenStack最为核心的部分,笔者在之前的文章中谈到OpenStack这一开源项目所提供和管理的三大资源就是计算、网络和管理。这同样也是云计算的核心部分。 ​ 从笔者个人理解和观点来看的话,对于OpenStack而言,其真正的灵魂(可以理解为OpenStack中组件的复杂程度、使用概率以及故障出现概率等方面)一是在于宏观(这里“宏观的意思是相对早期版本的OpenStack平台而言”)的Nova(计算服务),二是在于相对其他服务最为复杂的Neutron网络服务(之后的文章也会针对该组件进行详细介绍),这里不包括CEPH分布式存储,因为CEPH本身就是可以认为是一个独立的大项目,其作用不仅仅是OpenStack中Swift(对象存储服务)的高效分布式集群存储的替代,还包括与其他技术的结合和支持等作用。但是无论在实验环境还是生产环境部署OpenStack云平台基本上选择CEPH作为分布式存储服务,当然在此个人补充一下

虚拟机与主机不能ping通

人走茶凉 提交于 2020-03-08 19:56:22
其实我是想记录下虚拟机的虚拟网络配置的,毕竟配置虚拟网络十分重要,只看网上的教程,但是不明白是什么意思也是很无奈,下次出了问题还是只能没有头绪地百度。 我先给出步骤,然后再解释具体的每一步什么意思。 1)修改物理机的IP 首先,我们按win + e键调出我的电脑,然后找到”网络”,右键=>属性=>更改适配器设置。如果主机和虚拟机使用NAT模式联网的话,那么我们走的是VMware8。然后呢,右键VMware8=>属性=>ipV4。此时,192.168.33.1是我们主机的ip地址。我们在cmd运行框中输入ipconfig,可以查出我们与虚拟机通信的VMware8中的主机ip地址。 2)修改虚拟机的网络,自己设置虚拟机IP 先打开VMware,编辑->虚拟网络编辑器 打开之后你看到的按钮什么的应该是不可编辑的状态,点右下角更改设置,给足权限。 然后网络类型选择VMnet8,NAT模式,然后打开图中标识的红色NAT设置。 可以自己设置网关,我这里设置为192.168.33.2,点击确定。 返回主页面点击NAT下面的DHCP设置,这里可以设置虚拟机的IP地址范围,注意只改后边的数字就可以可以了,前边的192.168.33.X要和网关的IP一致。 配置好网络之后我们再来修改下虚拟机的IP地址,vi /etc/sysconfig/network-scripts/ifcfg-eth0

我的面试经之JVM(一)JVM简述

穿精又带淫゛_ 提交于 2020-03-08 18:40:16
Java 跨平台语言 JVM 跨语言平台 Java进化史: 虚拟机:Virtual Machine,对硬件进行模拟的软件,虚拟的计算机 Java虚拟机:执行Jvm字节码的虚拟计算机,是二进制字节码的运行环境 JVM的位置 jvm整体结构 方法区和堆,多个线程共享 Java栈(又叫虚拟机栈),本地方发栈,程序计数器这三个每个线程独有一份 【运行时数据区是单例的,一个虚拟机一个】 【hotspot 才有方法区,其他两大商用虚拟机没有【HotSpot,JRocket,J9】】 class files前边是编译器前端 执行引擎相当于编译器后端 java代码执行流程 第一次编译,把java源文件编译成字节码.class文件,第二次编译JIT编译器把.class文件编译成机器指令文件,并且缓存到方法区 JVM架构模型 指令集架构分为两种,基于栈的指令集架构,基于寄存器的指令集架构 两种指令集架构区别 基于栈式架构的特点:   设计和实现简单【每执行一个方法,就进行一次入栈的操作】,适用于资源受限的系统(eg:嵌入式)   避开了寄存器的分配难题;使用零地址指令分配方式   指令流中的指令大比分是零地址指令,其执行过程依赖于操作栈,指令集更小,编译器容易实现   不需要硬件实现,可以执性更好,更好实现跨平台 基于寄存器架构的特点:   典型的是x86的二进制指令集