内存类型

java的内存管理机制

不打扰是莪最后的温柔 提交于 2019-12-06 21:23:29
C++内存管理详解: 内存分配方式简介   在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。   栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。   堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。   自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。   全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。   常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。 堆和栈究竟有什么区别? 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事

Python中可变类型VS不可变类型

余生颓废 提交于 2019-12-06 16:36:56
一、对象类型 Python中一切皆对象,对象为在内存空间中的一块存储空间,空间内包括:内存地址(id)、类型(type)、值(value),当给变量进行赋值时,先在空间内创建一块区域(一个对象),然后把对象的id赋值给变量,变量重新赋值时,在内存空间重新开辟一块空间,变量重新指向该空间的id。原对象(空间)被系统垃圾回收。 变量无类型,值才有数据类型,变量中永远保存的是值(对象)的id(地址),因此变量永远占用一个4字节的空间,这就是为什么int类型无大小限制,当x=9999999999时,先在内存中开辟一个空间保存99999999999对象,然后把这块空间的id存储到变量x之中,因此python中的int类型可以时无限大的数字。 为了节省内存空间,数值在256之内的数字,会开辟同一个内存空间,也就是说a=2,b=2,那么a和b指向同一个内存空间。当a=200000,b=200000时,a和b指向不同的内存空间。A=b=值 时代表a和b指向同一个地址空间,当重新给b赋值时,b指向了另一个值的地址空间,不会对a的值造成影响。 二、不可变数据类型 Int、float、complex、tuple、str 二、可变数据类型 List、dict、set 来源: https://www.cnblogs.com/henji1266/p/11994712.html

细说JVM内存模型

与世无争的帅哥 提交于 2019-12-06 16:13:35
细说JVM内存模型 前言 在正式学习 JVM 内存模型之前,先注意以下几个是问题: JVM 内存模型与 JAVA 内存模型不是同一个概念。JVM 内存模型是从运行时数据区的结构的角度描述的概念;而 JAVA 内存模型是从主内存和线程私有内存角度的描述。从以下两张图可以看出: ​ JAVA内存模型 ​ JVM内存模型 Java虚拟机总共由三大模块组成: 类加载器子系统 运行时数据区执行引擎 本篇我们介绍第二大模块——运行时数据区(JVM内存模型)。 其实虚拟机的这些模块并不是独立的,都是相互联系的。java 文件编译为 class 文件,通过类加载子系统加载,信息再到 JVM 托管的内存中(部分操作会与本地内存交互)的流转,再到垃圾回收等等,都是一系列的操作。 本系列的博客为了更加清晰的描述清楚功能和原理,将其分为几个章节写作。 概览 运行时数据区分为几大模块(如上图所示): 线程共享区: JAVA堆 方法区 线程私有区: JAVA栈 本地方法栈 程序计数器 本文中,我们将从以下几个方法面来分析各个区域: 功能 存储的内容 是否有内存溢出和内存泄露 是否进行垃圾回收 对应的垃圾回收算法 垃圾回收流程 性能调优 线程私有区 程序计数器 程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器

最近整理的一些常见的面试题,面试大全,黑马程序员面试宝典题库---JavaSE基础篇

自闭症网瘾萝莉.ら 提交于 2019-12-06 12:55:57
JAVA语法(左侧扫描二维码,留言“黑马面试”,自动发原件给你) 1.抽象类(abstract class)和接口(interface)有什么异同? 不同: 抽象类: 1.抽象类中可以定义构造器 2.可以有抽象方法和具体方法 3.接口中的成员全都是 public 的 4.抽象类中可以定义成员变量 5.有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法 6.抽象类中可以包含静态方法 7.一个类只能继承一个抽象类 接口: 1.接口中不能定义构造器 2.方法全部都是抽象方法 3.抽象类中的成员可以是 private、默认、 protected、 public 4.接口中定义的成员变量实际上都是常量 5.接口中不能有静态方法 6.一个类可以实现多个接口 相同: 1.不能够实例化 2.可以将抽象类和接口类型作为引用类型 3.一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现, 否则该 类仍然需要被声明为抽象类 2.重载(overload )和重写(override )的区别。重载的方法能否根据返回类型进行区分? 方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。 重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载; 重写发生在子类与父类之间

