为您找到与内存溢出跟内存泄漏的区别相关的共200个结果:
在现如今这个电子信息时代,几乎每个人都离不开网络、离不开电子产品,而内存在电子产品里有至关重要的作用,几乎所有的程序都是需要内存来处理的,当我们使用电子产品时,所进行的程序太多或者太大,也就是内存太满,处理不了的时候,电子产品就会出现没有反应、反应慢,没法创建新的进程等等好多问题。这些常常是因为我们没有良好的编码习惯和规范,就会造成我们常说的内存泄露和内存溢出。
内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。 为了便于理解我们可以有个形象的比喻就是“操作系统可提供给所有进程的存储空间正在被某个进程榨干”,最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃。所以“内存泄漏”是从操作系统的角度来看的。这里的存储空间并不是指物理内存,而是指虚拟内存大小,这个虚拟内存大小取决于磁盘交换区设定的大小。由程序申请的一块内存,如果没有任何一个指针指向它,那么这块内存就泄漏了。
内存泄露指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。 为了便于理解,我们不妨打个比方。缓冲区溢出好比是将十磅的糖放进一个只能装五磅的容器里。一旦该容器放满了,余下的部分就溢出在柜台和地板上,弄得一团糟。由于计算机程序的编写者写了一些编码,但是这些编码没有对目的区域或缓冲区——五磅的容器——做适当的检查,看它们是否够大,能否完全装入新的内容——十磅的糖,结果可能造成缓冲区溢出的产生。如果打算被放进新地方的数据不适合,溢得到处都是,该数据也会制造很多麻烦。但是,如果缓冲区仅仅溢出,这只是一个问题。到此时为止,它还没有破坏性。当糖溢出时,柜台被盖住。可以把糖擦掉或用吸尘器吸走,还柜台本来面貌。与之相对的是,当缓冲区溢出时,过剩的信息覆盖的是计算机内存中以前的内容。除非这些被覆盖的内容被保存或能够恢复,否则就会永远丢失。发生内存泄漏的程序很多,但是要想产生一定的后果,就需要这个进程是无限循环的,是个服务进程。当然,内核也是无限循环的,所以,如果内核发生了内存泄漏,情况就更加不妙。 内存泄露的问题其困难在于1.编译器不能发现这些问题。2.运行时才能捕获到这些错误,这些错误没有明显的症状,时隐时现。3.对于手机等终端开发用户来说,尤为困难。 内存泄露的解决方法:第一,良好的编码习惯,尽量在涉及内存的程序段,检测出内存泄露。当程式稳定之后,在来检测内存泄露时,无疑增加了排除的困难和复杂度。第二,重载 new 和 delete。这也是大家编码过程中常常使用的方法。
内存溢出的解决方法:关掉软件、或者重启电脑,释放一部分内存。
有了以上这么多的了解,小编相信大家在以后使用电子产品时会少很多疏忽和错误,而且,在碰到这些常见的问题时也会有基本的解决方法。不过,相比较其他产品,电子产品比较专业化,而且,随着是时代的进步,更新、淘汰的比较快,还是需要定期请专业人士帮我们检查、更新,释放内存,这样,对我们以后的使用会减少很多不必要的麻烦,也会延长这些电子产品的寿命。
浏览量:2
下载量:0
时间:
你们知道内存条的单双面区别在哪里吗?下面是读文网小编带来内存条单面双面有什么区别的内容,欢迎阅读!
单面内存就一定比双面内存好,或者一定要在两者之间区分伯仲。单、双面内存它们的本身没有好坏,区别也很小,只不过看哪种封装被主板芯片组支持的更好罢了。不可否认的一点是,同等容量的内存,单面比双面的集成度要高,生产日期要靠后,所以工作起来就更稳定。
由于现在的内存工厂良率越来越高,所以单面就可以做成512MB等等的内存,以前只可以用双面颗粒才可以达到这样的效果。其实,性能上是没什么差异的。不过根据以往的经验来看,单面内存更好超频,双面内存兼容性更好。
浏览量:2
下载量:0
时间:
想知道单面的内存条和双面的内存条具体有什么区别吗?下面是读文网小编带来内存条单面和双面的有什么区别吗的内容,欢迎阅读!
那这是不是意味着单面内存不好呢?答案是否定的,上述问题的罪魁祸首应该是INTEL芯片的SDRAM识别技术,VIA、ALI、SIS大部分芯片的主板就没有问题。不过现在内存厂商考虑兼容性的问题,已经不生产单面256M的产品了,所以用户一般不用考虑此环节。
另外如果在INTEL815芯片组的主板(如ASUS CUSL2)上插三条现代双面128M的内存,系统就会自动把内存的时钟频率降到PC100来使用,而且使用过程中很不稳定,经常死机。出现这种情况是因为,INTEL815E芯片虽然有三个DIMM槽,但最多同时支持4组Bank运行在PC133状态下,如果超过四组就会自动降至PC100。所以上述问题如果换用三条单面128M的内存就迎刃而解。
我们再以kingmax为例。对比KingMax PC150 128M两个版本的产品(MPGA83S-68KX3 单面128M和MPGA83S-88KX3 双面128M),从外形上不难发现,凡1.0版的内存采用的都是16M×8,即单面八片结构的,而1.2版本的则是8MB×8即双面十六片结构。
浏览量:4
下载量:0
时间:
想知道内存条的大小有什么区别吗,下面是读文网小编带来笔记本内存条大小有什么区别的内容,欢迎阅读!
目前内存的类型主要有3种:SDRAM(同步动态随即存取存储器)、DDRAM(双倍传输速度随即存取存储器,简称DDR)、RDRAM(总线式动态随即存取存储器),目前SDRAM基本被淘汰,只有那种老一点的电脑是SDRAM
SDRAM的内存条上(就是那一排插槽的地方)中间有2条用来间隔的空隙
DDRAM的内存条上中间只有1条用来间隔的空隙。
RDRAM内存条插槽,找个卖电脑的或到电脑商城什么的地方问一下就可以了。 一块主板不能同时支持SDRAM和DDRAM这两种型号。 DDRAM和SDRAM的也好象不能 你可以到中关村在线查一下,支持什么样的内存 http://www.zol.com.cn/ 直接输入主板型号,查主板参数就可以找到 DDR 内存是看起来是竖着一片一片的长方体内存颗粒. DDR2 内存看起来内存颗粒是小些,横着正方体的. DDR 和DDR2的缺口的位置都不一样,缺口不同, DDR 分:133 266 333 400 DDR2 分: 533 667等
浏览量:11
下载量:0
时间:
你们知道内存条有什么区别吗,下面是读文网小编带来电脑内存条有什么区别的内容,欢迎阅读!
如果要我说哪种内存条最好区分,我会选DDR1,也就是一代内存条。这种内存条的内存颗粒足足有二代三代的两倍,一看就知道是落后工艺,旧时代的产品。配有一代内存的电脑,不用说,cpu肯定是单核的,配着IDE接口的硬盘,看个视频都无法流畅观看,这种电脑,好几年前就已经淘汰了。
仔细看看内存条上的标签,首先,这是一条金士顿牌子的内存条,频率为400MHZ,容量只有512M,也就是0.5G。频率才是关键。一代内存条的频率有333MHZ和400MHZ,所以标签上的“400”就足以证明它是一代内存条。容量不是关键,一代内存条有1G容量的,三代内存条也有1G容量的。
一代内存条尚且可以凭外观判断。二代和三代很相似,接口长短也差不多,保险点,还是看标签吧!
一看到"800"字样,我就可以认定这是一条二代内存条。二代内存条有533,667,800三种频率。它们都属于二代内存条,外观,接口都是一样的,相互兼容,可以共用。只不过高频率的内存条要迁就低频率的内存条。假如一台电脑上同时插有800MHZ和533MHZ的两条内存条,那电脑就只能工作在533MHZ频率下,性能上会有点折损。
三代内存条的频率一般有1066,1333,1600,2133,用得比较多的是1333,1600。我并不太清楚为什么会是这两种频率的内存条比较流行,我并没有去过问。反正让我见到1333,1600字样,我就知道是三代内存条了。
上面的“较长”内存条是台式机电脑用的。笔记本内存条为了适应笔记本的大小,做成短的。主要辨别方法也是看标签。
笔记本的内存条相信是比较容易区分一二三代的。只需看“PC”这个字样就OK了。“PC”代表一代,“PC2”代表二代,“PC3”代表三代。为什么ddr400后面的频率是200MHZ呢,因为DDR是双倍速率的,实际速率还是400MHZ.
仔细看看这条三代的笔记本内存条。
当然,正在使用的电脑,想要知道内存条的类型,不需要把内存条拔出来。只需借助一些硬件检测软件,可以很方便地查看内存条的容量,频率。瞧瞧我用“腾讯电脑管家”的“硬件检测”工具检测出来的内存信息。可以看出,我的内存条是三代2G的内存条。
最重要的一点,如果你打算换一条容量更大的内存条,或者加一条内存条,必须要知道自己电脑用的是哪一代的内存条,一台电脑只能用同一代的内存,搞错了,就白费工夫了。品牌倒不是很要紧,很少见到有不兼容的,金士顿和三星的内存条兼容性会比较好。
浏览量:3
下载量:0
时间:
Java是由Sun Microsystems公司推出的Java面向对象程序设计语言(以下简称Java语言)和Java平台的总称。下面是读文网小编带来的关于java内存溢出如何产生的内容,欢迎阅读!
java虚拟机规范规定的java虚拟机内存其实就是java虚拟机运行时数据区,其架构如下:
其中方法区和堆是由所有线程共享的数据区。
Java虚拟机栈,本地方法栈和程序计数器是线程隔离的数据区。
Java官方定义: http://www.98ki.com/servlet/HomeServlet?method=get&id=53
Java各内存区域分析: http://www.98ki.com/servlet/HomeServlet?method=get&id=43
通过分析各个区域的内容我们分别写出各个区域的内存溢出实例
堆溢出
由Java的官方文档我们可以看出,Java堆中存放:对象、数组。下面以不断创建对象为例:
Exception in thread "main"java.lang.OutOfMemoryError: Java heap space
public class HeapLeak {
public static void main(String[] args){
ArrayList list = new ArrayList ();
while ( true ){
list.add( new HeapLeak.method()) ;
}
}
static class method{
}
}
栈溢出
从Java官方API中我们知道,栈中存储:基本数据类型,对象引用,方法等。下面以无限递归创建方法和申请栈空间为例,分别演示栈的stackOverflow和OutOfMemory
l Exception in thread "main" java.lang.StackOverflowError
package Memory;
public class StackLeak {
public static void main(String[] args){
method ();
}
public static void method (){
method ();
}
}
l Exception in thread "main"java.lang.OutOfMemoryError: unable to create new native thread
package Memory;
public class StackOutOfMemory {
public static int count = 1;
public void noStop() {
while ( true ) {
}
}
public void newThread() {
while ( true ) {
Thread t = new Thread( new Runnable() {
public void run() {
System. out .println( " 已创建第 " + count +++ " 个线程 " );
noStop();
}
});
t.start();
}
}
public static void main(String[] args){
new StackOutOfMemory().newThread();
}
}
Java hotspot虚拟机中一个线程占用内存可通过-Xss设置,而能创建的线程数计算方法为:
可创建线程数=(物理内存-Os预留内存-堆内存-方法区内存)/单个线程大小
在测试的时候这里还有点小插曲,电脑强关了一次,因为把-Xss设置成了2M,内存使用增加到97%左右,操作系统死了,这个进程不断在创建线程,但是并没有因为内存不足而停下来,直到电脑完全死掉也没有报出错误信息。最后分析是因为电脑空闲内存还有600M,在线程还没有创建完的时候,已经开启的线程太多,在死之前大概能开到200多个,对内存大量消耗,造成系统挂掉。
这里又出现一个有趣的现象,当线程顺序创建到第88个的时候,count跳了很多,并且开始无序,有兴趣的可以深入学习一下线程方面的问题,我也会在后面的博客分析这个问题。
而换成200M的时候,创建第二个线程的时候就报了OutOfMemory.不管Xss设置多少,报错之后,程序都会一直走下去,执行已开线程中的任务。
常量池溢出
从Java官方API中我们知道,常量区代表运行时每个class文件中的常量表。它包括几种常量:编译期的数字常量、方法或者域的引用(在运行时解析)。runtime constant pool的功能类似于传统编程语言的符号表,尽管它包含的数据比典型的符号表要丰富的多。
下面以不断添加Stirng为例:
Exception in thread "main"java.lang.OutOfMemoryError: PermGen space
常量池在方法区中,首先设置持久代大小,使其不可扩展。
然后需要做的就不停地往方法区中加字符串。其中intern()就是查看方法区中有没有这个字符串,没有的话就加进去,如果这里不用intern(),字符串是存在堆里的,会报heapOutOfMemory.
这里需要注意的是,在 HotSpot 中,方法区是在堆的持久代中的。
package Memory;
import java.util.ArrayList;
public class ConstantPoolLeak {
public static void main(String[] args) {
int count = 0;
ArrayList list = new ArrayList ();
while ( true )
list.add(String. valueOf (count++).intern()) ;
}
}
方法区溢出
从Java官方API中我们知道,方法区存放每个Class的结构,比如说运行时常量池、域、方法数据、方法体、构造函数、包括类中的专用方法、实例初始化、接口初始化。
Java的反射和动态代理可以动态产生Class,另外第三方的CGLIB可以直接操作字节码,也可以动态产生Class,下面通过CGLIB来演示。
import java.lang.reflect.Method;
public class MethodAreaLeak {
public static void main(String[] args){
while ( true ){
Enhancer enhancer = new Enhancer ();
enhancer.setSuperClass(OOMObject. class );
enhancer.setUseCache( false );
enhancer.setCallback( new MethodInterceptor (){
public Object intercept(Object obj, Method method,Object[] args,
MethodProxy proxy) throws Throwable{
return proxy.invokeSuper(obj, args);
}
});
enhancer.create();
}
}
class OOMObject{
}
}
本机直接内存溢出
Java虚拟机可以通过参数-XX:MaxDirectMemorySize设定本机直接内存可用大小,如果不指定,则默认与java堆内存大小相同。JDK中可以通过反射获取Unsafe类(Unsafe的getUnsafe()方法只有启动类加载器Bootstrap才能返回实例)直接操作本机直接内存。通过使用-XX:MaxDirectMemorySize=10M,限制最大可使用的本机直接内存大小为10MB,例子代码如下
package Memory;
import java.lang.reflect.Field;
public class DirectMemoryOOM {
private static final int _1MB = 1024 * 1024 * 1024;
public static void main(String[] args) throws Exception {
Field unsafeField = Unsafe . class .getDeclaredFields()[0];
unsafeField.setAccessible( true );
Unsafe unsafe = ( Unsafe ) unsafeField.get( null );
while ( true ) {
// unsafe 直接想操作系统申请内存
unsafe.allocateMemory( _1MB );
}
}
}
相关阅读推荐:
浏览量:2
下载量:0
时间:
Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言。下面是读文网小编带来的关于java项目内存溢出怎么解决的内容,欢迎阅读!
原因 :内存容易溢出可以说是因为在程序中有内存泄漏(memory leak)的问题,容易引起内存溢出的直接原因可以归结为代码质量问题,在内存中存在大量的对象,垃圾回收器不能回收,随着程序的不断运行,程序会创造更多的对象,这些对象之间存在一定的内联关系,所以不容易造成被java垃圾回收器回收。
以tomcat环境为例,其它WEB服务器如jboss,weblogic等是同一个道理。
一、java.lang.OutOfMemoryError: PermGen space PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,
这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,
它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对
PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,
这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小
超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法: 手动设置MaxPermSize大小修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128M"
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。
二、java.lang.OutOfMemoryError: Java heap space
#p#副标题#e#
浏览量:3
下载量:0
时间:
Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言。下面是读文网小编带来的关于java 内存溢出怎么解决的内容,欢迎阅读!
一、内存溢出类型
1、java.lang.OutOfMemoryError: PermGen space
JVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
一个最佳的配置例子:(经过本人验证,自从用此配置之后,再未出现过tomcat死掉的情况)
set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
2、java.lang.OutOfMemoryError: Javaheap space
第一种情况是个补充,主要存在问题就是出现在这个情况中。其默认空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。如果内存剩余不到40%,JVM就会增大堆到Xmx设置的值,内存剩余超过70%,JVM就会减小堆到Xms设置的值。所以服务器的Xmx和Xms设置一般应该设置相同避免每次GC后都要调整虚拟机堆的大小。假设物理内存无限大,那么JVM内存的最大值跟操作系统有关,一般32位机是1.5g到3g之间,而64位的就不会有限制了。
注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。
垃圾回收GC的角色
JVM调用GC的频度还是很高的,主要两种情况下进行垃圾回收:
当应用程序线程空闲;另一个是java内存堆不足时,会不断调用GC,若连续回收都解决不了内存堆不足的问题时,就会报out of memory错误。因为这个异常根据系统运行环境决定,所以无法预期它何时出现。
根据GC的机制,程序的运行会引起系统运行环境的变化,增加GC的触发机会。
为了避免这些问题,程序的设计和编写就应避免垃圾对象的内存占用和GC的开销。显示调用System.GC()只能建议JVM需要在内存中对垃圾对象进行回收,但不是必须马上回收。
一个是并不能解决内存资源耗空的局面,另外也会增加GC的消耗。
二、JVM内存区域组成
简单的说java中的堆和栈
java把内存分两种:一种是栈内存,另一种是堆内存
1。在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配;
2。堆内存用来存放由new创建的对象和数组
在函数(代码块)中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的内存空间;在堆中分配的内存由java虚拟机的自动垃圾回收器来管理
堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。缺点就是要在运行时动态分配内存,存取速度较慢;
栈的优势是存取速度比堆要快,缺点是存在栈中的数据大小与生存期必须是确定的无灵活性。
java堆分为三个区:New、Old和Permanent
GC有两个线程:
新创建的对象被分配到New区,当该区被填满时会被GC辅助线程移到Old区,当Old区也填满了会触发GC主线程遍历堆内存里的所有对象。Old区的大小等于Xmx减去-Xmn
java栈存放
栈调整:参数有+UseDefaultStackSize -Xss256K,表示每个线程可申请256k的栈空间
每个线程都有他自己的Stack
三、JVM如何设置虚拟内存
提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
提示:JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。
默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。
提示:假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。
简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,
这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了
提示:注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。
提示:设置NewSize、MaxNewSize相等,"new"的大小最好不要大于"old"的一半,原因是old区如果不够大会频繁的触发"主" GC ,大大降低了性能
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;
由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
解决方法:手动设置Heap size
修改TOMCAT_HOME/bin/catalina.bat
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
四、性能检查工具使用
定位内存泄漏:
JProfiler工具主要用于检查和跟踪系统(限于Java开发的)的性能。JProfiler可以通过时时的监控系统的内存使用情况,随时监视垃圾回收,线程运行状况等手段,从而很好的监视JVM运行情况及其性能。
1. 应用服务器内存长期不合理占用,内存经常处于高位占用,很难回收到低位;
2. 应用服务器极为不稳定,几乎每两天重新启动一次,有时甚至每天重新启动一次;
3. 应用服务器经常做Full GC(Garbage Collection),而且时间很长,大约需要30-40秒,应用服务器在做Full GC的时候是不响应客户的交易请求的,非常影响系统性能。
因为开发环境和产品环境会有不同,导致该问题发生有时会在产品环境中发生,通常可以使用工具跟踪系统的内存使用情况,在有些个别情况下或许某个时刻确实是使用了大量内存导致out of memory,这时应继续跟踪看接下来是否会有下降,
如果一直居高不下这肯定就因为程序的原因导致内存泄漏。
五、不健壮代码的特征及解决办法
1、尽早释放无用对象的引用。好的办法是使用临时变量的时候,让引用变量在退出活动域后,自动设置为null,暗示垃圾收集器来收集该对象,防止发生内存泄露。
对于仍然有指针指向的实例,jvm就不会回收该资源,因为垃圾回收会将值为null的对象作为垃圾,提高GC回收机制效率;
2、我们的程序里不可避免大量使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域;
String str = "aaa";
String str2 = "bbb";
String str3 = str + str2;//假如执行此次之后str ,str2以后再不被调用,那它就会被放在内存中等待Java的gc去回收,程序内过多的出现这样的情况就会报上面的那个错误,建议在使用字符串时能使用StringBuffer就不要用String,这样可以省不少开销;
3、尽量少用静态变量,因为静态变量是全局的,GC不会回收的;
4、避免集中创建对象尤其是大对象,JVM会突然需要大量内存,这时必然会触发GC优化系统内存环境;显示的声明数组空间,而且申请数量还极大。
这是一个案例想定供大家警戒
使用jspsmartUpload作文件上传,运行过程中经常出现java.outofMemoryError的错误,
检查之后发现问题:组件里的代码
m_totalBytes = m_request.getContentLength();
m_binArray = new byte[m_totalBytes];
问题原因是totalBytes这个变量得到的数极大,导致该数组分配了很多内存空间,而且该数组不能及时释放。解决办法只能换一种更合适的办法,至少是不会引发outofMemoryError的方式解决。参考:http://bbs.xml.org.cn/blog/more.asp?name=hongrui&id=3747
5、尽量运用对象池技术以提高系统性能;生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏,例如大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决一块释放一块的策略。
6、不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。可以适当的使用hashtable,vector 创建一组对象容器,然后从容器中去取那些对象,而不用每次new之后又丢弃
7、一般都是发生在开启大型文件或跟数据库一次拿了太多的数据,造成 Out Of Memory Error 的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。
浏览量:2
下载量:0
时间:
多磁头技术:通过在同一碟片上增加多个磁头同时的读或写来为硬盘提速,或同时在多碟片同时利用磁头来读或写来为磁盘提速,多用于服务器和数据库中心。下面是读文网小编带来的关于电脑内存和硬盘容量的区别是什么的内容,欢迎阅读!
移动硬盘移动硬盘可以提供相当大的存储容量,是一种较具性价比的移动存储产品。在大容量“闪盘”价格还仅初步被用户接受的情况下,移动硬盘能在用户可以接受的价格范围内,提供给用户较大的存储容量和不错的便性。市场中的移动硬盘能提供320GB、500GB、600G、640GB、900GB、1000GB(1TB)、1.5TB、2TB、2.5TB、3TB、3.5TB、4TB等,最高可达12TB的容量,可以说是U盘,磁盘等闪存产品的升级版,被大众广泛接受。移动硬盘的容量同样是以MB(兆)GB(1024兆)TB(1TB=1024G B)为单位的,1.8英寸移动硬盘大多提供10GB、20GB、40GB、60GB、80GB,2.5英寸的还有120GB、160GB、200GB、250GB、320GB、500GB、640GB、750GB,1000GB(1TB)的容量,3.5英寸的移动硬盘盒还有500GB、640GB、750GB、1TB、1.5TB、2TB的大容量,除此之外还有桌面式的移动硬盘,容量更达到4TB的超大容量。随着技术的发展,移动硬盘将容量越来越大,体积越来越小!
浏览量:2
下载量:0
时间:
内存条是电脑的脑子,运行快慢就看它了,那么台式机和笔记本的内存条有什么区别呢?下面由读文网小编给你做出详细的笔记本和台式机内存条区别说法介绍!希望对你有帮助!
笔记本和台式机的内存是有区别的。
给台式机配内存,要考虑如下几个方面:
1,内存类型。内存类型目前市面上常见的有三种,DDR1,DDR2,DDR3。这三种类型其实就是1,2,3代的区别,每一种适用的主板都是不通用的。所以你要确定你的主板适用什么类型的内存,才有选购的目标。
2,内存频率。知道内存类型之后,你需要关心的就是内存的频率。内存频率影响性能,当然是频率越高越好。其中DDR1最高的是400;DDR2最高的是800;DDR3目前主流是1333。当然也会有例外,比如说一些品质极好的内存在出厂时可以被超到更高的频率,所以也有DDR2内存把频率设置在1066出售的,这类内存普遍较昂贵。
3,内存容量。这个不用说了吧,自然是越大越好。容量的换算为1024KB=1MB;1024MB=1GB。
看了“笔记本和台式机内存条有什么区别”文章的还看了:
浏览量:3
下载量:0
时间:
内存条种类之间的区别 DDR2与DDR的区别 与DDR相比,DDR2最主要的改进是在内存模块速度相同的情况下,可以提供相当于DDR内存两倍的带宽。那么怎样区别内存条类型?下面读文网小编教大家一个简单的看内存识别电脑级别的方法。
内存条之间的种类的区别,本质上是速度不同,越新的内存种类速度越快。
然后,为了保证不插错,物理插槽也有不同。
下图是DDR三代内存的外观上的不同的对比。
1、DDR1代,最高到533。
2、DDR2代,最高到1066。
3、DDR3代,最高到2400左右。
4、DDR4代,从2400开始起步。
我们一般在电脑城买到的主流内存条有三大类:
一、SDRAM时代 由早期的66MHz,发展後来的100MHz、133MHz(这样的机器在个人的家庭不多见,但在一些公司里还可以看到,特别是那里老掉牙的公司)
它的特点就是有两个缺口的:如果你有这样的机的话,可以扔掉了,升级也没有用,用来上网都慢得惊人(跑ie都不怎么够内存),不要说是玩游戏。但是可以看看电影,打打字的。装个瑞星就跑不动了
二、DDR时代 2000年早期有DDR1代内存 有低端的PC266 DDR SRAM(133MHz时钟×2倍数据传输=266MHz带宽)在2002年购机的有DDR333内存的出现,属于一种过度,而DDR400内存成为当时的主流平台选配。一般这样的机可以玩一下Photoshop ,cad ,Flash,等中形软件,但是玩网络游戏还是不顺,而且一般来说,你得花点钱升级至1G内存的容量才是比较过得去
三、2000年后期(06-09年) DDR2成为主流内存 。DDR2内存拥有400、533、667MHz等不同的时钟频率。高端的DDR2内存将拥有800、1000MHz两种频率。我们一般都可以选800MHZ的,因为内存的价格并不差多少,几十元就可以换一个高速,这是一个不错的选择。这样的内存加一个双核低端CPU,都可以跑得很快,PRO-E,魔兽世界,热血江湖,等大形的软件和网络游戏都可以玩得很爽!!建议选KingMAX(创胜)的,我在我的机上测试过,快很多的!
四,DDR3
DDR3内存相对于DDR2内存,其实只是规格上的提高,并没有真正的全面换代的新架构。DDR3同DDR2接触针脚数目相同。但是防呆的缺口位置不同。DDR3在大容量内存的支持较好,而大容量内存的分水岭是4GB这个容量,4GB是32位操作系统的执行上限(不考虑PAE等等的内存映像模式,因这些32位元元延伸模式只是过渡方式,会降低效能,不会在零售市场成为技术主流)当市场需求超过4GB的时候,64位CPU与操作系统就是唯一的解决方案,此时也就是DDR3内存的普及时期。DDR3 UB DIMM 2007进入市场,成为主流时间点多数厂商预计会是到2010年。
下图为DDR2与DDR3的区别图
看过“ 怎样区别内存条类型 ”
浏览量:4
下载量:0
时间:
在存储器里以字节为单位存储信息,为正确地存放或取得信息,每一个字节单元给以一个唯一的存储器地址,称为物理地址(Physical Address),又叫实际地址或绝对地址。,读文网小编为大家介绍一下物理内存与虚拟内存(虚拟地址)的区别,供大家参考!
零碎的叫法常常来自与相对感觉深奥诙涩的虚拟内存概念。物理的东西,人们大多不去碰它,毕竟是实实在在存在的。而虚拟内存就经常有别冒名顶替的。“一个进程有4个GB的虚拟内存”这样的说法屡见不鲜,其实,这是混淆了4GB的进程地址空间和虚拟内存这两个概念。也算令一种解释吧,毕竟那4个GB也是见不着影的,也是虚拟的。
浏览量:2
下载量:0
时间:
内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是可以知道在什么时候或是在什么操作步骤上出现了异常,而且根据堆栈信息也很容易定位到程序中是某处出现了问题。内存溢出与锁表则不然,一般现象是操作一般时间后系统越来越慢,直到死机,但并不能明确是在什么操作上出现的,发生的时间点也没有规律,查看日志或查看数据库也不能定位出问题的代码。下面就由读文网小编为大家整理的溢出问题解决方法,供大家参考!
内存溢出虽然很棘手,但也有相应的解决办法,可以按照从易到难,一步步的解决。
第一步,就是修改JVM启动参数,直接增加内存。这一点看上去似乎很简单,但很容易被忽略。JVM默认可以使用的内存为64M,Tomcat默认可以使用的内存为128MB,对于稍复杂一点的系统就会不够用。在某项目中,就因为启动参数使用的默认值,经常报“OutOfMemory”错误。因此,-Xms,-Xmx参数一定不要忘记加。
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。在一个项目中,使用两个数据库连接,其中专用于发送短信的数据库连接使用DBCP连接池管理,用户为不将短信发出,有意将数据库连接用户名改错,使得日志中有许多数据库连接异常的日志,一段时间后,就出现“OutOfMemory”错误。经分析,这是由于DBCP连接池BUG引起的,数据库连接不上后,没有将连接释放,最终使得DBCP报“OutOfMemory”错误。经过修改正确数据库连接参数后,就没有再出现内存溢出的错误。
查看日志对于分析内存溢出是非常重要的,通过仔细查看日志,分析内存溢出前做过哪些操作,可以大致定位有问题的模块。
第三步,安排有经验的编程人员对代码进行走查和分析,找出可能发生内存溢出的位置。重点排查以下几点:
l 检查代码中是否有死循环或递归调用。
l 检查是否有大循环重复产生新对象实体。
l 检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
l 检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。
第四步,使用内存查看工具动态查看内存使用情况。某个项目上线后,每次系统启动两天后,就会出现内存溢出的错误。这种情况一般是代码中出现了缓慢的内存泄漏,用上面三个步骤解决不了,这就需要使用内存查看工具了。
内存查看工具有许多,比较有名的有:Optimizeit Profiler、JProbe Profiler、JinSight和Java1.5的Jconsole等。它们的基本工作原理大同小异,都是监测Java程序运行时所有对象的申请、释放等动作,将内存管理的所有信息进行统计、分析、可视化。开发人员可以根据这些信息判断程序是否有内存泄漏问题。一般来说,一个正常的系统在其启动完成后其内存的占用量是基本稳定的,而不应该是无限制的增长的。持续地观察系统运行时使用的内存的大小,可以看到在内存使用监控窗口中是基本规则的锯齿形的图线,如果内存的大小持续地增长,则说明系统存在内存泄漏问题。通过间隔一段时间取一次内存快照,然后对内存快照中对象的使用与引用等信息进行比对与分析,可以找出是哪个类的对象在泄漏。
通过以上四个步骤的分析与处理,基本能处理内存溢出的问题。当然,在这些过程中也需要相当的经验与敏感度,需要在实际的开发与调试过程中不断积累。
浏览量:2
下载量:0
时间:
每代内存都在增长,而且也都会形成一个标准,读文网小编给大家分享一下网站各代内存之间的区别。供大家参考!
内存在从DDR到DDR2再到DDR3升级发展过程中,其工作电压一直在降低,因此在性能提升的同时,功耗也在逐渐变小。
至于说到主板上的插槽,三者都不一样,在内存接口上有一个小缺口,DDR DDR2 DDR3内存的每种内存的接口都不会同一位置,因此只能插在购买时得先看好主板上插槽支持那种内存再进行购买内存。而且这三种内存条是不能兼容。
(内存各代数之间的区别)
DR DDR2 DDR3在内存容量上的区别
现在家用电脑谁不是2G的?8G以上的都不少见吧?一些游戏玩家最低要求都是4G吧?如果这事放在零几年那时谁信?
DDR最小的内存只有64M最大的也只有1G的容量,2代的DDR 最少的是256M最大的都已经是4M了.当然DDR2 4G用的人少一般常见的都是1Gx2这样使用的。而DDR3现在最小的都是512M最大的都已经是8G了。一般都是4Gx2这样使用。或者2Gx2这样使用。
DDR DDR2 DDR3在封装区别
早期的DDR封闭颗粒是TSOP,而从DDR2和DDR3开始使用FBGA封装,而DDR2使用的是8bit芯片使用60球/68球/84球FBGA封装三种规格,而DDR3采用的是16bit芯片使用96球FBGA封装,而且DDR3必须是绿色封装,不能包含任何有害的物质。
参考电压分成两个
在DDR3系统中,对于内存系统工作非常重要的参考电压信号VREF将分为两个信号,即为命令与地址信号服务的VREFCA和为数据总线服务的VREFDQ,这将有效地提高系统数据总线的信噪等级。
DDR DDR2 DDR3在突发长度(BurstLength,BL)
由于DDR3的预取为8bit,所以突发传输周期(BurstLength,BL)也固定为8,平而DDR的传输周期是2,而DDR2是4。
DDR DDR2 DDR3在逻辑Bank数量上的区别
DDR中有2个Bank和4个Bank。DDR2有4个Bank和8个Bank。而到DDR3的时候已经是8个Bank和16个Bank了。目前就是应对未来大容量芯片的要求,而DDR3很可能将从2G起步,因此逻辑Bank就是8个,另外还为未来的16逻辑Bank做好了准备。
DDR DDR2 DDR3的寻址时序区别(Timing)
延迟周期数从DDR一代到二代再到三代内存一加一直在增加,三代内存的CL周期也将比二代内存有相应的提高。二代内存的CL范围一般在2到5之间,而二代内存已经增加到5到11之间,并且三代内存延迟(AL)的设计也有所变化。二代内存时AL的范围是0到4,而三代内存时AL有三种选项,分别是0、CL-1和CL-2。另外,三代内存还新增加了一个时序参数-写入延迟。
相对于DDR DDR2,DDR3新增的功能
DDR新增加重置功能, 新增加的重置是DDR3一项重要功能,并且为此功能还专门准备了一个引脚。这一引脚将使DDR3的初始化处理变得简单。当Reset命令有效时,DDR3内存将停止所有操作,并切换至最少量活动状态,以节约电力。
DDR3新增ZQ校准功能,ZQ也是一个新增的脚,在这个引脚上接有一个240欧姆的低公差参考电阻。这个引脚通过一个命令集,通过片上校准引擎(On-DieCalibrationEngine,ODCE)来自动校验数据输出驱动器导通电阻与ODT的终结电阻值。当系统发出这一指令后,将用相应的时钟周期(在加电与初始化之后用512个时钟周期,在退出自刷新操作后用256个时钟周期、在其他情况下用64个时钟周期)对导通电阻和ODT电阻进行重新校准。
读文网小编介绍了各代内存之间的区别,希望你喜欢。
浏览量:2
下载量:0
时间:
DDR4内存是新一代的产品,目前来说还没有完全上市。那么不少用户就会问了,DDR4内存和DDR3内存有什么区别呢?下面读文网小编就为大家介绍一下具体的区别吧,欢迎大家参考和学习。
DDR3内存金手指是240个,内存金手指是平直的;而DDR4内存金手指是284个,内存金手指呈弯曲状。
浏览量:2
下载量:0
时间:
如今DDR4已经欲势待发,只是在等待相应的主板与CPU上市了,那么相比DDR3,都有了哪些比较重要的改进呢?下面读文网小编就为大家详细介绍一下吧,欢迎大家参考和学习。
威刚早些时候正式宣布了他们的首批DDR4内存产品,美光也不甘示弱,宣布其DDR4内存已经大规模投产,并在逐步提高产量。
美光表示,目前量产的是4Gb DDR4内存颗粒,标准频率为2133MHz,并特别与Intel合作,针对将在下半年发布的下一代服务器平台Xeon E5-2600 v3进行了优化。
新平台架构基于22nm Haswell-EP,将取代去年9月份发布的Ivy Bridge-EP E5-2600 v2,主要面向双路服务器领域。
目前已经发布的DDR4内存频率都只有2133MHz,这其实是DDR3也可以轻松达到的高度,自然不能凸显新内存的优势。美光称,2400MHz DDR4正在试产,预计2015年正式投产(也就是说今年别期望啥了)。
美光还透露,他们将陆续推出符合JEDEC DDR4标准的完整产品线,涵盖RDIMM、LRDIMM、VLP RDIMM、UDIMM、SO-DIMM各种规格,ECC也可选有无,到今年第三季度初的时候还会增加NVDIMM。
浏览量:2
下载量:0
时间:
一些对于网友来说,SD卡不就是内存卡吗?其实这是一个错误的看法,下面就由读文网小编为大家整理的相关信息,供大家参考!
SD卡(Secure Digital Memory Card)是一种基于半导体快闪记忆器的新一代记忆设备。SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。大小犹如一张邮票的SD记忆卡,重量只有2克,但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。 SD卡在24mm×32mm×2.1mm的体积内结合了SanDisk快闪记忆卡控制与MLC(Multilevel Cell)技术和Toshiba(东芝)0.16u及0.13u的NAND技术,通过9针的接口界面与专门的驱动器相连接,不需要额外的电源来保持其上记忆的信息。而且它是一体化固体介质,没有任何移动部分,所以不用担心机械运动的损坏。
手机SD卡其实是指 TF卡,TranFlash的简称,一种全新的超小型大容量移动存储卡,大小约等于目前市面最流行的SD记忆卡的1/4,或手机SIM卡的 1/2。可以随意将拍摄的照片,下载的MP3或影音文件储存在TF卡中;也可以通过SD卡适配器与电脑连接,从电脑中将文件拷在卡中,传输非常方便,随时都能扩展收集的记忆容量。
TF卡是Motorola与SanDisk共同推出的最新一代的记忆卡规格,它采用了最新的封装技术,并配合SanDisk最新NAND MLC技术及控制器技术。大小(11mm x 15mm x1mm),约等于半张SIM卡,Trans-Flash Card为SD Card产品成员的一员,附有SD转接器,可兼容任何SD读卡器,TF卡可经SD卡转换器后,当SD卡使用。
T-Flash卡是市面上最小的闪存卡,适用于多项多媒体应用.Trans-flash产品采用SD架构设计而成,SD协会于2004年年底正式将其更名为 Micro SD,已成为SD产品中的一员。
浏览量:3
下载量:0
时间: