内存类型

2018.6.13 Java语言基础复习总结

点点圈 提交于 2020-03-21 20:03:17
Java语言基础与面向对象编程实践 第一章 初识Java 1.1机器语言 机器语言是指一台计算机全部的指令集合。机器语言室友0和1组成的二进制数,是一串串由0和1组成的指令序列,可将这些指令序列交给计算机执行。 1.2汇编语言 负责把汇编语言翻译成二进制的机器语言,这种翻译程序就是汇编程序。 1.3高级语言 1954年第一个完全脱离机器硬件的高级语言FORTRAN诞生 1.3.1C语言 是一种计算机程序设计语言,它既有高级语言的特点,又具有汇编语言的特点。 1.3.2 C++语言 是具有面向对象特性的C语言,面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。通过面向对象的方式,将现实世界的事物抽象成类和对象,帮助我们实现对现实世界的抽象与建模。 1.3.3 C#语言 是一种面向对象的运行于.NET Framework之上的高级程序设计语言。C#与Java很相似(单一继承、接口、编译成中间代码在运行) 1.4 SQL语言 结构化查询语言(Structured Query Language,SQL)是一种数据库查询和编程的语言。用于存取数据库以及查询、更新和管理关系数据库系统 1.5 Java的诞生 ·1995年Sun推出的Java只是一种语言 ·JDK包括两个部分:运行环境(JRE)和开发环境(JDK)在运行环境包括了核心API、集成API、用户界面

计算Java对象内存大小

这一生的挚爱 提交于 2020-03-21 07:05:18
摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型、锁原理、分代GC、OOP-Klass模型等内容。最后推荐JDK自带的Hotspot Debug工具——HSDB,来查看对象在内存中的具体存在形式,以论证文中所述内容。 背景 目前我们系统的业务代码中大量使用了LocalCache的方式做本地缓存,而且cache的maxSize通常设的比较大,比如10000。我们的业务系统中就使用了size为10000的15个本地缓存,所以最坏情况下将可缓存15万个对象。这会消耗掉不菲的本地堆内存,而至于实际上到底应该设多大容量的缓存、运行时这大量的本地缓存会给堆内存带来多少压力,实际占用多少内存大小,会不会有较高的缓存穿透风险,目前并不方便知悉。考虑到对缓存实际占用内存的大小能有个更直观和量化的参考,需要对运行时指定对象的内存占用进行评估和计算。 要计算Java对象占用内存的大小,首先需要了解Java对象在内存中的实际存储方式和存储格式。 另一方面,大家都了解Java对象的存储总得来说会占用JVM内存的堆内存、栈内存及方法区,但由于栈内存中存放的数据可以看做是运行时的临时数据,主要表现为本地变量、操作数、对象引用地址等。这些数据会在方法执行结束后立即回收掉

c++ union