《浏览器工作原理与实践》 <12>栈空间和堆空间:数据是如何存储的?

帅比萌擦擦* 提交于 2019-12-06 12:36:37
对于前端开发者来说,JavaScript 的内存机制是一个不被经常提及的概念 ,因此很容易被忽视。特别是一些非计算机专业的同学,对内存机制可能没有非常清晰的认识,甚至有些同学根本就不知道 JavaScript 的内存机制是什么。 但是如果你想成为行业专家,并打造高性能前端应用,那么你就必须要 搞清楚 JavaScript 的内存机制 了。 其实,要搞清楚 JavaScript 的内存机制并不是一件很困难的事,在接下来的三篇文章(数据在内存中的存放、JavaScript 处理垃圾回收以及 V8 执行代码)中,我们将通过内存机制的介绍,循序渐进带你走进 JavaScript 内存的世界。 今天我们讲述第一部分的内容—— JavaScript 中的数据是如何存储在内存中的 。虽然 JavaScript 并不需要直接去管理内存,但是在实际项目中为了能避开一些不必要的坑,你还是需要了解数据在内存中的存储方式的。 让人疑惑的代码 首先,我们先看下面这两段代码: function foo(){ var a = 1 var b = a a = 2 console.log(a) console.log(b) } foo() function foo(){ var a = {name:"极客时间"} var b = a a.name = "极客邦" console.log(a) console.log

Java基础部分 2

荒凉一梦 提交于 2019-12-06 12:23:03
一 . Java 基础部分 2 1 、一个 ".java" 源文件中是否可以包括多个类(不是内部类)?有什么限制? 2 2 、 Java 有没有 goto? 2 3 、说说 & 和 && 的区别。 2 4 、在 JAVA 中如何跳出当前的多重嵌套循环? 2 5 、 switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上 ? 2 6 、 short s1 = 1; s1 = s1 + 1; 有什么错 ? short s1 = 1; s1 += 1; 有什么错 ? 2 7 、 char 型变量中能不能存贮一个中文汉字 ? 为什么 ? 2 8 、用最有效率的方法算出 2 乘以 8 等於几 ? 2 9 、请设计一个一百亿的计算器 2 10 、使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 2 11 、 "==" 和 equals 方法究竟有什么区别? 2 12 、静态变量和实例变量的区别? 2 13 、是否可以从一个 static 方法内部发出对非 static 方法的调用? 2 14 、 Integer 与 int 的区别 2 15 、 Math.round(11.5) 等於多少 ? Math.round(-11.5) 等於多少 ? 2 16 、下面的代码有什么不妥之处 ? 2 17 、请说出作用域 public

全面理解Java内存模型

不羁岁月 提交于 2019-12-06 10:44:53
------------恢复内容开始------------ 1. java内存模型即java Memory Model,简称JMM.JMM定义了Java虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。 2.并发编程有两个关键问题: 线程之间的通信和同步 。 3.线程之间的 通信 机制有两种: 共享内存和消息传递 。 1)在 共享内存 的并发模型里,线程之间共享程序的公共状态,线程之间通过写读内存中的公共状态来 隐式 进行通信,典型的共享内存通信方式就是通过共享对象进行通信。 2)在 消息传递 的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来 显式 进行通信,在Java中典型的消息传递方式是wait()和notify() 4.线程之间的 同步 是指程序用于控制不同线程之间操作发生相对顺序的机制。 1)在 共享内存 并发模型里,同步是 显式 进行的。必须显式指定某个方法或某段代码需要在线程之间互斥执行。 2)在 消息传递 的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是 隐式 进行的。 5.Java的并发采用的是 共享内存模型 ,即Java内存模型(简称JMM), JMM决定一个线程对共享变量的写入合适对另一个线程可见 。从抽象的角度来看, JMM定义了线程和主内存之间的抽象关系

