空间数据

深入学习Java核心 Java内存分配原理

匿名 (未验证) 提交于 2019-12-02 21:53:32
内存分配 与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介 绍一下Java在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 ◆堆:存放用new产生的数据 ◆静态域:存放在对象中用static定义的静态成员 ◆常量池:存放常量 ◆非RAM存储: 硬盘等永 久存储空间 Java内存分配中的栈 在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量 时,Java就在栈中 为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。 Java内存分配中的堆 堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。 访问堆中的数组或对象。引用变量就相当于是为数组或者对象起 的一个名称。 引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序 运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放

Java NIO 学习笔记一

匿名 (未验证) 提交于 2019-12-02 21:52:03
进程执行I/O操作,归结起来就是向操作系统发出请求,它要么把缓存区例的数据排干(写),要么用数据把数据区填满(读)。进程使用这一机制处理所有数据进出操作。 进程使用read()系统调用,要求其缓存区被填满。内核随即向磁盘控制器发出命令,要求其从磁盘读取数据。通过DMA技术直接将磁盘中的数据写入内核内存缓存区,一旦磁盘控制器把缓存区填满,内存立即把数据从内核空间的里你是缓冲区拷贝到进程执行read()调用时指定的缓冲区。 根据发散/汇聚的概念,进程只需要一个系统调用,就能把一连串的缓冲区地址传递给操作系统。然后,内核就能顺序填充或排干多个缓冲区,读的时候将数据发散到多个用户空间缓冲区,写的时候再从多个缓冲区把数据汇聚起来。 前面提到设备控制器不能使用DMA直接存储到用户空间,需要从内核空间拷贝到用户空间。但在使用内存多重映射技术可以避免这种拷贝。 现代操作系统都使用虚拟内存,它有极大优点: 多个虚拟地址可以映射到同一个物理地址。 虚拟内存空间可能大于实际可用的硬件内存。 借助虚拟内存的特点,将内核空间中的缓冲区的虚拟地址和用户空间的缓冲区虚拟地址映射到一个物理地址(即内存多重映射技术)。 但这也是有前提的,内核与用户缓冲区必须使用相同的页对齐,缓冲区的大小还必须是磁盘控制块大小的倍数。 确定请求的数据分布在文件系统的哪些页,这些页不一定都是连续的 在内核空间种分配足够的页

Java NIO简介

匿名 (未验证) 提交于 2019-12-02 21:40:30
前面介绍的是传统的IO,在java.io包下。传统的IO有一下缺点: 传统的IO是BIO(阻塞式的IO),使用read()系列方法读取数据时,如果没有可读取的数据,会一直阻塞该线程,读取到数据后,线程才继续往下执行。 不管是字节流还是字符流,底层都是基于字节实现的,如果不使用缓冲区,会一个字节一个字节地处理,效率极低。 读文件时需要从内核空间复制数据到用户空间,写文件时需要把数据从用户空间传递到内核空间,很花时间。 Java不具备直接操作硬件的能力,不能直接操作计算机硬件。OS是由C/C++写的,代码执行效率极高,操作硬件能力强。 当Java程序要使用计算机硬件时,比如要使用摄像头,要读写磁盘文件等,是由JVM向OS发出请求,由OS来操作硬件。 计算机内存大体可分为2部分: 内核空间,运行OS自带的程序,比如说Windows启动程序、资源管理器、注册表等。 用户空间,运行用户程序,比如说QQ、酷狗、IDEA等。 这样做的好处是,将系统内核和用户程序分开,即便用户程序出了问题,也不会影响到系统内核,系统内核更加安全。 写文件:JVM向OS发出请求 -> OS把要写的数据从用户空间复制到内核空间 -> OS把这些数据从内核空间写到磁盘文件。 JVM是运行在用户空间的一个程序。不能直接访问内核空间的数据。传统的IO进行磁盘文件读写要把数据从内核空间复制到用户空间

Linux设备驱动程序 之 ioctl

