-
java 如何查看全局变量占用内存大小5
在strut2 的action中 可以定义几个变量,也可以吧字段放到entity中 例如:
1. 在entity中定义变量,
class entity{
private String s1;
private String s2;
private String s3;
get set方法
}
action中调用entity
class action{
private Entity entity;
get set方法
}
2. 在action中直接定义变量
class action{
private String s1;
private String s2;
private String s3;
get set方法
}
我想问那种方式占用内存大,
最主要是想知道,如何写程序查看占用内存的大小[color=red][/color][size=x-small][/size].2010年5月05日 21:23
3个答案 按时间排序 按投票排序
-
采纳的答案
Java程序计算各种对象所占内存的大小的方法。
基类:
public abstract class SizeOf { private final Runtime s_runtime = Runtime.getRuntime(); /** * * 子类负责覆盖该方法以提供被测试类的实例 * * @return 被测试类的实例 */ protected abstract Object newInstance(); /** * * 计算实例的大小(字节数) * * @return 实例所占内存的字节数 * @throws Exception */ public int size() throws Exception { // 垃圾回收 runGC(); // 提供尽可能多(10万)的实例以使计算结果更精确 final int count = 100000; Object[] objects = new Object[count]; // 实例化前堆已使用大小 long heap1 = usedMemory(); // 多实例化一个对象 for (int i = -1; i < count; ++i) { Object object = null; // 实例化对象 object = newInstance(); if (i >= 0) { objects[i] = object; } else { // 释放第一个对象 object = null; // 垃圾收集 runGC(); // 实例化之前堆已使用大小 heap1 = usedMemory(); } } runGC(); // 实例化之后堆已使用大小 long heap2 = usedMemory(); final int size = Math.round(((float) (heap2 - heap1)) / count); // 释放内存 for (int i = 0; i < count; ++i) { objects[i] = null; } objects = null; return size; } private void runGC() throws Exception { // 执行多次以使内存收集更有效 for (int r = 0; r < 4; ++r) { _runGC(); } } private void _runGC() throws Exception { long usedMem1 = usedMemory(); long usedMem2 = Long.MAX_VALUE; for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++i) { s_runtime.runFinalization(); s_runtime.gc(); Thread.currentThread().yield(); usedMem2 = usedMem1; usedMem1 = usedMemory(); } } /** * * 堆中已使用内存 * * @return 堆中已使用内存 */ private long usedMemory() { return s_runtime.totalMemory() - s_runtime.freeMemory(); } }
子类:
public class SizeOfObject extends SizeOf { @Override protected Object newInstance() { return new Object(); } public static void main(String[] args) throws Exception { SizeOf sizeOf = new SizeOfObject(); System.out.println("所占内存:" + sizeOf.size() + "字节"); } }
输出为:所占内存:8字节
利用序列化(Serializable)计算对象的大小
下面代码可以计算session的大小:
将session中的所有对象输出到文件中,文件的大小就是对象的大小.
try { FileOutputStream f = new FileOutputStream("c:/sessionFiles"); ObjectOutputStream s = new ObjectOutputStream(f); s.writeObject("session:"); HttpSession session = request.getSession(false); Enumeration names = session.getAttributeNames(); while(names.hasMoreElements()){ s.writeObject(session.getAttribute((String) names.nextElement())); } s.flush(); s.close(); f.close(); } catch (Exception e) { e.printStackTrace(); }
也可以看看这个
java对象占内存大小
http://329937021.iteye.com/blog/547779
2010年5月05日 22:35
-
分析一下两者action的不同,后者多了一个对象(包含三个String的引用)。
我们知道对象需要在堆中占一定的空间。
多一个对象,必然多占内存。
所以后者占内存大。
=======================
如果你想亲自验证一下这个推理,很简单,查看JVM内存的使用情况 。
使用Runtime对象中的静态方法。更多java运行环境信息参看(http://www.jingningedu.com/manage/java_api/java/lang/Runtime.html)
查看JVM内存使用情况的简单代码如下:System.out.print("当前虚拟机最大可用内存为:"); System.out.println(Runtime.getRuntime().maxMemory()/1024/1024+"M"); System.out.print("当前,虚拟机已占用内存:"); System.out.println(Runtime.getRuntime().totalMemory()/1024/1024+"M");
2010年5月06日 01:56
-
1.Runtime.getRuntime().gc();
2.long start = Runtime.getRuntime().freeMemory();
3.Object object=(Object)request.getSession().getAttribute("object");
4.
5.Runtime.getRuntime().gc();
6.long end = Runtime.getRuntime().freeMemory();
7.long difference = ( start - end );
8.System.out.println( difference + " bytes be used!" );2010年5月05日 22:12
相关推荐
这个“Java内存使用系列一Java对象的内存占用”主题旨在深入探讨Java对象在内存中的表现,以及如何有效地管理这些资源。Java开发人员需要理解内存分配、垃圾回收机制以及如何避免内存泄漏,以确保程序的高效运行。 ...
Java 实现内存动态分配主要涉及Java内存模型以及内存管理机制,包括堆内存和栈内存的分配,以及垃圾回收等概念。下面将详细解释这些知识点。 1. **Java内存模型** Java程序运行时,内存分为堆内存(Heap)和栈内存...
其中,堆内存是Java对象的主要存储场所,栈内存主要存储方法调用时的局部变量,而方法区则存储类的信息,如类的常量池、字段和方法数据等。 内存泄漏通常发生在堆内存中,当程序创建对象并分配内存后,如果不再需要...
此外,内存占用还受到其他因素的影响,如全局变量、静态变量等,它们属于进程空间的一部分,所有线程共享。还有,如果线程使用了特定的数据结构或服务(如线程局部存储TLS),这些也会增加额外的内存消耗。 在现代...
1. **对象的标记**:从根对象(如全局变量、常量等)开始,沿着引用链找到所有可达对象。 2. **对象的回收**:标记不可达对象(即不再被任何引用链指向的对象),然后回收这些对象占用的内存空间。 ### 引发内存...
1. 静态存储分配:在编译时就能确定每个数据目标的内存需求,适用于常量、全局变量等静态数据。 2. 栈式存储分配:运行时根据需要分配,遵循先进后出原则,适用于局部变量和函数调用。 3. 堆式存储分配:运行时动态...
如果 web app 用了大量的第三方 jar 或者应用有太多的 class 文件而恰好 MaxPermSize 设置较小,超出了也会导致这块内存的占用过多造成溢出。 2、java.lang.OutOfMemoryError: Heap space Heap space 是 JVM 管理...
- **内存泄漏**:理解内存泄漏的原因,如全局变量、静态集合、线程池未关闭等。 - **对象引用**:强引用、软引用、弱引用、虚引用的区别及其对内存管理的影响。 - **JVM调优**:包括内存大小设置、垃圾回收器选择...
通过调整JVM参数,如-Xms、-Xmx设置堆内存大小,-XX:NewRatio调整新生代和老年代的比例,-XX:SurvivorRatio控制新生代的Eden区和Survivor区大小,可以优化GC性能。 10. **监控和诊断工具**: 使用JVisualVM、...
堆内存是全局的,所有线程共享,它的大小在JVM启动时可以指定。栈内存则是每个线程独享的,其大小由JVM决定,通常较小但处理速度较快。 **堆内存分析** 1. **对象分配**:当创建一个对象时,它的实例数据会存储在...
8. **内存泄漏**:虽然Java有垃圾收集机制,但不恰当的编程习惯可能导致内存泄漏,比如全局变量引用了一个不再使用的大型对象,即使该对象不再被其他地方引用,也无法被垃圾收集。 9. **Java虚拟机参数调整**:...
总之,Java内存监控涉及多个层面,包括使用内置工具、编程接口、理解内存模型、掌握垃圾收集机制以及合理配置JVM参数。通过对这些知识点的深入学习和实践,我们可以有效地管理和优化Java应用的内存使用,提升系统...
- 调整GC参数:例如,选择合适的垃圾收集器,调整新生代与老年代的比例,设置内存大小等。 - 使用弱引用和软引用:避免长时间持有对象,允许GC及时回收。 - 注意集合类的使用:避免使用无限制增长的集合,及时...
### JAVA内存分区与C/C++内存分区的深度解析 #### JAVA内存分区 在JAVA中,JVM(Java虚拟机)的内存主要分为三个区域:堆(heap)、栈(stack)和方法区(method)。每个区域都有其特定的功能和管理机制。 1. **...
例如,全局变量、静态变量引用的对象,即使不再使用,由于引用一直存在,GC无法识别这些对象为可回收的。另外,如果对象之间形成循环引用,GC也无法正常工作。 解决Java内存溢出和内存泄露的方法主要包括以下几点:...
Java内存区域和垃圾收集(GC)机制是Java编程中至关重要的一部分,它关乎程序的性能、稳定性和资源管理。本文将深入探讨Java虚拟机(JVM)中的内存划分、垃圾收集的工作原理以及相关工具的使用。 1. **Java内存区域...
本文主要探讨了Java中变量的存储位置以及内存分配的区别,主要包括以下几个方面: 1. **寄存器**:虽然Java程序员无法直接控制寄存器,但它是计算机硬件中最快的数据存储区域。通常,CPU会将最频繁使用的变量存储在...
4. **分析大对象**:HeapAnalyzer456.jar会展示对象的大小分布,找出占用内存最大的对象。这些大对象可能是内存溢出的原因,因为它们可能消耗了大量的内存空间。 5. **查找内存泄漏**:工具可以检测到哪些类或对象...
- 编写代码时遵循良好的编程习惯,避免不必要的全局变量和静态引用。 - 定期进行性能监控和内存分析,及早发现问题。 - 适时升级硬件和软件,保持系统资源充足。 综上所述,Java内存泄露的定位与分析是一个涉及...
- **避免全局变量和静态变量**:它们可能导致内存占用增加,影响垃圾回收。 - **合理使用集合类**:如ArrayList和LinkedList的性能差异,以及何时使用HashMap和TreeMap。 - **及时释放不再使用的对象引用**:防止...