查看java程序占用内存 java如何获取物件占用记忆体大小
java如何获取物件占用记忆体大小
java如何获取物件占用记忆体大小
import .dingtongblog.size.ObjectSize;public class TestMain {public static void main(String[] args) {
String a = new String(aa);
System.out.println(ObjectSize.getSizeOf(a));
}
}
如何获取 java hashmap占用记忆体空间大小
HashMap简介
综述:HashMap 是一个散列表,它储存的内容是键值对(key-value)对映。
1.HashMap
继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable介面。
2.HashMap
的实现不是同步的,这意味着它不是执行绪安全的。它的key、value都可以为null。此外,HashMap中的对映不是有序的。
3.HashMap
的例项有两个引数影响其效能:“初始容量” 和 “载入因子”。容量 是杂凑表中桶的数量,初始容量 只是杂凑表在建立时的容量。载入因子
是杂凑表在其容量自动增加之前可以达到多满的一种尺度。当杂凑表中的条目数超出了载入因子与当前容量的乘积时,则要对该杂凑表进行 rehash
操作(即重建内部资料结构),从而杂凑表将具有大约两倍的桶数。
通常,预设载入因子是 0.75,
这是在时间和空间成本上寻求一种折衷。载入因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put
操作,都反映了这一点)。在设定初始容量时应该考虑到对映中所需的条目数及其载入因子,以便最大限度地减少 rehash
操作次数。如果初始容量大于最大条目数除以载入因子,则不会发生 rehash 操作。
java 如何获取物件记忆体地址?
java中不建议直接获取字串记忆体地址,因为java不像c语言,获取记忆体地址是C语言的强项,java的弱项。但是java记忆体地址还是有一个应用场景,就是判断两个字串记忆体地址是否相等来判断是否是同一个物件,用双等号“==”来比较的。参考程式码如下:
public class Test01 {
/**
* @param args
*/
public static void main(String[] args) {
TODO Auto-generated method stub
String str1="abc";
String str2=new String("abc");
System.out.println(str1 == str2);输出false
}
}
delphi 物件占用的记忆体大小
2,直接关闭后会释放,不过不是DELPHI做的,是作业系统对一个死程序进行记忆体清理。。如果程式没关,这个记忆体是一直占著的,如果程式重复在新建这个类,而不释放,你就会发现程式占用记忆体越来越大,如果不重复建,影响不大。还一个对于类中手工getmem等申请记忆体的操作,如果没对应的释放的。你关闭程式还是记忆体还在,就是传说的记忆体泄漏了。
如何看linux核心占用记忆体大小
[root@scs-2 tmp]# free
total used free shared buffers cached
Mem: 3266180 3250004 16176 0 110652 2668236
-/+ buffers/cache: 471116 2795064
Swap: 2048276 80160 1968116
下面是对这些数值的解释:
total:总计实体记忆体的大小。
used:已使用多大。
free:可用有多少。
Shared:多个程序共享的记忆体总额。
Buffers/cached:磁碟快取的大小。
第三行(-/+ buffers/cached):
used:已使用多大。
free:可用有多少。
第四行就不多解释了。
区别:第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。 这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用记忆体是16176KB,已用记忆体是3250004KB,其中包括,核心(OS)使用+Application(X, oracle,etc)使用的+buffers+cached.
第三行所指的是从应用程式角度来看,对于应用程式来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高档案读取的效能,当应用程式需在用到记忆体的时候,buffer/cached会很快地被回收。
所以从应用程式的角度来说,可用记忆体=系统free memory+buffers+cached。
如上例:
2795064=16176+110652+2668236
接下来解释什么时候记忆体会被交换,以及按什么方交换。 当可用记忆体少于额定值的时候,就会开会进行交换。
如何看额定值:
cat /proc/meminfo
[root@scs-2 tmp]# cat /proc/meminfo
MemTotal: 3266180 kB
MemFree: 17456 kB
Buffers: 111328 kB
Cached: 2664024 kB
SwapCached: 0 kB
Active: 467236 kB
Inactive: 2644928 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 3266180 kB
LowFree: 17456 kB
SwapTotal: 2048276 kB
SwapFree: 1968116 kB
Dirty: 8 kB
Writeback: 0 kB
Mapped: 345360 kB
Slab: 112344 kB
Committed_AS: 535292 kB
PageTables: 2340 kB
VmallocTotal: 536870911 kB
VmallocUsed: 272696 kB
VmallocChunk: 536598175 kB
HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 2048 kB
用free -m检视的结果:
[root@scs-2 tmp]# free -m
total used free shared buffers cached
Mem: 3189 3173 16 0 107 2605
-/+ buffers/cache: 460 2729
Swap: 2000 78 1921
检视/proc/kcore档案的大小(记忆体映象):
[root@scs-2 tmp]# ll -h /proc/kcore
-r——– 1 root root 4.1G Jun 12 12:04 /proc/kcore
备注:
占用记忆体的测量
测量一个程序占用了多少记忆体,linux为我们提供了一个很方便的方法,/proc目录为我们提供了所有的资讯,实际上等工具也通过这里来获取相应的资讯。
/proc/meminfo 机器的记忆体使用资讯
/proc/pid/maps pid为程序号,显示当前程序所占用的虚拟地址。
/proc/pid/statm 程序所占用的记忆体
[root@localhost ~]# cat /proc/self/statm
654 57 44 0 0 334 0
输出解释
CPU 以及CPU0。。。的每行的每个引数意思(以第一行为例)为:
引数 解释 /procstatus
Size (pages) 任务虚拟地址空间的大小 VmSize/4
Resident(pages) 应用程式正在使用的实体记忆体的大小 VmRSS/4
Shared(pages) 共享页数 0
Trs(pages) 程式所拥有的可执行虚拟记忆体的大小 VmExe/4
Lrs(pages) 被映像到任务的虚拟记忆体空间的库的大小 VmLib/4
Drs(pages) 程式资料段和使用者态的栈的大小 (VmData+ VmStk )4
dt(pages) 04
检视机器可用记忆体
/proc/28248/>free
total used free shared buffers cached
Mem: 1023788 926400 97388 0 134668 503688
-/+ buffers/cache: 288044 735744
Swap: 1959920 89608 1870312
我们通过free命令检视机器空闲记忆体时,会发现free的值很小。这主要是因为,在linux中有这么一种思想,记忆体不用白不用,因此它尽可能的cache和buffer一些资料,以方便下次使用。但实际上这些记忆体也是可以立刻拿来使用的。
所以 空闲记忆体=free+buffers+cached=total-used
C#中如何获取物件例项大小?
有点异想天开了。
C#提供了两个获取大小的方法:
1.使用sizeof运算子。但sizeof只有对int,byte等预定义值型别有效。
2.使用System.Runtime.InteropServices.Marshal.SizeOf静态方法。此方法对任何值型别的例项有效。
除此之外,引用型别的记忆体是分配在堆上面的,不管是C,C++还是C#,好像都只能在堆上面例项化物件,删除物件。尤其是C#,连例项化/删除物件都有人代劳了。
如果你在堆上有你需要的资讯,并且要把这段资讯写入到磁碟等装置时,这时你需要对这个物件进行拆箱处理。这时你才获取到你拆箱后的物件例项的大小。