python 字符编码

折月煮酒 提交于 2019-12-06 07:14:07
一.字符编码 计算机中,数据的存储和运算都要使用二进制(因为计算机用高、低电平分别表示1和0),那么就需要一个标准,将数据转为二进制表示 ASCII码就是一套标准,但是ASCII只支持字母和字符的转化,因为ASCII码是美国人提出来的,那么中文,韩文,日文怎样转为二进制呢?中国人规定了自己的标准gb2312编码;日本人规定了自己的Shift_JIS编码;韩国人规定了自己的Euc-kr编码,可是如果一篇文档上这三个国家的语言都出现了,该用哪一个标准呢?unicode应运而生 ASCII码用1个字节代表一个字符 unicode常用两个字节代表一个字符,生僻字需要4个字节 这时候乱码问题消失了,所有的文档我们都使用unicode,但是新问题出现了,如果我们的文档通篇都是英文,用unicode会比ascii耗费多一倍的空间,在存储和传输上十分的低效 本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的 UTF-8 编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间 二.编码对应过程 内存中的编码固定使用unicode,唯一可变的是硬盘上对应的字符编码 1、在存入磁盘时

C语言博客作业05--指针

梦想的初衷 提交于 2019-12-06 06:36:13
0.展示PTA总分 1.本章学习总结 1.1 学习内容总结 1.如果事先无法确定需要处理的数据数量,有两种处理方法:一种方法是估计一个上限,并将该上限作为数组长度,但是这样常常会造成空间浪费;另一种方法是利用指针来实现存储空间的动态分配 2.使用指针可以对复杂数据进行处理,能对计算机的内存分配进行控制,在函数调用中使用指针可以返回多个值 3.一般数据是按照“地址”存取的 4.程序执行时将变量翻译为它所在的内存地址来进行操作,这种使用变量的方法叫做“直接访问”,直接访问一般以内存单元的第1个字节的地址作为它的地址 5.在C程序中还有一种使用变量的方法,即通过变量的地址进行操作,用指针访问内存和操纵地址,比如再定义一个变量来专门存放另一个变量的地址,这种方法称为“间接访问” 6.在C语言中把专门用来存放变量地址的变量称为“指针变量”,简称为指针 7.指针是用来存放内存地址的变量,如果一个指针变量的值是另一个变量的地址,就称该指针变量指向那个变量 8.&n表示变量n的内存地址或存储位置,&被称作地址运算符,&是一元运算符,与其他的一元运算符有同样的优先级和从右到左的结合性 9.定义指针的一般形式为: 类型名 * 指针变量名 ps:* 指的是指针声明符 10.在许多场合,可以把指针变量简称为指针,但实际上指针和指针变量在含义又上存在一定的差异,一般来说,在C语言中,指针被认为是一个概念

C博客作业05—指针

落爺英雄遲暮 提交于 2019-12-06 06:29:16
0.展示PTA总分(0----2) 展示关于“指针题目集”分数截图。 1.本章学习总结(2分) 1.1 学习内容总结 (1) 指针做循环变量做法 #include<stdio.h> void main() { int arr[]={6,4,3,5,8,1}; int len = sizeof(arr); for(int i=0;i<len;i++) { printf("%d\n",arr[i]);//常规遍历方式 } for(int i=0;i<len;i++) { printf("%d\n",*(arr+i));//使用arr指针遍历方式 } int *p_arr=arr; for(int i=0;i<len;i++) { printf("%d\n",*(p_arr+i));//额外使用新指针来遍历数组 printf("%d\n",*p_arr++);//额外使用新指针来遍历数组 } } (2) 字符指针如何表示字符串 C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中。字符数组归根结底还是一个数组,当然关于指针和数组的规则同样也适用于字符数组。举一个例子: #include <stdio.h> #include <string.h> int main(){ char str[] = "asdfghjkl"; char *pstr = str; int len =