Java内存溢出的情况

1、java.lang.OutOfMemoryError:Java heap space

Java应用程序在启动时会指定所需要的内存大小,它被分割成两个不同的区域:Heap space(堆空间)Permgen(永久代)

JVM内存模型示意图

这两个区域的大小可以在JVM(Java虚拟机)启动时通过参数

1
-Xmx

Read More

性能瓶颈

一个好的程序,应该是能够充分利用CPU。如果一个程序在单CPU的机器上无论在多大的压力下都无法令CPU的使用率接近100% ,说明这个程序设计地有问题。

常见的性能瓶颈

不恰当的同步导致的资源占用

  • 锁加得不恰当

  • 锁粒度过大

Read More

操作系统是如何实现虚拟内存的

要明白操作系统是如何实现虚拟内存的,首先应该明白操作系统为什么要需要虚拟内存

为什么需要虚拟内存

早期的程序中访问的内存地址都是实际的物理内存地址。

程序需要加载在内存上运行,即形成进程。起初,只有一个进程信息可以被加载到内存,需要运行另一个进程时,需要将当前进程的信息先存储到磁盘上,然后从磁盘上读取另一个进程的信息。但是磁盘I/O是很慢的,导致任务切换的效率很低 。因此,人们希望将多个进程可以共同存放在内存上,这就出现了一个问题:如何避免一个进程读取、篡改另一个进程的内存信息,即对进程间实现隔离保护

同时,程序在编写时,其访问数据和指令跳转时的目标地址很多是固定的。但是程序在加载在内存时,不可能说每次我们都能够分配固定地址的内存给它。尤其是在我们想运行同一程序的多个实例的时候,由于同一程序使用的物理地址是一样的,一起运行就会有冲突。

另外,程序使用的内存会被物理内存所限制,即程序使用的内存不能超过物理内存。

Read More