你必须知道的261个java语言问题——第三弹

1.String、StringBuffer、StringBuilder有什么区别

String类代表定长字符串,其内容在创建之后是不可更改的,由于String的不可变特性,该类是线程安全的

StringBuffer代表可变长字符串缓冲区,通过特定的方法可以改变字符串的内容和长度,它是线程安全的

StringBuilder是StringBuffer的一个等价类,具有相似的方法,但是该类是非线程安全的

通过intern方法可由StringBuffer或StringBuilder转化为String,同过append方法可在字符串末尾添加内容。

2.Windows下的内存是如何管理的?

  Windows提供了3种方法来进行内存管理:

虚拟内存,最适合用来管理型对象或者结构数组

内存映射文件,最适合用来管理数据(通常来自文件)以及在单个计算机上运行多个进程之间共享数据

内存堆栈,最适合用来管理量的小对象;

  Windows操纵内存可以分两个层面:物理内存和虚拟内存。

  其中物理内存由系统管理,不允许应用程序直接访问,应用程序可见的只有一个2G地址空间,而内存分配是通过进行的。对于每个进程都有自己的默认堆,当一个堆创建后,就通过虚拟内存操作保留了相应小的地址块(不占有实际的内存,系统消耗很小)。当在堆上分配一块内存时,系统在堆的地址表里找到一个空闲块(如果找不到,且堆创建属性是可扩充的,则扩充堆小),为这个空闲块所包含的所有内存页提交物理对象(在物理内存上或硬盘的交换文件上),这时就可以访问这部分地址。提交时,系统将对所有进程的内存统一调配,如果物理内存不够,系统试图把一部分进程暂时不访问的页放入交换文件,以腾出部分物理内存。释放内存时,只在堆中将所在的页解除提交(相应的物理对象被解除),继续保留地址空间。

  如果要知道某个地址是否被占用/可不可以访问,只要查询此地址的虚拟内存状态即可。如果是提交,则可以访问。如果仅仅保留,或没保留,则产生一个软件异常。此外,有些内存页可以设置各种属性。如果是只读,向内存写也会产生软件异常。

原文地址:https://www.cnblogs.com/mengyan/p/2716038.html