六眼飞鱼酱① 提交于 2019-12-02 19:32:51
ioctl 除了读取和写入设备之外,大部分驱动程序还需要另外一种能力,即通过设备驱动程序执行各种类型的硬件控制,通常这种需求使用ioctl方法支持,该方法实现了同名的系统调用; 在用户空间,ioctl系统调用的原型如下: 1 int ioctl(int d, int request, ...); 原型中的可变参数不是数目不定的一串参数,而只是一个可选参数;可选参数的具体格式依赖于控制命令,也就是第二个参数;某些控制命令不需要参数,某些需要一个整数参数,某些需要一个指针参数;使用指针参数可以向ioctl传递任意数据,这样设备可以与用户空间交换任意数量的数据; ioctl系统调用内核中的定义如下: 1 SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) ioctl在file_operations中的函数原型如下: 1 long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); 2 long (*compat_ioctl) (struct file *, unsigned int, unsigned long); 大多数ioctl的实现都包含了一个switch语句来根据cmd参数选择对应的操作

Sybase ASE学习笔记

我的未来我决定 提交于 2019-12-02 15:58:53
通过这两天的学习,由于之前完全没有接触过sybase,发现sybase跟oracle或者SQL server都有比较大的差别,一是需要配置运行sybase的环境,二是sybase采用的是Transaction-SQL。三是,其数据库管理开始时让我很不习惯。 在接触别人安装了的sybase(linux 64bit-ase15.7)时,我发现sybase老是连不上,通过showserver命令来查看,shell却说没此命令,接着进入其安装 SYBASE_HOME/ASE-15_0/install/检查了,showserver没有问题,但启动./startServer.sh时,发现错误 了,出现了can execute file RUN_SYBASE。此刻我发现了我与本目录的RUN_*****不同,虽然意识到不同,但我只是mark下它而没有进行进一步思考。通过上网搜索资 料,如果sybase是安装成功,那么应该就是环境问题了。所以我调用./SYBASE.sh(我以为起码当前的环境就配好了),于是我就调用isql -Usa -S服务名、isql -Usa -S192.168.*.*和isql -Usa -S192.168.*.*:5000 以及它们各种变形,其间还需用注意得在SYBASE_HOME/OCS-15_0/bin目录下(即存在isql.sh脚本文件的目录下),这里花了我不

进程管理

你说的曾经没有我的故事 提交于 2019-12-02 15:15:30
计算机是由软件和硬件组成的: 底层的硬件→内核(kernel:输出的借口为system call,用作系统调用)→lib库(库调用;调用就是载入别人事先编写好的功能模块,比如函数、类); 程序由指令和数据组成; CPU上的指令分为普通指令(环三)和特权指令(环零); 特权指令不允许程序随意调用,一般只有内核可以调用;因为特权指令一般是执行硬件操作的,比如读写等,显然类似这些指令是不可能随意授权给普通程序的; 任何程序不得直接使用特权指令,用到的时候可以通过像内核申请系统调用来执行特权指令; 程序执行时是依照指令的顺序由上而下根据选择循环等结构有序的执行; 一个程序运行时一旦需要运行某个特权指令时就会去调用内核,接下来程序会先停止,等待内核把需要调用的功能(特权指令)拿到CPU上来执行,等待执行完成后,将结果返回(调用返回),然后程序继续执行其他操作; 代码执行过程中可能会不断地在自己可以执行的代码和调用由内核执行的代码之间来回转换; 模式切换:(用户代码(用户空间/模式)↔内核代码(内核空间/模式)) 内核的功能:进程管理、文件系统、网络功能、安全功能、内存管理、驱动程序等; 系统运行时会有多个程序一起执行,称作并行执行;是怎么实现的那? 其实当有多个程序一起执行时,系统会把程序对CPU的使用时间切割成时间片,某个程序执行一小段时间后再由下一个程序再执行一小段时间

java知识基础篇(详细版)

