java程序的内存优化

面试常被问java的垃圾回收机制,感觉平时写代码很少用到,但是注重程序的内存优化确实很重要。《EffectiveJava》这本书有几条讲的挺好,拿过来总结下吧。

首先简单的概括下java的内存回收机制。

java内存主要是堆内存和栈内存,栈中的内存会在程序运行到所在作用域之外后进行回收。堆中的内存会在没有引用指向的时候,JVM虚拟机在某个时间段根据特定的算法进行回收。

平时写程序注意如下几点,对程序进行内存优化

1、避免创建不必要的对象

a、使用基本类型替代装箱类型(享元模式)

b、StringBuffer替代String

c、使用单例模式(不推荐延迟加载)

d、如果一个频繁调用的方法,每次调用都需要实力化对象,考虑静态初始化。如Clendar的实例化

注:小对象的创建和回收都是非常廉价的,通过创建附加的对象提升程序的清晰性,简洁性,功能性是值得推荐的。不推荐使用自己维护的对象池。

2、消除过期对象的引用

a、对于类似数组,Collection中的对象容器,取出使用之后,可以置空。

b、使用WeakHashMap做缓存。

3、将局部变量的作用域最小化

a、在第一次使用局部变量的时候声明该变量

时间: 2024-10-08 10:27:47

java程序的内存优化的相关文章

如何使用JVisualVM远程监控和优化Tomcat和Java程序的内存和CPU

如何使用VisualVM远程监控和优化Tomcat和Java程序的内存和CPU JVisualVM 是Java 继 JConsole 之后有一款力作,是集成了诸多分析和优化Java程序的工具的工具. 我们可以用它来为优化Java程序的内存占用,找出内存泄漏,分析Java程序的CPU占用情况,根据JVisualVM获取到的数据优化JVM配置等.   总之是相当好了~~~~ JVisualVM 位于JAVA_HOME/bin目录下 . 直接运行可打开. 打开后界面如下: 由于JVisualVM 本身

探讨深入Java虚拟机之内存优化

上一篇我们讲述了Java虚拟机的体系结构和内存模型,那么我们就不得不说到内存泄露.大家都知道,Java是从C++的基础上发展而来的,而C++程序的很大的一个问题就是内存泄露难以解决,尽管Java的JVM有一套自己的垃圾回收机制来回收内存,在大多数的情况下并不需要java程序开发人员操太多的心,但也是存在泄露问题的,只是比C++小一点.比如说,程序中存在被引用但无用的对象:程序引用了该对象,但后续不会或者不能再使用它,那么它占用的内存空间就浪费了. 我们先来看看GC是如何工作的:监控每一个对象的运

怎样使java程序减少内存占用(转载)

本文收集网上关于减少java程序占用的一些小知识点 (1)别用new Boolean(). 在很多场景中Boolean类型是必须的,比如JDBC中boolean类型的set与get都是通过Boolean封装传递的,大部分ORM也是用Boolean来封装boolean类型的,比如: ps.setBoolean("isClosed",new Boolean(true)); ps.setBoolean("isClosed",new Boolean(isClosed));

Java 程序该怎么优化?(工具篇)

程序员:为什么程序总是那么慢?时间都花到哪里去了? 面试官:若你写的 Java 程序,出现了性能问题,该怎么去排查呢? 工欲善其事必先利其器,为你呈上一箩筐性能优化工具,必有一款满足你,废话不多说,直奔主题. 1. hprof 工具 hprof 工具是通过织入监控代码,来对 Java 程序进行监控的一款工具.可以监控 Java 程序在运行时占用的 CPU,及统计堆内存使用等. 例如:每隔 10 毫秒采样 CPU 消耗信息,并把信息保存到 hprof.txt 文件中. java -agentlib

Java 程序的内存泄露问题分析

什么是内存泄露? 广义的Memory Leak:应用占用了内存,但是不再使用(包括不能使用)该部分内存 狭义的Memory Leak:应用分配了内存,但是不能再获取该部分内存的引用(对于Java,也不能被GC) 一个具体的例子: 应用创建了一个长时间运行的Thread 该Thread使用ClassLoader(可以是定制的也可以是默认的)加载了一个类 这个类有一个Static域,指向了一大块内存,然后该Thread的ThreadLocal变量保存了这个类的引用. 最后该Thread清理了对所有已

Java 程序该怎么优化?(实战篇)

面试官:出现了性能问题,该怎么去排查呢? 程序猿:接口响应那么慢,时间都花到哪里去了? 运维喵:为什么你的应用跑着跑着,CPU 就接近 100%? 分享一些真实生产问题排查故事,看看能否涨姿势,能否 get 到其中之「趣」? 另外,为了方便收藏,文末把 Java 程序优化及问题排查套路,整理成了葵花宝典,一定要记得收藏呦. 1. 业务催的急,心发慌的现场! 2012 年,在一家支付公司做用户域的基础服务,每天做的事儿便是为满足业务需求,制定各种各样的 API. 某天,业务反馈线上调用查询省份地市

java程序执行内存处理过程

我们学习知识,不仅要知其然,还要知其所以然,你的工资必定和你学习的深度成正比. 在以往.net的学习过程中,我们了解了怎么去开发一个程序,并有了一定的开发经验,但是一个程序具体是怎么在内存中运行的呢? 1.首先来看一张图. 2.在这张图中,我们可以很清楚的了解到: 栈中主要存放局部变量. 堆中存放new出来的东西. 而static 的变量或者字符串常量 则存在在 data segment(数据区)中: 那么类中方法的话,是存在在 code segment(代码区)中了. 3.举例 给一个简单的j

java内存优化实践

一般在java程序中,内存是个比较头痛的话题.虽然jvm能够通过GC机制很智能地回收资源,但是由于内存的释放都是jvm在进行操作,不恰当的使用会导致java的程序内存持续增大,直至最终OOM(out of memery) 那么,如何对java进行内存优化呢?一方面可以通过调整jvm的一些配置(内存,GC等),从jvm层优化配置:另一方面,从java程序角度,在代码层次上进行优化. 近期,做了些在java程序方面内存优化实践,积累了一些心得,总结如下: 对于资源消耗较大的对象(如数据库连接,Str

java程序性能优化之找出内存溢出元凶

我曾经在刚入行的时候做过一个小的swing程序,用到了java SE,swing,Thread等东东,当初经验少也没有做过严格的性能测试,布到生产环境用了一段时间后发现那个小程序有时候会抛java.lang.OutOfMemoryError异常,就是java的内存溢出.当时也上网查了不少资料,试过一些办法,代码也稍微做了些优化,但是有一个问题我始终是找不到解决的方案 - 不知为什么子窗体关闭后java的垃圾回收机制无法回收其资源,因为这个程序可能要经常开关一些子窗体,那么这些子窗体关闭后无法释放