内存类型

JVM内存模型和面试题解析

我怕爱的太早我们不能终老 提交于 2019-12-21 04:10:55
一、JVM运行时区域      其中,      线程私有的:程序计数器,虚拟机栈,本地方法栈      线程共享的:堆,方法区,直接内存 1 程序计数器   程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完。   java虚拟机的多线程是通过线程轮流切换并分配CPU的时间片的方式实现的,因此在任何时刻一个处理器(如果是多核处理器,则只是一个核)都只会处理一个线程,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,因此这类内存区域为“线程私有”的内存。   从上面的介绍中我们知道程序计数器主要有两个作用: 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。   注意: 程序计数器是唯不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。 2 Java 虚拟机栈   Java虚拟机栈也是线程私有的,它的生命周期和线程相同,描述的是

Redis常见面试题解析(一)

你离开我真会死。 提交于 2019-12-21 04:08:03
文章目录 一、 Redis 概念理解 1. 什么是 Redis? 2. Redis 的特点有哪些? 3. Memcache 与 Redis 的区别都有哪些? 4. Redis 相比 Memcached 有哪些优势? 5. 如何实现本地缓存?请描述一下你知道的方式 6. Redis 通讯协议是什么?有什么特点? 二、Redis 数据结构与指令 1. Redis 支持的数据类型 2. Redis 常用的命令有哪些? 3. 一个字符串类型的值能存储最大容量是多少? 4. Redis 各个数据类型最大存储量分别是多少? 5. 请介绍一下 Redis 的数据类型 SortedSet(zset)以及底层实现机制? 6. Redis 事务相关命令有哪些? 7. 什么是 Redis 事务?原理是什么? 8. Redis 事务的注意点有哪些? 9. Redis 为什么不支持回滚? 10. 请介绍一下 Redis 的 Pipeline(管道),以及使用场景 11. 请说明一下 Redis 的批量命令与 Pipeline 有什么不同? 12. 请介绍一下 Redis 的发布订阅功能 13. Redis 的链表数据结构的特征有哪些? 14. 请介绍一下 Redis 的 String 类型底层实现? 15. Redis 的 String 类型使用 SSD 方式实现的好处? 16.

.NET基础面试题整理

☆樱花仙子☆ 提交于 2019-12-21 01:10:00
今年毕业,本学期找工作期间在面试前做的一些临时的准备 以下的关于老赵分享的面试题解答参考了手头的书籍和视频教程,以及网上的资料,现整理出来希望对大家有所帮助,不对或欠佳的地方望大家指出来我好改正。 1.什么是.NET?什么是CLI?什么是CLR?IL是什么? (1).net用于代码编译和执行的集成托管环境,换句话,它管理应用程序运行的方方面面,包括首次运行的编译,为程序分配内存 存储数据和指令,对于应用程序授予或拒绝相应的权限,并启动管理应用程序的执行,剩余内存的在分配。由于所有.net应用程序 都是在.net framework上面执行,所以开发人员只需考虑与.net framework打交道,而不必关系和底层操作系统上面的实现 包括CLR和BCL (2).CLI(common language infrastructure)公共语言基础结构,一项国际性的标准,没有规定标准具体如何实现。相反,它描述了一个 CLI平台在符合标准的前提下应该具有什么行为。包含了:运行时(CLR),公共中间语言(CIL),公共类型系统(CTS), 公共语言规范(CLS),元数据(Metadata),框架(framework) (3)CLR:公共语言运行时,负责加载和运行程序 IL:中间语言,C#编译器将C#代码转换成IL,运行时能够理解IL,并编译成机器码 2.JIT是什么,它是如何工作的?GC是什么

C#中值类型和引用类型

廉价感情. 提交于 2019-12-19 11:39:15
概念: 1.值类型:数据存储在内存的堆栈中,从堆栈中可以快速地访问这些数据,因此,值类型表示实际的数据。 2.引用类型:表示指向存储在内存堆中的数据的 指针或引用 (包括类、接口、数组和字符串)。 C#中定义的值类型包括原类型( Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal )、枚举( enum )、结构( struct) 引用类型包括:类、数组、接口、委托、字符串等。 区别: 基本区别在于它们在内存中的 存储方式 。 值类型 只将值存放在内存中,这些值类型都存储在堆栈中。原始数据类型(如bool和int)都属于此类型。而 引用类型 的内存单元中只存放内存堆中对象的地址,而对象本身放在内存堆中。如果引用的值类型的值是null,则表示未引用任何对象。 堆和堆栈区别 : 堆和堆栈是两个不同的概念,在内存中的存储位置也不相同, 堆一般用于存储可变长度的数据,如字符串类型; 堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量占用四个字节)。由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用,即在堆栈中保存的是同一个堆的地址。在进行数据操作时,对于值类型

虚拟机类加载机制

本秂侑毒 提交于 2019-12-19 07:53:42
一、虚拟机类加载机制   虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是 虚拟机的类加载机制 。 二、类加载时机   类的生命周期:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个部分统称为连接(Linking)。      加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定(也称为动态绑定或晚期绑定)。   什么时候开始加载?Java虚拟机规范中并没有进行强制约束,虚拟机的具体实现来自由把握。   虚拟机规范则是严格规定了 有且只有 5种情况必须立即对类进行“初始化”(而加载、验证、准备自然需要在此之前开始):   1)遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。生成这4条指令的最常见的Java代码场景是:使用new关键字 实例化对象的时候

Java的内存结构