旧街凉风 提交于 2020-03-20 18:36:59
什么是union? 翻译过来说,就是共用体,或者也叫联合体。说到了union,也就是共用体,就不得不说一下struct了,当我们有如下的struct的定义时: 1 2 3 4 5 6 struct student { char mark ; long num ; float score ; } ; 关于struct的内存结构,将就会像下图所示这样(在x86机器上演示): sizeof(struct student)的值为12bytes。但是,当我们定义如下的union时, 1 2 3 4 5 6 union test { char mark ; long num ; float score ; } ; sizeof(union test)的值为4。这为什么呢?这就是需要说的。 有的时候,我们需要几种不同类型的变量存在在同一段的内存空间中,就像上面的,我们需要将一个char类型的mark、一个long类型的num变量和一个float类型的score变量存放在同一个地址开始的内存单元中。上面的三个变量,char类型和long类型所占的内存字节数是不一样的,但是在union中,它们都是从同一个地址存放的,也就是使用的覆盖技术,这三个变量互相覆盖,而这种使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。上面定义的union类型的结构如下: 上面也说了,sizeof(union

day1 Python可变与不可变类型

谁都会走 提交于 2020-03-20 18:30:12
Python基础知识,自己写一写比较不容易忘 Python的每个对象都分为可变和不可变,主要的核心类型中, 数字、字符串、元组是不可变的 , 列表、字典是可变的。 对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象(如果没有其他变量引用原有对象的话(即引用计数为0),原有对象就会被回收)。 不可变类型以int类型为例:实际上 i += 1 并不是真的在原有的int对象上+1,而是重新创建一个value为6的int对象,i引用自这个新的对象。 >>> i = 5 >>> i += 1 >>> i 6 通过id函数查看变量i的内存地址进行验证(使用hex(id(i)) 可以查看16进制的内存地址) >>> i = 5 >>> i += 1 >>> i >>> id(i) >>> i += 1 >>> i >>> id(i) 可以看到执行 i += 1 时,内存地址都会变化,因为int 类型是不可变的。 再改改代码,但多个int类型的变量值相同时,看看它们内存地址是否相同。 >>> i = 5 >>> j = 5 >>> id(i) >>> id(j) >>> k = 5 >>> id(k) >>> x = 6 >>> id(x) >>> y = 6 >>> id(y) >>> z = 6 >>> id(z) 对于不可变类型int

几个方便编程的C++特性

二次信任 提交于 2020-03-20 11:52:04
前言: C++11的自动化特性给编程提供了不少方便,同时也给调试增加了很多负担,至于取舍看程序员的风格和侧重而定。 auto:自动类型推断   在C++11之前,auto关键字用来指定 存储 期。在新标准中,它的 功能变为类型推 断。auto现在成了一个类型的占位符,通知编译器去根据初始化 代码推断所声明变量的真实类型。各种作用域内声明变量 都可以 用到它。例如,名空间中,程序块中,或是for循环的初始化语句中。   auto i = 42; // i is an int auto l = 42LL; // l is an long long auto p = new foo(); // p is a foo*   使用auto通常意味着更短的代码(除非你 所用 类型是int,它会比auto少一个字母)。试想一下当你遍历STL容器时需要声明的那些迭代器(iterator)。现在不需要去声明那些typedef就可以得到简洁的代码了。   std::map> map; for(auto it = begin(map); it != end(map); ++it) { }   需要注意的是,auto不能用来声明函数的返回值。但如果函数有一个尾随的返回类型时,auto是可以出现在函数声明中返回值位置。这种情况下,auto 并不是告诉编译器去推断返回类型

Java内存模型

非 Y 不嫁゛ 提交于 2020-03-17 08:59:43
Java内存模型 原本准备把内存模型单独放到某一篇文章的某个章节里面讲解,后来查阅了国外很多文 档才发现其实JVM内存模型的内容还蛮多的,所以直接作为一个章节的基础知识来讲解,可能该章节概念的东西比较多。一个开发Java的开发者,一旦了解了 JVM内存模型就能够更加深入地了解该语言的语言特性,可能这个章节更多的是概念,没有太多代码实例,所以希望读者谅解,有什么笔误来Email告知: silentbalanceyh@126.com , 本文尽量涵盖所有Java语言可以碰到的和内存相关的内容,同样也会提到一些和内存相关的计算机语言的一些知识,为草案。因为平时开发的时候没有特殊情况 不会进行内存管理,所以有可能有笔误的地方比较多,我用的是Windows平台,所以本文涉及到的与操作系统相关的只是仅仅局限于Windows平台。不 仅仅如此,这一个章节牵涉到的多线程和另外一些内容并没有讲到,这里主要是结合JVM内部特性把本章节作为核心的概念性章节来讲解,这样方便初学者深入以 及彻底理解Java语言) 本文章节: 1.JMM简介 2.堆和栈 3.本机内存 4.防止内存泄漏 1.JMM简介    i.内存模型概述   Java平台自动集成了 线程 以及 多处理器技术 ,这种集成程度比Java以前诞生的计算机语言要厉害很多,该语言针对 多种异构平台的平台独立性

Netty题目总结

蓝咒 提交于 2020-03-17 08:59:05
1.BIO、NIO 和 AIO 的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线 程开销大。 伪异步 IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。 NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用 器轮询到连接有 I/O 请求时才启动一个线程进行处理。 AIO:一个有效请求一个线程,客户端的 I/O 请求都是由 OS 先完成了再通知服务器应用去 启动线程进行处理, BIO 是面向流的,NIO 是面向缓冲区的;BIO 的各种流是阻塞的。而 NIO 是非阻塞的;BIO 的 Stream 是单向的,而 NIO 的 channel 是双向的。 NIO的特点:事件驱动模型、单线程处理多任务、非阻塞 I/O,I/O 读写不再阻塞,而是返 回 0、基于 block 的传输比基于流的传输更高效、更高级的 IO 函数 zero-copy、IO 多路复用 大大提高了 Java 网络应用的可伸缩性和实用性。基于 Reactor 线程模型。 在 Reactor 模式中,事件分发器等待某个事件或者可应用或个操作的状态发生,事件分发 器就把这个事件传给事先注册的事件处理函数或者回调函数,由后者来做实际的读写操 作。如在 Reactor 中实现读:注册读就绪事件和相应的事件处理器、事件分发器等待事 件、事件到来

