Java对象的内存基本都是占用JVM的堆内存,栈内存和方法区,栈内存可以理解为存放运行时临时数据,主要表现为本地变量,操作数,对象引用地址等等,这些数据会在方法运行结束的时候释放掉。也就是说栈内存对存储空间的占用也只是执行函数指令所必须的空间。
方法区存储的事对象所对应的类信息,静态常量,函数表,构造函数等。这些信息在类加载的时候会根据需要只存储一份。
总体来说堆内存是在java对象存储和程序运行中占作用和出问题最多的一块。
下面列出三种计算内存占用的方法。
- 使用java.instrument.instrumentation.getObjectSize()方法,需要创建一个agent代理在JVM中。
- 使用sun.misc.Unsafer类,需要通过反射来获取。
- 使用第三方工具,如apache的RamUsageEstimator类。