精华内容
下载资源
问答
  • 内存系列一:快速读懂内存条标签

    千次阅读 2018-12-08 13:14:00
    内存系列计划通过三篇文章由浅入深介绍内存的软硬件特性以及与固件的关系。这是第一篇,以一个生活情景给读者介绍内存的背景知识,为后面打下基础。 情景 小张有一定的计算机背景知识,最近他在京东上买了两条DDR3...
    内存是我们平常接触最频繁的计算机硬件之一,内存的大小、多寡和型号和我们计算机、手机等性能密切相关。内存系列计划通过三篇文章由浅入深介绍内存的软硬件特性以及与固件的关系。这是第一篇,以一个生活情景给读者介绍内存的背景知识,为后面打下基础。

    情景

    小张有一定的计算机背景知识,最近他在京东上买了两条DDR3的内存,打算把笔记本升级成8G。可是一拆开包装到就傻眼了:

     

     

    4GB看起来很好,两根刚好8GB。2Rx8是啥,PC3又是啥,10600似乎和他想买的1333的差好远,后面那串数字又代表什么呢?

    小张找到了我,让我帮忙给他说说这些字母和数字都代表什么。我最是好为人师,于是开始了我们今天的介绍。

    什么是DIMM?

    在80286时代,内存颗粒(Chip)是直接插在主板上的,叫做DIP(Dual In-line Package)。到了80386时代,换成1片焊有内存颗粒的电路板,叫做SIMM(Single-Inline Memory Module)。由阵脚形态变化成电路板带来了很多好处:模块化,安装便利等等,由此DIY市场才有可能产生。当时SIMM的位宽是32bit,即一个周期读取4个字节,到了奔腾时,位宽变为64bit,即8个字节,于是SIMM就顺势变为DIMM(Double-Inline Memory Module)。这种形态一直延续至今,也是内存条的基本形态。

    说到这里,小张着急了:”这和我的内存有啥关系?“。当然有关系,就是和10600S的S有关,现在DIMM分为很多种:

    RDIMM: 全称(Registered DIMM),寄存型模组,主要用在服务器上,为了增加内存的容量和稳定性分有ECC和无ECC两种,但市场上几乎都是ECC的。

    UDIMM:全称(Unbuffered DIMM),无缓冲型模组,这是我们平时所用到的标准台式电脑DIMM,分有ECC和无ECC两种,一般是无ECC的。

    SO-DIMM:全称(Small Outline DIMM),小外型DIMM,笔记本电脑中所使用的DIMM,分ECC和无ECC两种。

    Mini-DIMM:DDR2时代新出现的模组类型,它是Registered DIMM的缩小版本,用于刀片式服务器等对体积要求苛刻的高端领域。

    一般内存长度 133.35mm,SO-DIMM为了适应笔记本内狭小的空间,缩短为67.6mm而且一般为侧式插入。高度也有些变种,一般的内存条高度为30mm,VLP(Very Low Profile)降低为18.3mm,而ULP(Ultra Low Profile)更是矮化到17.8mm,主要是为了放入1U的刀片服务器中。

    大小关系如下图:

     

     

    小张这下知道10600S中S代表了SO-DIMM,看来大小没错。不过速度呢?

    DDR到DDR4

    为了照顾小张的急性子,我就跳过了SDRAM(Synchronous Dynamic random access memory)后DDR和Rambus/RDRAM争天下的故事。DDR SDRAM全称为Double Data Rate SDRAM,中文名为“双倍数据流SDRAM”。DDR SDRAM在原有的SDRAM的基础上改进而来。也正因为如此,DDR能够凭借着转产成本优势来打败昔日的对手RDRAM,成为当今的主流。顾名思义,和原本的SDRAM相比,DDR SDRAM一个时钟周期要传输两次数据:

     

     

    从DDR到DDR4主要的区别是在于传输速率的不同,随着时钟周期的不断降低,传输率也不断提高。还有电压也越来越低。有趣的是命名规则,大部分台式机DIMM厂商都会标注DDRx-yyy,x代表第几代,yyy代表数据传输率。而大部分的SO-DIMM和RDIMM等则标注PCx-zzzz,x还代表第几代,zzzz则代表最大带宽。因为DDR位宽为64位,8个字节,所以zzzz=yyy * 8,而yyy又是时钟的两倍。下面这张表是主要的各代DDR内存的速度:

     

    所以小张的内存条上的PC3-10600S代表DDR3,1333MHz的SO-DIMM。小张又问,那2R*8啥意思呢?

    RANK和BANK

    其实从外观上就可以看出来小张的内存条由很多海力士的内存颗粒组成。从内存控制器到内存颗粒内部逻辑,笼统上讲从大到小为:channel>DIMM>rank>chip>bank>row/column,如下图:

     

     

    一个现实的例子是:

     

    Channel-->通道(现在台式机也非常多双通道的了,服务器基本都是双通道)

    DIMM-->插槽

    rank-->排或面(现在的内存条大多是双面的,或者说是两排,rank1,rank2)

    chip-->芯片或者叫IC(一般一rank(面)上8个芯片,显卡上可能有16个芯片)

    bank-->层,这些bank共享一个memory I/O controller, 但是在每个bank内部的读写可以并行进行。

    row-->行,column-->(列)一层bank上就像excel的一张sheet表,例如16384rows*1024column

    在这个例子中,一个i7 CPU支持两个Channel(双通道),每个Channel上可以插俩个DIMM,而每个DIMM由两个rank构成,8个chip组成一个rank。由于现在多数内存颗粒的位宽是8bit,而CPU带宽是64bit,所以经常是8个颗粒可以组成一个rank。所以小张的内存条2R * 8的意思是由2个rank组成,每个rank八个内存颗粒。由于整个内存是4GB,我们可以算出单个内存颗粒是256MB。

    后记

    小张这下放心了,不过他提起看到过不少内存条上都有很多数字标记,如:

     

     

    这些是什么呢?其实,这是内存颗粒的时延(Latency)数据,如4-4-4-8, 5-5-5-15, 7-7-7-21, 或9-9-9-24,分别代表 CL-tRCD-tRP-tRAS的数据,越小越好。具体这些都是什么,就需要更深入的知识了,我们将会在下一篇硬件原理中讲到,而且我们还会在UEFI的memory reference code(MRC)部分再详细深入说明这些参数的具体使用。

    如果你和小张一样意犹未尽,在下一篇文章之前大家可以思考下面几个问题:

    1. 每一代内存条宽度都一样,会不会插错呢?[因为防呆口不同,所以不会插错]
    2. 从前面各代内存速度表可以看出,每一代和前一代带宽都有部分重复,这是为什么?[]
    3. 前一代和下一代如果带宽一样,那个performance更好呢?[单从带宽来讲是一样的]

    转载于:https://www.cnblogs.com/tcicy/p/10087392.html

    展开全文
  • 内存系列一:快速读懂内存条标签 内存是我们平常接触最频繁的计算机硬件之一,内存的大小、多寡和型号和我们计算机、手机等性能密切相关。内存系列计划通过三篇文章由浅入深介绍内存的软硬件特性以及与固件的关系。...

    内存系列一:快速读懂内存条标签

    内存是我们平常接触最频繁的计算机硬件之一,内存的大小、多寡和型号和我们计算机、手机等性能密切相关。内存系列计划通过三篇文章由浅入深介绍内存的软硬件特性以及与固件的关系。这是第一篇,以一个生活情景给读者介绍内存的背景知识,为后面打下基础。

    情景

    小张有一定的计算机背景知识,最近他在京东上买了两条DDR3的内存,打算把笔记本升级成8G。可是一拆开包装到就傻眼了:

     

     

    4GB看起来很好,两根刚好8GB。2Rx8是啥,PC3又是啥,10600似乎和他想买的1333的差好远,后面那串数字又代表什么呢?

    小张找到了我,让我帮忙给他说说这些字母和数字都代表什么。我最是好为人师,于是开始了我们今天的介绍。

    什么是DIMM?

    在80286时代,内存颗粒(Chip)是直接插在主板上的,叫做DIP(Dual In-line Package)。到了80386时代,换成1片焊有内存颗粒的电路板,叫做SIMM(Single-Inline Memory Module)。由阵脚形态变化成电路板带来了很多好处:模块化,安装便利等等,由此DIY市场才有可能产生。当时SIMM的位宽是32bit,即一个周期读取4个字节,到了奔腾时,位宽变为64bit,即8个字节,于是SIMM就顺势变为DIMM(Double-Inline Memory Module)。这种形态一直延续至今,也是内存条的基本形态。

    说到这里,小张着急了:”这和我的内存有啥关系?“。当然有关系,就是和10600S的S有关,现在DIMM分为很多种:

    RDIMM: 全称(Registered DIMM),寄存型模组,主要用在服务器上,为了增加内存的容量和稳定性分有ECC和无ECC两种,但市场上几乎都是ECC的。

    UDIMM:全称(Unbuffered DIMM),无缓冲型模组,这是我们平时所用到的标准台式电脑DIMM,分有ECC和无ECC两种,一般是无ECC的。

    SO-DIMM:全称(Small Outline DIMM),小外型DIMM,笔记本电脑中所使用的DIMM,分ECC和无ECC两种。

    Mini-DIMM:DDR2时代新出现的模组类型,它是Registered DIMM的缩小版本,用于刀片式服务器等对体积要求苛刻的高端领域。

    一般内存长度 133.35mm,SO-DIMM为了适应笔记本内狭小的空间,缩短为67.6mm而且一般为侧式插入。高度也有些变种,一般的内存条高度为30mm,VLP(Very Low Profile)降低为18.3mm,而ULP(Ultra Low Profile)更是矮化到17.8mm,主要是为了放入1U的刀片服务器中。

    大小关系如下图:

     

     

    小张这下知道10600S中S代表了SO-DIMM,看来大小没错。不过速度呢?

    DDR到DDR4

    为了照顾小张的急性子,我就跳过了SDRAM(Synchronous Dynamic random access memory)后DDR和Rambus/RDRAM争天下的故事。DDR SDRAM全称为Double Data Rate SDRAM,中文名为“双倍数据流SDRAM”。DDR SDRAM在原有的SDRAM的基础上改进而来。也正因为如此,DDR能够凭借着转产成本优势来打败昔日的对手RDRAM,成为当今的主流。顾名思义,和原本的SDRAM相比,DDR SDRAM一个时钟周期要传输两次数据:

     

     

    从DDR到DDR4主要的区别是在于传输速率的不同,随着时钟周期的不断降低,传输率也不断提高。还有电压也越来越低。有趣的是命名规则,大部分台式机DIMM厂商都会标注DDRx-yyy,x代表第几代,yyy代表数据传输率。而大部分的SO-DIMM和RDIMM等则标注PCx-zzzz,x还代表第几代,zzzz则代表最大带宽。因为DDR位宽为64位,8个字节,所以zzzz=yyy * 8,而yyy又是时钟的两倍。下面这张表是主要的各代DDR内存的速度:

     

    所以小张的内存条上的PC3-10600S代表DDR3,1333MHz的SO-DIMM。小张又问,那2R*8啥意思呢?

    RANK和BANK

    其实从外观上就可以看出来小张的内存条由很多海力士的内存颗粒组成。从内存控制器到内存颗粒内部逻辑,笼统上讲从大到小为:channel>DIMM>rank>chip>bank>row/column,如下图:

     

     

    一个现实的例子是:

     

    Channel-->通道(现在台式机也非常多双通道的了,服务器基本都是双通道)

    DIMM-->插槽

    rank-->排或面(现在的内存条大多是双面的,或者说是两排,rank1,rank2)

    chip-->芯片或者叫IC(一般一rank(面)上8个芯片,显卡上可能有16个芯片)

    bank-->层,这些bank共享一个memory I/O controller, 但是在每个bank内部的读写可以并行进行。

    row-->行,column-->(列)一层bank上就像excel的一张sheet表,例如16384rows*1024column

    在这个例子中,一个i7 CPU支持两个Channel(双通道),每个Channel上可以插俩个DIMM,而每个DIMM由两个rank构成,8个chip组成一个rank。由于现在多数内存颗粒的位宽是8bit,而CPU带宽是64bit,所以经常是8个颗粒可以组成一个rank。所以小张的内存条2R * 8的意思是由2个rank组成,每个rank八个内存颗粒。由于整个内存是4GB,我们可以算出单个内存颗粒是256MB。

    后记

    小张这下放心了,不过他提起看到过不少内存条上都有很多数字标记,如:

     

     

    这些是什么呢?其实,这是内存颗粒的时延(Latency)数据,如4-4-4-8, 5-5-5-15, 7-7-7-21, 或9-9-9-24,分别代表 CL-tRCD-tRP-tRAS的数据,越小越好。具体这些都是什么,就需要更深入的知识了,我们将会在下一篇硬件原理中讲到,而且我们还会在UEFI的memory reference code(MRC)部分再详细深入说明这些参数的具体使用。

    如果你和小张一样意犹未尽,在下一篇文章之前大家可以思考下面几个问题:

    1. 每一代内存条宽度都一样,会不会插错呢?[因为防呆口不同,所以不会插错]
    2. 从前面各代内存速度表可以看出,每一代和前一代带宽都有部分重复,这是为什么?[]
    3. 前一代和下一代如果带宽一样,那个performance更好呢?[单从带宽来讲是一样的]
    展开全文
  • java内存系列:测试JDK最大内存

    千次阅读 2015-01-25 19:15:37
    JDK各个版本在不同操作系统中支持的最大内存是不一样的,但是可以通过以下方法来进行测试。 c:>java -XmxXXXm(g) -version 其中,XXX为最大内存数值, m(g)是内存的计量单位,如果命令能够正确显示出jdk的...
     
    JDK各个版本在不同操作系统中支持的最大内存是不一样的,但是可以通过以下方法来进行测试。

    c:>java -XmxXXXm(g) -version

    其中,XXX为最大内存数值, m(g)是内存的计量单位,如果命令能够正确显示出jdk的版本等信息,说明当前jdk支持测试的最大内存

    数量,否则说明测试的内存超出了jdk支持的最大值。

    例如:我的系统是win7 64位
    Java代码 复制代码 收藏代码
    1. C:\Users\ThinkPad>java -Xmx16g -version   
    2. java version "1.6.0_30"  
    3. Java(TM) SE Runtime Environment (build 1.6.0_30-b12)   
    4. Java HotSpot(TM) 64-Bit Server VM (build 20.5-b03, mixed mode)  
    Java代码 复制代码 收藏代码
    1. C:\Users\ThinkPad>java -Xmx16g -version  
    2. java version "1.6.0_30"  
    3. Java(TM) SE Runtime Environment (build 1.6.0_30-b12)  
    4. Java HotSpot(TM) 64-Bit Server VM (build 20.5-b03, mixed mode)  
    C:\Users\ThinkPad>java -Xmx16g -version
    java version "1.6.0_30"
    Java(TM) SE Runtime Environment (build 1.6.0_30-b12)
    Java HotSpot(TM) 64-Bit Server VM (build 20.5-b03, mixed mode)


    支持不了的时候就会报错了
    Java代码 复制代码 收藏代码
    1. C:\Users\ThinkPad>java -Xmx16000g -version   
    2. Error occurred during initialization of VM   
    3. Could not reserve enough space for object heap   
    4. Could not create the Java virtual machine.  
    Java代码 复制代码 收藏代码
    1. C:\Users\ThinkPad>java -Xmx16000g -version  
    2. Error occurred during initialization of VM  
    3. Could not reserve enough space for object heap  
    4. Could not create the Java virtual machine.  
    C:\Users\ThinkPad>java -Xmx16000g -version
    Error occurred during initialization of VM
    Could not reserve enough space for object heap
    Could not create the Java virtual machine.


    一般在32位机器上,该最大值位于1.5G-2G之间,在64位机器上面应该没啥限制,经测试写16G也能正常得出版本信息

    转载自:黑色头发:http://heisetoufa.iteye.com/
    width="468" height="60" src="http://qingfeng825.iteye.com/iframe_ggbd/794" frameborder="0" scrolling="no">
    展开全文
  • 基于boost的共享内存系列-map

    千次阅读 2017-07-01 16:40:01
    背景:将自定义的map类型以共享内存的方式进行保留,以进行进程间通信。方案设计:map是容器的一种,而如果其key或者value也是容器的话,则该问题可以视为容器中的容器问题。如果在容器中又包含了容器的话,那么每个...

    背景:

    将自定义的map类型以共享内存的方式进行保留,以进行进程间通信。

    方案设计:

    map是容器的一种,而如果其key或者value也是容器的话,则该问题可以视为容器中的容器问题。如果在容器中又包含了容器的话,那么每个容器都是需要一个allocator。为避免使用数个复杂定义的分配器,我们可以使用空分配器提供的类型擦除和隐式转换空分配器至其他类型的能力。
    实现过程:
    创建共享内存片段managed_shared_memory::segment_manager;
    为共享内存片段创建分配器,这是为了在堆内存中分配空间。如果整个map中不涉及到堆空间的操作,而是仅仅用到int,char[]等(不涉及new操作)在栈空间的数据话,是无需采用分配器的。

    代码实现:

    write端代码:

    #include <boost/interprocess/managed_shared_memory.hpp>
    #include <boost/interprocess/allocators/allocator.hpp>
    #include <boost/interprocess/containers/map.hpp>
    #include <boost/interprocess/containers/vector.hpp>
    #include <boost/interprocess/containers/string.hpp>
    #include <boost/lexical_cast.hpp>
    #include<iostream>
    using namespace boost::interprocess;
    
    //Typedefs of allocators and containers
    typedef managed_shared_memory::segment_manager                       segment_manager_t;
    typedef allocator<void, segment_manager_t>                           void_allocator;
    typedef allocator<int, segment_manager_t>                            int_allocator;
    typedef vector<int, int_allocator>                                   int_vector;
    typedef allocator<int_vector, segment_manager_t>                     int_vector_allocator;
    typedef vector<int_vector, int_vector_allocator>                     int_vector_vector;
    typedef allocator<char, segment_manager_t>                           char_allocator;
    typedef basic_string<char, std::char_traits<char>, char_allocator>   char_string;
    
    class complex_data
    {
       public:
           int               id_;
           char_string       char_string_;
           int_vector_vector int_vector_vector_;
    
       public:
       //Since void_allocator is convertible to any other allocator<T>, we can simplify
       //the initialization taking just one allocator for all inner containers.
       complex_data(int id, const char *name, const void_allocator &void_alloc)
          : id_(id), char_string_(name, void_alloc), int_vector_vector_(void_alloc)
       {}
       //Other members...
    };
    
    //Definition of the map holding a string as key and complex_data as mapped type
    typedef std::pair<const char_string, complex_data>                      map_value_type;
    typedef std::pair<char_string, complex_data>                            movable_to_map_value_type;
    typedef allocator<map_value_type, segment_manager_t>                    map_value_type_allocator;
    typedef map< char_string, complex_data
               , std::less<char_string>, map_value_type_allocator>          complex_map_type;
    
    typedef map< char_string, complex_data
               , std::less<char_string>, map_value_type_allocator>::iterator complex_map_type_iter;
    
    int main ()
    {
       //Remove shared memory on construction and destruction
    //   struct shm_remove
    //   {
    //      shm_remove() { shared_memory_object::remove("MySharedMemory"); }
    //      ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
    //   } remover;
    //根据具体情况确实是否需要对内存数据进行remove操作。本文的写进程和读进程是分开的,所以保留缓存中的数据。
    
    //   //Create shared memory
       managed_shared_memory segment(create_only,"MySharedMemory",65536);
    
    
       //write------begin-----------
       //An allocator convertible to any allocator<T, segment_manager_t> type
       void_allocator alloc_inst (segment.get_segment_manager());
       //Construct the shared memory map and fill it
       complex_map_type *mymap = segment.construct<complex_map_type>
          //(object name), (first ctor parameter, second ctor parameter)
             ("MyMap")(std::less<char_string>(), alloc_inst);
    
       for(int i = 0; i < 50; ++i)
       {
          //Both key(string) and value(complex_data) need an allocator in their constructors
          char_string  key_object(alloc_inst);
          std::string temp = "key" + boost::lexical_cast< std::string >(i);
          key_object=temp.c_str();
          temp = "default_name_" + boost::lexical_cast<std::string>(i);
          complex_data mapped_object(i, temp.c_str(), alloc_inst);
          map_value_type value(key_object, mapped_object);
          //Modify values and insert them in the map
          mymap->insert(value);
       }
       //write------end-----------
       return 0;
    }
    

    在read的时候注意迭代器的使用。
    read端代码:

    #include <boost/interprocess/managed_shared_memory.hpp>
    #include <boost/interprocess/allocators/allocator.hpp>
    #include <boost/interprocess/containers/map.hpp>
    #include <boost/interprocess/containers/vector.hpp>
    #include <boost/interprocess/containers/string.hpp>
    #include <boost/lexical_cast.hpp>
    #include<iostream>
    using namespace boost::interprocess;
    
    //Typedefs of allocators and containers
    typedef managed_shared_memory::segment_manager                       segment_manager_t;
    typedef allocator<void, segment_manager_t>                           void_allocator;
    typedef allocator<int, segment_manager_t>                            int_allocator;
    typedef vector<int, int_allocator>                                   int_vector;
    typedef allocator<int_vector, segment_manager_t>                     int_vector_allocator;
    typedef vector<int_vector, int_vector_allocator>                     int_vector_vector;
    typedef allocator<char, segment_manager_t>                           char_allocator;
    typedef basic_string<char, std::char_traits<char>, char_allocator>   char_string;
    
    class complex_data
    {
       public:
           int               id_;
           char_string       char_string_;
           int_vector_vector int_vector_vector_;
    
       public:
       //Since void_allocator is convertible to any other allocator<T>, we can simplify
       //the initialization taking just one allocator for all inner containers.
       complex_data(int id, const char *name, const void_allocator &void_alloc)
          : id_(id), char_string_(name, void_alloc), int_vector_vector_(void_alloc)
       {}
       //Other members...
    };
    
    //Definition of the map holding a string as key and complex_data as mapped type
    typedef std::pair<const char_string, complex_data>                      map_value_type;
    typedef std::pair<char_string, complex_data>                            movable_to_map_value_type;
    typedef allocator<map_value_type, segment_manager_t>                    map_value_type_allocator;
    typedef map< char_string, complex_data
               , std::less<char_string>, map_value_type_allocator>          complex_map_type;
    
    typedef map< char_string, complex_data
               , std::less<char_string>, map_value_type_allocator>::iterator complex_map_type_iter;
    
    int main ()
    {
       //read------begin------
       //Find the vector using the c-string name
       managed_shared_memory segment(open_only,"MySharedMemory");
       complex_map_type *myvector = segment.find<complex_map_type>("MyMap").first;
       complex_map_type_iter iter;
    
       //print the result
       std::cout<<"size of map="<<myvector->size()<<std::endl;
    
       for (iter = myvector->begin(); iter != myvector->end(); ++iter)
       {
           std::cout <<"key:"<< iter->first <<std::endl;
           std::cout<<"value:"<<iter->second.id_<<","<<iter->second.char_string_<<std::endl;
       }
       //write------end-------
    
       return 0;
    }
    

    read运行结果如下:
    这里写图片描述

    参考资料:

    http://www.boost.org/doc/libs/1_49_0/doc/html/interprocess/allocators_containers.html

    展开全文
  • 点击学习匿名共享内存
  • 终于下定决心自己写一个系列来总结一下关于内存的种种知识点。对于内存,很多同学都是持有敬而远之的态度。在上大学的时候没有打牢基础,在平常也不关心内存的使用,反正只要写出的代码能够运行,没有报错就万事大吉...
  • 内存相关系列

    2014-11-19 10:40:06
    待编辑
  • 自动内存管理内存分配:内存分配和回收策略java技术体系中所提倡的自动内存管理最终可以归结为自动化解决了两个问题:给对象分配内存以及回收分配给对象的内存。,关于内存的回收,之前我们已经使用了大量的篇幅介绍...
  • 1.1内存溢出和内存泄漏 2.内存溢出 2.1 栈溢出 2.2堆溢出 2.3永久代溢出 2.4 java常见的几种内存溢出及解决方法 3.内存泄漏 3.1为什么会产生内存泄漏 3.2 解决方式 1.介绍 作为一个Java开发者,想必大家都...
  • Java内存模型系列简介

    2017-07-21 18:33:10
    java内存模型要点摘要
  • 内存是计算机的重要组成部分,它是一种物理介质,它的存取速度介于cpu与磁盘之间。它的主要作用是用来交换数据,即将磁盘组的数据通过内存读入cpu,同时将cpu操作后的数据通过内存写入磁盘。 在当下的Linux中,内存...
  • JVM系列之Java内存区域

    万次阅读 2020-06-04 22:18:00
    对于Java开发者来说,在虚拟机的自动内存管理机制下,不需要去关心每个对象的存亡,只需要创建出来就完全扔给了虚拟机去处理,而且还不容易出现内存泄露和内存溢出的问题,这看起来很美好,但是如果一旦出现内存泄露...
  • Android性能优化系列内存优化

    万次阅读 2017-01-21 21:00:45
    内存的释放是由垃圾收集器(Garbage Collection,GC)完成的,程序员不需要通过调用函数来释放内存,但也随之带来了内存泄漏的可能,上篇博客,我介绍了 Android性能优化系列之布局优化,本篇博客,我将介绍内存优化...
  • 内存调试系列

    千次阅读 2008-07-25 11:53:00
    http://www.ibm.com/developerworks/cn/linux/l-cn-memleak/index.htmlhttp://www.ibm.com/developerworks/cn/aix/library/au-memorytechniques.html
  • 做了较长时间的android开发了,发现其实android应用开发入门容易,但是进阶或者成为高级工程师,需要具备的基础能力还是非常高的:性能优化、内存泄露、apk瘦身、热修复等等,这些都非常的考验一个人的能力。...
  • 内存系列内存池设计与应用

    千次阅读 2012-05-12 21:46:50
    其实内存池的作用大家也知道,一般是解决大量的new和delete频繁操作引起的内存碎片,效率是一方面,另外长时间后的安全性也是一个问题。曾经看过《C++应用程序性能优化》里面的内存池结构,也看过ACE自己的自增式...
  • C语言系列内存操作

    千人学习 2015-06-25 15:26:24
    尹成老师带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、...
  • 日期 内核版本 CPU架构 作者 2019.04.06 Linux-4.4 PowerPC LoneHugo 系列文章:...Linux在Boot阶段采用Memblock内存块节点来管理物理内存,系统启动早期通过对dt...
  • SUN的jvm内存池被划分为以下几个部分: Eden Space (heap) 内存最初从这个线程池分配给大部分对象。 Survivor Space (heap) 用于保存在eden space内存池中经过垃圾回收后没有被回收的对象。 Tenured Generation...
  • 最近在公司看一个算比较大的android项目的源码,发现了一个很严重的问题,就是项目里使用单例模式,构造函数要传入Context做参数的类,基本上都存在内存泄露问题。我想这个项目这么多人做也没有人发现问题,这问题...
  • Android内存检测工具系列工具集

    千次阅读 2018-12-24 21:02:49
    Android内存检测工具系列工具集 Android关于内存的工具不少,灵活地选择工具就显得特别重要。在此特别推荐分享涵盖一定初步和定位能力的工具,可以让我们一步到位地分析问题,提升效率。 在此列举几项: ...
  • 深入理解java内存模型系列文章是本人在InfoQ发表的并发编程的连载文章。 深入理解java内存模型(一)——基础深入理解java内存模型(二)——重排序深入理解java内存模型(三)——顺序一致性深入理解java内存...
  • SUN的jvm内存池被划分为以下几个部分: Eden Space (heap) 内存最初从这个线程池分配给大部分对象。 Survivor Space (heap) 用于保存在eden space内存池中经过垃圾回收后没有被回收的对象。 Tenured Generation...
  • 在前面介绍了system v 共享内存的相关知识,现在来稍微看看posix 共享内存系列函数。 共享内存简单来说就是一块真正的物理内存区域,可以使用一些函数将这块区域映射到进程的地址空间进行读写,而posix 共享内存...
  • 深入理解Java内存模型(一)——基础深入理解Java内存模型(二)——重排序深入理解Java内存模型(三)——顺序一致性深入理解Java内存模型(四)——volatile深入理解Java内存模型(五)——锁深入理解Java内存模型...
  • 深入解读Linux内存管理系列(总览)

    千次阅读 2019-04-06 15:19:32
    日期 内核版本 CPU架构 作者 2019.04.06 Linux-4.4 PowerPC LoneHugo 系列文章 ... 深入解读Linux内存管理系列(2)——内存节点的添加 识别并添加物理内存,初始...
  • 一、虚拟内存术语  虚拟内存   在存储分配机制中,尽管备用地址是主内存的一部分,它也可以被寻址。程序引用内存使用的地址与内存系统用于识别的物理地址是不同的,程序生成的地址会自动转化为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,382
精华内容 12,152
关键字:

内存系列