Golang 入门 : 数组

柔情痞子 提交于 2020-03-16 03:06:46
数组是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element),这种类型可以是任意的原始类型,比如 int、string 等,也可以是用户自定义的类型。一个数组包含的元素个数被称为数组的长度。在 Golang 中数组是一个长度固定的数据类型,数组的长度是类型的一部分,也就是说 [5]int 和 [10]int 是两个不同的类型。Golang 中数组的另一个特点是占用内存的连续性,也就是说数组中的元素是被分配到连续的内存地址中的,因而索引数组元素的速度非常快。 本文将介绍 Golang 数组的基本概念和用法,演示环境为 ubuntu 18.04 & go1.10.1。 Golang 数组的特点 我们可以把 Golang 数组的特征归纳为以下三点: 固定长度 :这意味着数组不可增长、不可缩减。想要扩展数组,只能创建新数组,将原数组的元素复制到新数组。 内存连续 :这意味可以在缓存中保留的时间更长,搜索速度更快,是一种非常高效的数据结构,同时还意味着可以通过数值的方式(arr[index])索引数组中的元素。 固定类型 :固定类型意味着限制了每个数组元素可以存放什么样的数据,以及每个元素可以存放多少字节的数据。 数组是个固定长度的数据类型,其长度和存储元素的数据类型都在声明数组时确定,并且不能更改。如果需要存储更多的元素,必须先创建一个更长的数组

嵌入式开发之C基础学习笔记06--数组和指针(非常重要,难点)

非 Y 不嫁゛ 提交于 2020-03-15 21:50:14
C语言进阶学习 数组 1)数组的使用 2)字符串(String):数组(尤其是一维数组)最常用的地方——————>C语言中字符串就是一维数组 数组: 定义:具有相同类型的数据的有序集合,并用唯一的名字来标识。 1)数组必须直接声明,编译器在编译阶段为其分配内存空间 2)C89数组必须是定长的,数组的大小在编译时是固定的;C99允许使用变长数组,数组的大小在运行时确定 void f(int longeur,int wide) { int matrix[longeur][wide];/*定义一个矩阵*/ /*数组的长度由两个参数决定*/ } 3)数组的所有元素占连续的内存空间,在内存中是线性(顺序)存放的,保存数组所需要的内存空间直接与基本类型和数组长度有关。 数组占用的内存空间 = sizeof(基类型)*数组长度 4)C不检查数组是否越界,程序可以在两边越界。程序员应自己加入越界检查。数组可以越界使用,但是初始化时不允许! 5)向函数传递数组: 定义数组形参的方法有三种:指针,定长数组,无尺寸数组 void func1(int *a){...} void func2(int a[10]){...} void func3(int a[]){...} 在函数的形参的声明中,数组尺寸无所谓,因为C语言没有边界检查 实际上,第二种方法在编译后,编译器产生的代码就是让函数接受指针

如何选择正确的EC2实例类型

走远了吗. 提交于 2020-03-13 23:46:25
AWS实例类型的选择对应用性能和成本都有关联,所以选择合适的实例类型,既能保证应用性能,又节约成本,获得最佳的性价比。 如果是本地迁移上云项目,首先要做的是收集线下数据中心X86服务器的信息,最基本的例如CPU核数,CPU峰值利用率,内存大小(GB),内存峰值利用率,操作系统类型。我们想根据这些基本信息估算一下在云上应该选择何种机型,以及一年的费用大约是多少。大多数客户在上云后都会购买一年标准RI实例以节省费用,所以我们就以一年全部预付费标准RI的价格作为选择机型的依据。选择机型的逻辑是:满足内存和CPU需求的最便宜的机型。 当然,由于我们买的是一年标准RI实例,在一年之内不可改变机型配置,所以也应该考虑预留一年的业务增长量。因此,在以上收集的基本信息的基础上,我们还要加上两条:我们期望的CPU利用率和内存利用率。举例来说,如果您目前的某个服务器的CPU和内存利用率是90%和80%, 您预计在一年内业务会有20% 的增长(我们姑且认为业务增长与资源需求成正比),当前的CPU是4核,内存是16GB。如果你希望当业务增长20%后,服务器的CPU和内存的利用率维持现状,即90%和80%, 选择的EC2机型应该在运行现有负载时的期望CPU利用率是90%/1.2=75%, 期望的内存利用率是80%/1.2=67%。 还有一点需要考虑的就是应用系统的特性,是以计算能力为主的还是以内存大小为主