十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
众所周知 java的JVM有一套自己的垃圾回收机制 因此在许多情况下并不需要java程序开发人员操太多的心 然而也许也因为这样 往往会造成java程序员的过分依赖而致使开发出来的程序得不到很好的优化 或者说性能尚能提高
成都创新互联公司主要从事成都网站设计、网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务资源,十年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575
问题的关键在于 不论JVM的垃圾回收机制做得多好 计算机的硬件资源是有限的 内存更是一项紧张资源 因此虽然JVM为我们完成了大部分的垃圾回收 但适当地注意编码过程中的内存管理还是很必要的 这样能让JVM回收得更顺利更高效 最大限度地提高程序的效率
mark 避免在循环体内创建对象
……
Object obj = null //方式一
for(int i = i k( k) secs]
……
可以看到总共有 kb的内存被回收 耗时 秒
JVM内存相关的参数
XX NewSize(Set the Newgeneralnation heap size)
XX MaxNewSize(Set the Maximum Newgeneralnation heap size)
XX SurvivorRatio(Set New heap size ratios)
Xms(Set minimum heap size)
Xmx(Set maximum heap size)
Xnoclassgc(取消垃圾回收)
Xss(设置栈内存的大小)
例 java XX NewSize = m XX MaxNewSize = m XX SurvivorRatio = Xms m Xmx m MyApplication
mark 不同编译方法的类大小
( )默认编译方式 javac K java
长度=代码+源文件信息+代码行序号表
( )调试编译方式 javac g K java
长度=代码+源文件信息+代码行序号表+本地变量表
( )代码编译方式 javax g none K java
长度=代码
mark 经验之谈
尽早释放无用对象的引用(XX = null )
尽量少使用finalize函数
注意集合数据类型 如数组 树 图 链表等数据结构 这些数据结构对GC来说回收更复杂
避免在类的默认构造器中创建大量的 初始化大量的对象
避免强制系统做垃圾内存回收
lishixinzhi/Article/program/Java/hx/201311/26273
1、首先得搞清楚什么叫内存泄露,简单来说就是一个东西放在内存里的时间太长了,当你的程序都跑完了,它还存在那里。这时它是白白的占用了你的内存,累积起来占用的内存越来越多……最后就会导致JVM报错:out of memory。
2、一般情况下,别人如果能指出你的系统(程序)内存溢出,这个人应该还是挺厉害的。通常对于新人来说,喜欢把变量直接定义在class下(此时称之为实例变量,或者成员变量),那么在方法里调用后,这个实例变量是不会被释放的,大量的这样使用就可能会引发内存泄露。
3、把变量定义在方法里,当这个方法执行完毕后内存就得到释放了,这是个好习惯。
4、如果想要看到内存溢出,可以按这样的思路去尝试一下:定义一个静态的实例变量(list或其它集合),然后在一个方法里循环往这个静态变量塞东西,直到这个实例变量撑爆你的jvm内存。很快你就能看到out of memory……
import java.util.ArrayList;
import java.util.List;
public class MemoryTest {
private static List list = new ArrayList();
private static int count = 0;
public static void main(String[] args) throws InterruptedException {
System.out.println("申请前的可用内存 = "+getFreeMemory());
while(true){
list.add(new byte[1024*1024]);//用实例变量申请1M内存,当方法执行完毕时,这个static的变量是不会被释放
count++;
if (count % 100 == 0) {
System.out.println("当前list.size()="+list.size()+",可用内存 = "+getFreeMemory());
Thread.sleep(500);
}
}
}
public static long getFreeMemory() {
return Runtime.getRuntime().freeMemory() / (1024 * 1024);
}
}
大家在进行程序系统维护的时候是否因为java编程的内存管理问题而无法快速解决导致系统出错呢?下面我们就一起来了解和学习一下,关于java编程内存管理都有哪些知识点。
程序计数器(了解)程序计数器,可以看做是当前线程所执行的字节码的行号指示器。
在虚拟机的概念模型里,字节码解释器工作就是通过改变程序计数器的值来选择下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都要依赖这个计数器来完成。
Java虚拟机栈(了解)Java虚拟机栈也是线程私有的,它的生命周期与线程相同。
虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链表、方法出口信息等。
每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
局部变量表中存放了编译器可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用和returnAddress类型(指向了一条字节码指令的地址)。
如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。
本地方法栈(了解)本地方法栈与虚拟机的作用相似,不同之处在于虚拟机栈为虚拟机执行的Java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务。
有的虚拟机直接把本地方法栈和虚拟机栈合二为一。
会抛出stackOverflowError和OutOfMemoryError异常。
Java堆堆内存用来存放由new创建的对象实例和数组。
(重点)Java堆是所有线程共享的一块内存区域,在虚拟机启动时创建,此内存区域的目的就是存放对象实例。
Java堆是垃圾收集器管理的主要区域。
java课程培训机构发现由于现在收集器基本采用分代回收算法,所以Java堆还可细分为:新生代和老年代。
从内存分配的角度来看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区(TLAB)。