自古美人都是妖i 提交于 2019-12-02 14:59:12
本文章为Java知识的基础篇,为Java知识点总结的前序部分。 1.java概述: 1991 年Sun公司的James Gosling(詹姆斯·高斯林)等人开始开发名称为 Oak的语言,希望用于控制嵌入在有线电视交换盒、PDA等的微处理器;1994年将Oak语言更名为Java; 2.Java的三种技术架构: JAVAEE:Java Platform Enterprise Edition,开发企业环境下的应用程序,主要针对web程序开发; JAVASE:Java Platform Standard Edition,完成桌面应用程序的开发,是其它两者的基础; JAVAME:Java Platform Micro Edition,开发电子消费产品和嵌入式设备,如手机中的程序; 3.JDK: Java Development Kit,java的开发和运行环境,java的开发工具和jre。 4.JRE: Java Runtime Environment,java程序的运行环境,java运行的所需的类库+JVM(java虚拟机)。 5.配置环境变量: 是 java中 jdk\bin目录下的工具,可以在任意目录下运行,原因是,将该工具所在目录告诉了系统,当使用该工具时,由系统帮我们去找指定的目录。 6.环境变量的配置: 1):永久配置方式:JAVA_HOME=%安装路径%\Java\jdk

Linux进程间通信 --- IPC机制(转)

余生颓废 提交于 2019-12-02 12:27:58
在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方法。在linux下有多种进程间通信的方法:半双工管道、命名管道、消息队列、信号、信号量、共享内存、内存映射文件,套接字等等。使用这些机制可以为linux下的网络服务器开发提供灵活而又坚固的框架。 1. 管道 (PIPE) 管道实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读取出来。 管道的特点: 1、管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 2、只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。比如fork或exec创建的新进程,在使用exec创建新进程时,需要将管道的文件描述符作为参数传递给exec创建的新进程。当父进程与使用fork创建的子进程直接通信时,发送数据的进程关闭读端,接受数据的进程关闭写端。 3、单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。 4、数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾

java编程总结;基础学习 day two

自闭症网瘾萝莉.ら 提交于 2019-12-02 10:45:40
一、java语法格式 1、main方法的作用:它是程序的入口,程序就是从主函数开始的,且main方法中的各个属性不能被改变。 2、java语言分隔符 ;(分号):被用于语句之间的分隔 {}(花括号):被花括号括起的代码表示为一个代码块,是一个整体,花括号要一起使用 [](方括号):主要用于定义数组及访问数组时使用 ()(圆括号):使用很广泛 .(圆点):一个类的对象访问它的方法或属性时使用 空格:分隔一条语句中的不同部分 3、注释的用法 注释:为了提高代码的可阅读性。 注释的分类: 单行注释://注释内容 多行注释:/*注释内容*/ 文本注释:/** 文本内容*/,可以生成程序说明书;java特有注释; 二、java关键字和标识符 关键字:被Java语言赋予了特定含义的字符!这些词不能用于其他地方,改变其含义。 关键词分类: 标识符:为了增强阅读性的自定义名称,例如:类名、方法名、变量名等等 标识符的书写规则: 1、由字母、数字、下划线、$组成,不能以数字开头,注意:此处的字母还可以是中文,日文等 2、标识符大小写敏感 3、标识符不得使用java中的关键字和保留字 4、别用Java API里面的类名作为自己的类名 注意:一般开发时,会用 有意义的英文单词作为标识符 。 规范: (1) 类名 所有单词首母大小 YourGirlFriend (2) 函数名,变量名

算法复杂度

强颜欢笑 提交于 2019-12-02 10:44:37
1、概念: 算法在编译成程序运行后,所有消耗所需的资源,其资源包括:时间资源与空间资源; 2、基本内容: 在描述算法复杂度时,经常用到o(1), o(n), o(logn), o(nlogn)来表示对应算法的时间复杂度。这里进行归纳一下它们代表的含义:这是算法的时空复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。 O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。 时间复杂度为O(n),就代表数据量增大几倍,耗时也增大几倍。比如常见的遍历算法。 时间复杂度O(n^2),就代表数据量增大n倍时,耗时增大n的平方倍,这是比线性更高的时间复杂度。比如冒泡排序,就是典型的O(n^2)的算法,对n个数排序,需要扫描n×n次。 O(logn),当数据增大n倍时,耗时增大logn倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)。二分查找就是O(logn)的算法,每找一次排除一半的可能,256个数据中查找只要找8次就可以找到目标。 O(nlogn)同理,就是n乘以logn,当数据增大256倍时,耗时增大256*8=2048倍。这个复杂度高于线性低于平方。归并排序就是O(nlogn)的时间复杂度。 O(1)就是最低的时空复杂度了,也就是耗时/耗空间与输入数据大小无关