如何检视一个物件当前占用的记忆体大小
(1)做一些cache的时候,我们不可能把资料库的所有的资料都快取到记忆体里面,我们要估计快取的大小。
(2)记忆体泄露的时候,我们可以检视某些物件的大小来定位问题,当然还有其他的更有效的方式,比如使用MAT分析dump档案
(3)根据jvm的堆记忆体设定,我们可以知道最多可以建立多少个物件。 从jdk5开始,提供了Instrumentation API,它有一个叫做getObjectSize()的方法,但是,这个方法存在两个问题:
(1)不可以直接使用。必须要实现一个Instrumentation Agent,还得放到jar包里面。
(2)它只能返回单个物件的大小,不能返回内部包含的子物件的大小。
如何按占用记忆体大小检视Linux下的程序
那么如何按占用记忆体大小检视Linux下的程序呢?
ps
常用引数
-A 所有程序均显示出来
-a 不与terminal有关的所有程序
-u 有效使用者相关的程序
-x 通常与a一起用,可列出较完整资讯
按记忆体大小排序
ps -aux预设是按PID从小到大显示的,若想按占用记忆体大小排序则需要借助另外sort命令针对第4列(记忆体所在列)排序:
ps -aux | sort -k4rn
如果我们只想看前n个程序, 还可以借助head命令,比如检视前10个占用记忆体最大的程序:
ps -aux | sort -k4rn | head -n 10
我们还可以借助awk来指定显示哪几列资讯:
ps -aux |awk '{print $2, $4, $11}' | sort -k2rn | head -n 10
注意:我们先用awk指定了要显示的列, 这时sort的引数也要变化了.
常用引数
-d: 后面加数字指定资料重新整理的频率, 预设是5秒
-p: 指定某些个pid进行观察
执行过程中可使用的按键命令
?: 显示中可以输入的按键命令
P: 以cpu使用率排序显示
M: 以记忆体使用率排序显示
N: 以PID排序显示
作业系统占用记忆体大小
瑞星能占20M左右呢
瑞星太大了.还不让关,不好
不如用卡巴斯基
纯净的XP 刚开机 一般只占 100M左右
vb如何获取记忆体大于2g的记忆体大小
定义一个100位元组的记忆体,可以用位元组阵列:
dim a(100) as Byte