精华内容
下载资源
问答
  • 内存什么作用

    千次阅读 2018-06-26 21:32:11
     内存:RAM-随机存储器。 程序的运行是需要有一个场所的,因为对于CPU来说,甭管i7或者i8就那么几个寄存器,这一点特别能被忽略,对的,再高级的CPU确实只有那么几个寄存器,CPU的所有动作都是直接对寄存器操作的...

        这一问题乍一看会觉得特别简单,但是仔细一想,却很难准确的概括。

        内存:RAM-随机存储器。

        程序的运行是需要有一个场所的,因为对于CPU来说,甭管i7或者i8就那么几个寄存器,这一点特别能被忽略,对的,再高级的CPU确实只有那么几个寄存器,CPU的所有动作都是直接对寄存器操作的,都是要一个一个来的,就相当于总理,总理日理万机,即便要干n多事情,还是在他那个有限的大脑里一件一件的去做,所以为了运行大的和多的程序必然要有个临时的场地,而且还要保证跟CPU能够进行最快的通信,这里的内存就相当于总理的秘书处,存放将要运行的和正在运行的程序变量和各种参数,因为是总理的秘书处,所以跟总理的沟通也是最快的。

        内存和硬盘不同,硬盘是用来存储数据的,不是为了运行程序的。程序运行时,是“秘书处”先把程序代码从硬盘中转移到内存中,然后等到总理(CPU)腾出手来,就从秘书处(内存)进行运行数据,当然了,总理(CPU)的思考过程是要在总理的大脑中(CPU内的计算单元和少量的寄存器)。

        总结,内存就是一个临时存储器,运行程序时,有一个机构会先将程序代码和参数变量存放到内存中,然后CPU来读,接着执行,当然了,当关机后,里面的数据也就没有了。

    展开全文
  • 什么是内存对齐以及作用

    千次阅读 多人点赞 2019-05-04 11:15:47
    什么是内存对齐? 为了解释这个问题,先来介绍下面的例子: #include<iostream> using namespace std; struct A { char a; short b; int c; }; struct B { short b; int c; char a; }; int main()...

    什么是内存对齐?

    为了解释这个问题,先来介绍下面的例子:

    #include<iostream>
    using namespace std;
    
    struct A
    {
     	char a;
     	short b;
     	int c;
    };
    
    struct B
    {
    	short b;
    	int c;
    	char a;
    };
    
    int main()
    {
     	cout<<sizeof(A)<<endl;
     	cout<<sizeof(B)<<endl;
     	
     	return 0;
     }
    

    运行结果为:
    8
    12

    为什么会这样呢?相同的数据,只是调整了位置,在内存中的大小却不一样?还有按照常理这两个结果体的大小应该都是1+2+4=7才对呀。
    这就是因为有内存对齐,造成的结果。


    内存对齐对于程序员来说透明的,这是编译器该做的事,将每个数据按排到合适的位置,这也是编译器优化的结果。所以了解内存对齐的原理对于一个程序员写代码是十分必要的,就不会导致大量的内存碎片产生。下面就来讲讲内存对齐的规则吧。

    1、对于结构体的第一个成员,将它在整个结构体在内存中分布的偏移量看成0,以后的每一个数据成员的偏移量必须是 min{#pragma pack()指定的数,这个数据成员的本身的数据长度} 的倍数。
    2、每个数据成员完成在结构体内部对齐的时候,还要进行整个结构体在内存中的对齐,整个结构体的大小为 min{#pragma pack()指定的数,这个结构体中数据长度最大的数据成员的长度} 的倍数。

    #pragram pack(n) 表示的是设置n字节对齐,在VC6中默认是8,所以,我们一般都不用考虑这个,除非我们自己自定义内存对齐。

    通过以上的规则,来解释一下之前的两个例子:

    struct A
    {
    	char a;
        short b;
       	int c;
    };
    
    struct B
    {
        short b;
        int c;
       	char a;
    };
    

    对于结构体 A
    a的长度为1字节,偏移量为0;b的长度为2,它的偏移量应该是2的倍数,之前加起来的数据大小总和为1字节,所以a后面要有一字节的空;c的长度为4字节,偏移量应该是4的倍数,之前的数据大小总和为1+1+2=4字节,刚好是4的倍数,在结构体内部的大小总和为8。再进行结构体的对齐,结构体数据长度最大是4,要是4的倍数,8刚好就是4的倍数,所以结果为8。

    对于结构体B
    b的长度为2字节,偏移量为0;c的长度为4,它的偏移量应该是4的倍数,之前加起来的数据大小总和为2字节,所以b后面要有2字节的空位;a的长度为1字节,偏移量应该是1的倍数,之前的数据大小总和为2+2+4=8字节,是1的倍数,在结构体内部的大小总和为9。再进行结构体的对齐,结构体数据长度最大是4,要是4的倍数,但9不是4的倍数,所以结果为12。

    为什么要进行内存对齐?

    一、硬件原因:加快CPU访问的速度
    我们大多数人在没有搞清楚CPU是如何读取数据的时候,基本都会认为CPU是一字节一字节读取的,但实际上它是按照块来读取的,块的大小可以为2,4,8,16。块的大小也称为内存读取粒度。
    假设CPU没有内存对齐,要读取一个4字节的数据到一个寄存器中,(假设读取粒度为4),则会出现两种情况
    1、数据的开始在CPU读取的0字节处,这刚CPU一次就你能够读取完毕
    2、数据的开始没在0字节处,假设在1字节处吧,CPU要先将0~3字节读取出来,在读取4~7字节的内容。然后将0~3字节里的0字节丢弃,将4~7字节里的5,6,7字节的数据丢弃。然后组合1,2,3,4的数据。
    由此可以看出,CPU读取的效率不是很高,可以说比较繁琐。
    但如果有内存对齐的话:
    由于每一个数据都是对齐好的,CPU可以一次就能够将数据读取完成,虽然会有一些内存碎片,但从整个内存的大小来说,都不算什么,可以说是用空间换取时间的做法。
    二、平台原因:
    不是所有的硬件平台都可以访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些类型的数据,否则抛出硬件异常。

    展开全文
  • 什么是内存泄漏?有什么危害

    千次阅读 2019-04-18 11:31:56
    1、什么是内存泄漏 内存泄漏是指你向系统申请分配内存进行使用(new/malloc),然后系统在堆内存中给这个对象申请一块内存空间,但当我们使用完了却没有归系统(delete),导致这个不使用的对象一直占据内存单元,...

    1、什么是内存泄漏

        内存泄漏是指你向系统申请分配内存进行使用(new/malloc),然后系统在堆内存中给这个对象申请一块内存空间,但当我们使用完了却没有归系统(delete),导致这个不使用的对象一直占据内存单元,造成系统将不能再把它分配给需要的程序。

        一次内存泄漏的危害可以忽略不计,但是内存泄漏堆积则后果很严重,无论多少内存,迟早会被占完,造成内存泄漏。

    2、引起内存泄漏的原因

    1、分配给程序的内存忘记回收;

        这个是不应该发生的事情,但也是代码中常见的问题。分配的内存用完之后,就一定要回收,避免造成内存泄漏。

    2、程序代码有问题,造成系统没有办法回收;

        Temp1 = new BYTE[100];
        Temp2 = new BYTE[100];
        Temp2 = Temp1;

        这样,Temp2的内存地址就丢掉了,而且永远都找不回了,这个时候Temp2的内存空间想回收都 没有办法。

    3、某些API函数操作不正确,造成内存泄漏;

    3、内存泄漏的危害

          1、频繁GC:系统分配给每个应用的内存资源都是有限的,内存泄漏导致其他组件可用的内存变少后,一方面会使得GC的频率加剧,再发生GC的时候,所有进程都必须等待,GC的频率越高,用户越容易感应到卡顿。另一方面内存变少,可能使得系统额外分配给该对象一些内存,而影响整个系统的运行情况。

        2、导致程序运行崩溃:一旦内存不足以为某些对象分配所需要的空间,将会导致程序崩溃,造成体验差。

    4、Java的垃圾回收机制GC

    原文地址:https://blog.csdn.net/zy_jibai/article/details/80957169

         1、CG的作用:释放掉不可到达的对象的内存。

         2、不可达是个什么概念?

        首先我们要搞清楚Java的内存分区了,其中有两个非常重要的就是栈内存和堆内存

    • 堆内存存放创建的对象的内存
    • 栈内存存放指向对象的引用和普通数据类型

    例如创建一个变量:String str1 = new String("test");

    由此可以说明Java操作对象全部都是匿名操作。在创建之初,每一个堆内存中对象的内存,在栈中都会有一个值(引用)指向他,而有一部分值在我们使用完毕后会将引用置空,这就会有一些堆中的内存没有引用指向,又因为Java中对对象是匿名操作,所以对这些没有栈中内存存储的引用指向的对象称之为不可触及的对象。

    工作原理

    简单介绍一下GC的工作原理:

    首先GC会扫描栈内存中的引用,然后会遍历堆内存中的引用,这样就会查找出内存中不可触及的对象,然后将其释放掉。

    说到这里大家应该发现一个问题,GC回收的只是堆中的内存,而没有栈中的内存,这是因为栈中已分配的内存会随着哟个方法结束的时候释放掉,所以不用担心栈内存中会存在内存泄漏的问题。

    PS:定义变量的时候,慎用static,例如静态的集合中的数据都不会被回收

     

     

    展开全文
  • 在介绍Java内存模型之前,先来看一下到底什么是计算机内存模型,然后再来看Java内存模型在计算机内存模型的基础上做了哪些事情。要说计算机的内存模型,就要说一下一段古老的历史,看一下为什么要有内存模型。 内存...

    本文中,有很多定义和说法,都是笔者自己理解后定义出来的。希望能够让读者可以对Java内存模型有更加清晰的认识。当然,如有偏颇,欢迎指正。

     

    为什么要有内存模型

     

    在介绍Java内存模型之前,先来看一下到底什么是计算机内存模型,然后再来看Java内存模型在计算机内存模型的基础上做了哪些事情。要说计算机的内存模型,就要说一下一段古老的历史,看一下为什么要有内存模型。

    内存模型,英文名Memory Model,他是一个很老的老古董了。他是与计算机硬件有关的一个概念。那么我先给你介绍下他和硬件到底有啥关系。

    CPU和缓存一致性

    我们应该都知道,计算机在执行程序的时候,每条指令都是在CPU中执行的,而执行的时候,又免不了要和数据打交道。而计算机上面的数据,是存放在主存当中的,也就是计算机的物理内存啦。

    刚开始,还相安无事的,但是随着CPU技术的发展,CPU的执行速度越来越快。而由于内存的技术并没有太大的变化,所以从内存中读取和写入数据的过程和CPU的执行速度比起来差距就会越来越大,这就导致CPU每次操作内存都要耗费很多等待时间。

    这就像一家创业公司,刚开始,创始人和员工之间工作关系其乐融融,但是随着创始人的能力和野心越来越大,逐渐和员工之间出现了差距,普通员工原来越跟不上CEO的脚步。老板的每一个命令,传到到基层员工之后,由于基层员工的理解能力、执行能力的欠缺,就会耗费很多时间。这也就无形中拖慢了整家公司的工作效率。

    可是,不能因为内存的读写速度慢,就不发展CPU技术了吧,总不能让内存成为计算机处理的瓶颈吧。

    所以,人们想出来了一个好的办法,就是在CPU和内存之间增加高速缓存。缓存的概念大家都知道,就是保存一份数据拷贝。他的特点是速度快,内存小,并且昂贵。

    那么,程序的执行过程就变成了:

    当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。

    之后,这家公司开始设立中层管理人员,管理人员直接归CEO领导,领导有什么指示,直接告诉管理人员,然后就可以去做自己的事情了。管理人员负责去协调底层员工的工作。因为管理人员是了解手下的人员以及自己负责的事情的。所以,大多数时候,公司的各种决策,通知等,CEO只要和管理人员之间沟通就够了。

    而随着CPU能力的不断提升,一层缓存就慢慢的无法满足要求了,就逐渐的衍生出多级缓存。

    按照数据读取顺序和与CPU结合的紧密程度,CPU缓存可以分为一级缓存(L1),二级缓存(L3),部分高端CPU还具有三级缓存(L3),每一级缓存中所储存的全部数据都是下一级缓存的一部分。

    这三种缓存的技术难度和制造成本是相对递减的,所以其容量也是相对递增的。

    那么,在有了多级缓存之后,程序的执行就变成了:

    当CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。

    随着公司越来越大,老板要管的事情越来越多,公司的管理部门开始改革,开始出现高层,中层,底层等管理者。一级一级之间逐层管理。

    单核CPU只含有一套L1,L2,L3缓存;

    如果CPU含有多个核心,即多核CPU,则每个核心都含有一套L1(甚至和L2)缓存,而共享L3(或者和L2)缓存。

    公司也分很多种,有些公司只有一个大Boss,他一个人说了算。但是有些公司有比如联席总经理、合伙人等机制。

    单核CPU就像一家公司只有一个老板,所有命令都来自于他,那么就只需要一套管理班底就够了。

    多核CPU就像一家公司是由多个合伙人共同创办的,那么,就需要给每个合伙人都设立一套供自己直接领导的高层管理人员,多个合伙人共享使用的是公司的底层员工。

    还有的公司,不断壮大,开始差分出各个子公司。各个子公司就是多个CPU了,互相之前没有共用的资源。互不影响。

    下图为一个单CPU双核的缓存结构。

     

     

    随着计算机能力不断提升,开始支持多线程。那么问题就来了。我们分别来分析下单线程、多线程在单核CPU、多核CPU中的影响。

    单线程。cpu核心的缓存只被一个线程访问。缓存独占,不会出现访问冲突等问题。

    单核CPU,多线程。进程中的多个线程会同时访问进程中的共享数据,CPU将某块内存加载到缓存后,不同线程在访问相同的物理地址的时候,都会映射到相同的缓存位置,这样即使发生线程的切换,缓存仍然不会失效。但由于任何时刻只能有一个线程在执行,因此不会出现缓存访问冲突。

    多核CPU,多线程。每个核都至少有一个L1 缓存。多个线程访问进程中的某个共享内存,且这多个线程分别在不同的核心上执行,则每个核心都会在各自的caehe中保留一份共享内存的缓冲。由于多核是可以并行的,可能会出现多个线程同时写各自的缓存的情况,而各自的cache之间的数据就有可能不同。

    在CPU和主存之间增加缓存,在多线程场景下就可能存在缓存一致性问题,也就是说,在多核CPU中,每个核的自己的缓存中,关于同一个数据的缓存内容可能不一致。

    如果这家公司的命令都是串行下发的话,那么就没有任何问题。

    如果这家公司的命令都是并行下发的话,并且这些命令都是由同一个CEO下发的,这种机制是也没有什么问题。因为他的命令执行者只有一套管理体系。

    如果这家公司的命令都是并行下发的话,并且这些命令是由多个合伙人下发的,这就有问题了。因为每个合伙人只会把命令下达给自己直属的管理人员,而多个管理人员管理的底层员工可能是公用的。

    比如,合伙人1要辞退员工a,合伙人2要给员工a升职,升职后的话他再被辞退需要多个合伙人开会决议。两个合伙人分别把命令下发给了自己的管理人员。合伙人1命令下达后,管理人员a在辞退了员工后,他就知道这个员工被开除了。而合伙人2的管理人员2这时候在没得到消息之前,还认为员工a是在职的,他就欣然的接收了合伙人给他的升职a的命令。

     

    处理器优化和指令重排

    上面提到在在CPU和主存之间增加缓存,在多线程场景下会存在缓存一致性问题。除了这种情况,还有一种硬件问题也比较重要。那就是为了使处理器内部的运算单元能够尽量的被充分利用,处理器可能会对输入代码进行乱序执行处理。这就是处理器优化

    除了现在很多流行的处理器会对代码进行优化乱序处理,很多编程语言的编译器也会有类似的优化,比如Java虚拟机的即时编译器(JIT)也会做指令重排

    可想而知,如果任由处理器优化和编译器对指令重排的话,就可能导致各种各样的问题。

    关于员工组织调整的情况,如果允许人事部在接到多个命令后进行随意拆分乱序执行或者重排的话,那么对于这个员工以及这家公司的影响是非常大的。

     

    并发编程的问题

    前面说的和硬件有关的概念你可能听得有点蒙,还不知道他到底和软件有啥关系。但是关于并发编程的问题你应该有所了解,比如原子性问题,可见性问题和有序性问题。

    其实,原子性问题,可见性问题和有序性问题。是人们抽象定义出来的。而这个抽象的底层问题就是前面提到的缓存一致性问题、处理器优化问题和指令重排问题等。

    这里简单回顾下这三个问题,并不准备深入展开,感兴趣的读者可以自行学习。我们说,并发编程,为了保证数据的安全,需要满足以下三个特性:

    原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行。

    可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

    有序性即程序执行的顺序按照代码的先后顺序执行。

    有没有发现,缓存一致性问题其实就是可见性问题。而处理器优化是可以导致原子性问题的。指令重排即会导致有序性问题。所以,后文将不再提起硬件层面的那些概念,而是直接使用大家熟悉的原子性、可见性和有序性。

     

    什么是内存模型

    前面提到的,缓存一致性问题、处理器器优化的指令重排问题是硬件的不断升级导致的。那么,有没有什么机制可以很好的解决上面的这些问题呢?

     

    最简单直接的做法就是废除处理器和处理器的优化技术、废除CPU缓存,让CPU直接和主存交互。但是,这么做虽然可以保证多线程下的并发问题。但是,这就有点因噎废食了。

    所以,为了保证并发编程中可以满足原子性、可见性及有序性。有一个重要的概念,那就是——内存模型。

    为了保证共享内存的正确性(可见性、有序性、原子性),内存模型定义了共享内存系统中多线程程序读写操作行为的规范。通过这些规则来规范对内存的读写操作,从而保证指令执行的正确性。它与处理器有关、与缓存有关、与并发有关、与编译器也有关。他解决了CPU多级缓存、处理器优化、指令重排等导致的内存访问问题,保证了并发场景下的一致性、原子性和有序性。

    内存模型解决并发问题主要采用两种方式:限制处理器优化使用内存屏障。本文就不深入底层原理来展开介绍了,感兴趣的朋友可以自行学习。

     

    什么是Java内存模型

    前面介绍过了计算机内存模型,这是解决多线程场景下并发问题的一个重要规范。那么具体的实现是如何的呢,不同的编程语言,在实现上可能有所不同。

    我们知道,Java程序是需要运行在Java虚拟机上面的,Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。

    提到Java内存模型,一般指的是JDK 5 开始使用的新的内存模型,主要由JSR-133: JavaTM Memory Model and Thread Specification 描述。感兴趣的可以参看下这份PDF文档(http://www.cs.umd.edu/~pugh/java/memoryModel/jsr133.pdf)

    Java内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程中是用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。

    而JMM就作用于工作内存和主存之间数据同步过程。他规定了如何做数据同步以及什么时候做数据同步。

    这里面提到的主内存和工作内存,读者可以简单的类比成计算机内存模型中的主存和缓存的概念。特别需要注意的是,主内存和工作内存与JVM内存结构中的Java堆、栈、方法区等并不是同一个层次的内存划分,无法直接类比。《深入理解Java虚拟机》中认为,如果一定要勉强对应起来的话,从变量、主内存、工作内存的定义来看,主内存主要对应于Java堆中的对象实例数据部分。工作内存则对应于虚拟机栈中的部分区域。

    所以,再来总结下,JMM是一种规范,目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。目的是保证并发编程场景中的原子性、可见性和有序性。

     

    Java内存模型的实现

    了解Java多线程的朋友都知道,在Java中提供了一系列和并发处理相关的关键字,比如volatilesynchronizedfinalconcurren包等。其实这些就是Java内存模型封装了底层的实现后提供给程序员使用的一些关键字。

    在开发多线程的代码的时候,我们可以直接使用synchronized等关键字来控制并发,从来就不需要关心底层的编译器优化、缓存一致性等问题。所以,Java内存模型,除了定义了一套规范,还提供了一系列原语,封装了底层实现后,供开发者直接使用。

    本文并不准备把所有的关键字逐一介绍其用法,因为关于各个关键字的用法,网上有很多资料。读者可以自行学习。本文还有一个重点要介绍的就是,我们前面提到,并发编程要解决原子性、有序性和一致性的问题,我们就再来看下,在Java中,分别使用什么方式来保证。

    原子性

    在Java中,为了保证原子性,提供了两个高级的字节码指令monitorentermonitorexit。在synchronized的实现原理文章中,介绍过,这两个字节码,在Java中对应的关键字就是synchronized

    因此,在Java中可以使用synchronized来保证方法和代码块内的操作是原子性的。

    可见性

    Java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值的这种依赖主内存作为传递媒介的方式来实现的。

    Java中的volatile关键字提供了一个功能,那就是被其修饰的变量在被修改后可以立即同步到主内存,被其修饰的变量在每次是用之前都从主内存刷新。因此,可以使用volatile来保证多线程操作时变量的可见性。

    除了volatile,Java中的synchronizedfinal两个关键字也可以实现可见性。只不过实现方式不同,这里不再展开了。

    有序性

    在Java中,可以使用synchronizedvolatile来保证多线程之间操作的有序性。实现方式有所区别:

    volatile关键字会禁止指令重排。synchronized关键字保证同一时刻只允许一条线程操作。

    好了,这里简单的介绍完了Java并发编程中解决原子性、可见性以及有序性可以使用的关键字。读者可能发现了,好像synchronized关键字是万能的,他可以同时满足以上三种特性,这其实也是很多人滥用synchronized的原因。

    但是synchronized是比较影响性能的,虽然编译器提供了很多锁优化技术,但是也不建议过度使用。

    总结

    在读完本文之后,相信你应该了解了什么是Java内存模型、Java内存模型的作用以及Java中内存模型做了什么事情等。

    关于Java中这些和内存模型有关的关键字,希望读者还可以继续深入学习,并且自己写几个例子亲自体会一下。可以参考《深入理解Java虚拟机》和《Java并发编程的艺术》两本书。

    展开全文
  • 面试官:说说什么是 Java 内存模型(JMM)?

    万次阅读 多人点赞 2021-05-05 23:23:20
    本文禁止转载 1. 为什么要有内存模型? 1.1. 硬件内存架构 1.2. 缓存一致性问题 ...面试者内心狂喜,这题刚背过:『Java内存主要分为五大块:堆、方法区、虚拟机栈、本地方法栈、PC寄存器,ba.
  • 什么是虚拟内存

    万次阅读 多人点赞 2016-03-10 20:17:46
    虚拟内存是计算机系统内存管理的一种技术。 它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时...
  • 内存对齐的主要作用是: <!--[if !supportLists]-->1、 <!--[endif]--> 平台原因(移植原因) :不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出...
  • null:这个关键词大家都不陌生,但是大家一定不太明白它是什么类型的,或者它在内存中有什么作用,又或者它是不是一个空指针等等,我在这总结了下null 的“意义”。 当我们为一个引用变量初始化=null例如: ...
  • Java虚拟机主要分为以下几个区: 方法区 有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要是对方法区里的常量池和对...虚拟机栈也就是我们平常所称的栈内存,它为java方法.
  • 虚拟内存(硬盘):虚拟的不是物理内存,而是代替物理内存行使存储的功能,物理内存的运行程序的功能是无法用虚拟内存来完成 物理内存与虚拟内存的关系:当运行程序过多,物理内存不够用时,系统会将一部分硬盘空间...
  • 内存压缩是什么?有什么用?

    千次阅读 2011-10-13 17:00:00
    和那个内存清理有什么不同?回答列表1 内存压缩技术介绍为节省存储空间或传输带宽,人们已经在计算机系统中广泛地使用了数据压缩技术。在磁介质存储数据或网络传输数据时,人们使用基于硬.. 1 内存压缩技术介绍 ...
  • 内存泄漏:由于疏忽或者错误造成程序未能释放已经不再使用的情况,内存泄漏并不是指内存在物理上的错误消失,而是程序分配某段内存后,由于设计错误,丢失了对这段内存的控制,因而造成了内存浪费。 如何进行内存...
  • JavaScript,会在创建变量(对象,字符串等)时分配内存,并且在不再使用它们时“自动”释放内存,这个自动释放内存的过程称为垃圾回收。 因为自动垃圾回收机制的存在,让大多Javascript开发者感觉他们可以不关心...
  • 内存分析的作用 内存分析工具可以帮助你了解应用的内存使用情况,从而帮助你避免内存泄漏或内存的过度消耗。要构建可供消费者长期运行的 Web 应用或复杂的交互式应用,您必须重点关注应用的内存使用情况。 尽管 ...
  • 在C语言中,指针变量的值就是一个内存地址,&运算符的作用也是取变量的内存地址,请看下面的代码: #include #include int a = 1, b = 255;int main(){ int *pa = &a; printf("pa = %#X, &b = %#X\n", pa, &b);...
  • 什么是Java内存模型?

    千次阅读 2018-03-17 00:00:00
    本文转载自公众号 占小狼的博客说”JVM内存模型“,有人会说是关于JVM内存分布(堆栈,方法区等)这些介绍,也有地方说(深入理解JVM虚拟机)上说Java内存模型是JVM的抽象模型(主内存,本地内存)。这两个到底怎么...
  • 虚拟内存作用

    千次阅读 2017-05-30 17:40:37
    虚拟内存是计算机系统内存管理的一种技术。别称虚拟存储器(Virtual Memory)。 它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分...
  • 什么是内存泄露?怎么检测

    千次阅读 2019-03-20 17:32:03
    什么是内存泄露? 简单地说就是申请了一块内存空间,使用完毕后没有释放掉。它的一般表现方式是程序运行时间越长,占用内存越多,最终用尽全部内存,整个系统崩溃。由程序申请的一块内存,且没有任何一个指针指向它...
  • 电脑中所运行的程序均需经过内存执行,若执行的程序占用的内存很大很多,则会导致内存消耗殆尽,为解决该问题,WINDOWS运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,这部分空间即称为虚拟内存。...
  • c++内存作用和优势

    千次阅读 2016-08-20 11:31:53
    C/C++下内存管理是让几乎每一个程序员头疼的问题,分配足够的内存、追踪内存的分配、在不需要的时候释放内存——这个任务相当复杂。而直接使用系统调用malloc/free、new/delete进行内存分配和释放,有以下弊端:  1...
  • 什么是闭包? 能够访问其他函数内部变量的函数 闭包解决了什么问题 由于变量的作用域的原因-----(函数内部能读取全局变量,函数外部无法读取函数内部的变量【局部变量】),为了在函数外部读取局部变量,所以就有了...
  • 操作系统虚拟内存作用概括

    千次阅读 2016-10-14 17:41:28
    其次,虚拟内存主要目的不是为了增加“物理内存”,而是将内存中一段时间不用的数据暂时的转移到磁盘或其他介质上去,从而为其他新的数据腾出内存空间。当被转移出去的数据需要用的时候再移回内存中来。主要技术就是...
  • 内存池的作用--减少内存碎片

    千次阅读 2015-09-28 20:45:16
    1 内存池出现的必要性和原因 C/C++下内存管理是让几乎每一个程序员头疼的问题,分配足够的内存、追踪内存的分配、在不需要的时候释放内存——这个任务相当复杂。而直接使用系统调用malloc/free、new/delete进行...
  • 二、主要功能简介 1.内存剖析 Memory profiler JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为...
  • 内存管理的概念及作用

    千次阅读 2018-05-25 13:34:26
    内存管理的功能:1.内存空间的分配与回收:由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储分配的麻烦,提高编程效率2.地址转换:在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,因此...
  • 前段时间笔者仿写一个简易版的电脑管家,对于其中的绝大部分功能,如垃圾清理、进程管理、软件卸载、启动项、云查杀等功能或多或少能猜测到一些,但惟独对其中的一键内存加速功能不得要领,无奈,只能试着逆向电脑...
  • 在实际应用中内存数据库主要是配合oracle或mysql等大型关系数据库使用,关注性能,作用类似于缓存,并不注重数据完整性和数据一致性。基于键值型的内存数据库比关系型更加易于使用,性能和可扩展性更好,因此在应用...
  • 什么内存对齐

    千次阅读 2016-07-22 23:40:43
     现在我就来说一说为什么内存对齐以及怎么个对齐法(如何对齐)?  首先来谈谈什么内存对齐!!我百度了一下如下解释: 内存对齐:  内存对齐”应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元...
  • 每日一面 - JVM 内存一般包括什么

    万次阅读 2021-01-12 07:54:39
    我们一般通过两个工具 pmap 还有 jcmd 中的 VM.native_memory 命令去查看 Java 进程内存占用,由于 pmap 命令有点复杂而且很多内存映射是 anon 的,这里采用 jcmd 中的 VM.native_memory 命令,去看一下 JVM 内存的...
  • oracle学习笔记 PGA内存作用和构成

    千次阅读 2017-01-09 16:18:55
    oracle学习笔记 PGA内存作用和构成 从这节课开始讲oracle非常重要的一个内存结构PGA 一)pga也非常重要 oracle的内存分两大块 一块是SGA, 里面有六个池子 Shared pool,Streams pool,Large pool,Java pool,Database...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,765,806
精华内容 706,322
关键字:

内存的主要功能是什么