耗尽温柔 提交于 2019-12-18 16:53:39
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Java 的运行时数据区域分为五大数据区域。这些区域各有各的用途,创建及销毁时间。如下图所示,其中方法区和堆是所有线程共享的,栈,本地方法栈和程序虚拟机则为线程私有的。 根据 Java 虚拟机规范, Java 虚拟机管理的内存分为 方法区、堆、虚拟机栈、本地方法栈、程序计数器栈 五大区域。 程序计数器(Program Counter Register) 程序计数器是一块很小的内存空间,它是线程私有的,可以认作为当前线程的行号指示器。 在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。由于 Java 虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,对于一个处理器(如果是多核 CPU 那就是一核)来说,在一个确定的时刻只会执行一条线程中的指令,而一条线程中有多个指令,为了线程切换可以恢复到正确执行位置,每个线程都需有独立的一个程序计数器,不同线程之间的程序计数器互不影响,独立存储。 如果线程执行的是个 Java 方法,那么计数器记录的是虚拟机字节码指令的地址。如果为 native 底层方法,那么计数器为空( Undefined )。这块内存区域是虚拟机规范中唯一没有

Java数据类型

霸气de小男生 提交于 2019-12-18 15:00:08
源地址: http://leowzy.iteye.com/blog/792506 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式。接触每种语言的时候,都会存在数据类型的认识,有复杂的、简单的。各种数据类型都需要在学习初期去了解,Java是强类型语言,所以Java对于数据类型的规范相对严格。数据类型是语言的抽象原子概念,可以说是语言中最基本的单元定义,在Java里面,本质上数据类型分为两种:简单类型和复杂类型。 简单类型: 简单数据类型是不能简化的、内置的数据类型、由编程语言本身定义,它表示了真实的数字、字符和整数。 复杂类型: Java语言本身不支持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型一般都是通过类或接口进行构造,类提供了捆绑数据和方法的方式,同时可以针对程序外部进行信息隐藏。 i.Java中的基本类型: 1)概念: Java中的简单类型从概念上分为四种: 实数、整数、字符、布尔值 。但是有一点需要说明的是,Java里面有八种原始类型,其列表如下: 实数 : double、float 整数 : byte、short、int、long 字符 : char 布尔值 : boolean 复杂类型和基本类型的内存模型本质上不一样,简单数据类型的存储原理:所有的简单数据类型 不存在“引用” 概 念

C#引用类型和值类型的区别

情到浓时终转凉″ 提交于 2019-12-18 09:03:20
我们都知道, c# 的两大数据类型分别为值类型和引用类型。很多人或许闭着眼睛都能说出值类型包括简单类型、结构体类型和枚举类型,引用类型包括自定义类、数组、接口、委托等,但是当被问及到二者之间的联系和区别,什么时候用 struct 什么时候用 class 时,就常常混淆不清了。为此,了解值类型和引用类型的本质差异就变的很有必要了。 值类型直接存储其值,变量本身就包含了其实例数据,而引用类型保存的只是实例数据的内存引用。因此,一个值类型变量就永远不会影响到其他的值类型变量,而两个引用类型变量则很有可能指向同一地址,从而发生相互影响。 从内存分配上来看,值类型通常分配在线程的堆栈上,作用域结束时,所占空间自行释放,效率高,无需进行地址转换,而引用类型通常分配在托管堆上,由 GC 来控制其回收,需要进行地址转换,效率降低,这也正是 c# 需要定义两种数据类型的原因之一。 值类型均隐式派生自 System.ValueType ,而 System.ValueType 又直接派生于 System.Object, 每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值,注意所有的值类型都是密封( sealed )的,所以无法派生出新的值类型。而且 System.ValueType 本身是一个类类型,而不是值类型,因为它重写了 object 的 Equals() 方法

Java内存区域

十年热恋 提交于 2019-12-17 20:39:35
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 基本问题: 介绍下Java内存区域(运行时数据区)。 Java对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么) 对象的访问定位的两种方式(句柄和直接指针两种方式) 拓展问题: String类和常量池 8种基本类型的包装类和常量池 1 概述(为什么要学习Java内存区域) 对于Java程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个new 操作去写对应的delete/free操作,不容易出现内存泄漏和内存溢出问题。正是因为Java程序员把内存控制权利交给Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。 2 运行时数据区域 线程私有的: 程序计数器 虚拟机栈 本地方法栈 线程共享的: 堆 方法区 直接内存 2.1 程序计数器 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。 字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完。 另外, 为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为

C语言博客作业06--结构体&文件

别说谁变了你拦得住时间么 提交于 2019-12-16 13:53:17
1.本章学习总结 1.1 学习内容总结 1.结构的介绍 结构(Structure)类型是一种允许程序员把一些数据分量聚合成一个整体的数据类型,一个结构中包含的每个数据分量都有名字。这些数据分量称为结构成员或者结构分量,结构成员可以是C语言中的任意变量类型,程序员可以使用结构类型来创建适合于问题的数据聚合。 像数组和指针一样,结构也是一种构造数据类型(或叫派生数据类型),它与数组的区别在于:数组中所有元素的数据类型必须是相同的,而结构中各成员的数据类型可以不同。 2.结构是C语言中一种新的构造数据类型,它能够把有内在联系的不同类型的数据汇聚成一个整体,使它们相互关联;同时,结构又是一个变量的集合, 可以按照对基本数据类型的操作方达单独使用其成员变量。 3.在C语言中,整型、实型等基本数据类型是被系统预先定义好了的,程序员可以用其直接定义变量。而结构类型是由用户根据需要,按规定的格式自行定义的数据类型。 4.结构类型定义的一般形式为: struct 结构名 { 类型名 结构成员名1; 类型名 结构成员名2; … 类型名 结构成员名n; }; 5.struct是定义结构类型的关量字,在struct之后,自行命名一个结构名,它必须是一个合法的C标识符。struct与结构名两者合起来共同组成结构类型名,大括号内的内容是结构所包括的结构成员,也叫结构分量。结构成员可以有多个,这样