Tag: 内存

在哪里可以找到如何计算java对象大小的证据

我已经搜索了很长时间的java对象的大小,有很多这样的答案,每个人都告诉我java对象的开销大小,以及如何计算出实际大小。 但他们怎么知道呢? 我没有从官方的oracle文件中找到任何证据。 这个结论有什么证据? 或者数据来自一些基于某些实验的猜测? 另一件事。 在官方文件中提到有一种“近似”的方法来衡量对象 – 仪器方式,任何人都可以向我解释什么是’近似’的意思? 什么时候准确,什么时候不准确。 最好有证据。

在java中加载大型文本文件的最佳方法

我有一个文本文件,每行有一个整数序列: 47202 1457 51821 59788 49330 98706 36031 16399 1465 … 该文件有300万行这种格式。 我必须将此文件加载到内存中并从中提取5-gram并对其进行一些统计。 我确实有内存限制(8GB RAM)。 我试图最小化我创建的对象的数量(只有1个类,包含6个浮点变量,以及一些方法)。 并且该文件的每一行基本上生成该类的对象数(与#ofwords中的行的大小成比例)。 当C ++出现时,我开始觉得Java不是一个很好的方法来做这些事情。 编辑:假设每一行产生该类的(n-1)个对象。 其中n是由空格分隔的该行中的标记数(即1457)。 因此,考虑到每行10个字的平均大小,每条线平均映射到9个对象。 因此,将有9 * 3 * 10 ^ 6个对象。所以,所需的内存是:9 * 3 * 10 ^ 6 *(8字节obj标头+ 6 x 4字节浮点数)+(一个地图(字符串,对象)和另一个映射(Integer,ArrayList(Objects)))。 我需要将所有内容保存在内存中,因为之后会发生一些数学优化。

为什么强制垃圾收集会增加分配给java进程的内存?

所以我有这个代码: public static void main(String[] args) throws Exception { Thread.sleep(5000); System.out.println(“Creating array…”); Integer[] integers = new Integer[Integer.MAX_VALUE/32]; Thread.sleep(5000); System.out.println(“Destroying array”); integers = null; //System.gc (); //System.runFinalization (); Thread.sleep(60000); } 当我运行这段代码后,我会在大约5秒钟后看到268 MB的ram被分配给Activity Monitor中的java进程。 当我在控制台中看到“销毁arrays”后取消注释注释行(System.gc和以下行)时,分配的内存增加到278 MB。 我可以理解内存没有被释放,因为System.gc()只是对JVM的一个暗示,但为什么10MB会增加呢? 此时加载到内存中的是什么?

使用ConcMarkSweepGC的连续CMS集合

在Linux上使用以下JVM选项启动Tomcat(2cpu,4g RAM,800M ehcache元素): -Xmn512m -Xmx2g -Xms2g -XX:+UseConcMarkSweepGC -Xss128k -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+DisableExplicitGC -XX:+PrintGCTimeStamps -XX:+PrintGCDetails 运行流量低,没有数据库问题,没有批处理过程在凌晨(06:00)20分钟之前, 堆内存达到-Xmx值并且CMS反复运行 ,最终返回到正常的GC行为,此时消息Unloading class sun.reflect.GeneratedMethodAccessorXXXXX已打印到日志中。 请你能: 建议一些GC调整点? 要么 建议可能的原因? GC日志: 2011-06-30T06:15:03.494+0900: 145634.229: [GC 145634.230: [ParNew: 463698K->37791K(471872K), 0.0342030 secs] 1848117K->1434326K(2044736K), 0.0343190 secs] [Times: user=0.13 sys=0.01, real=0.03 secs] 2011-06-30T06:15:12.423+0900: 145643.159: [GC 145643.159: [ParNew: 457247K->36210K(471872K), 0.0302130 secs] 1853782K->1443540K(2044736K), 0.0303470 secs] [Times: user=0.12 sys=0.00, real=0.03 secs] […]

以编程方式获取android设备的所有RAM内存,而不仅仅是分配给用户进程的内存

我有一个设备,我知道它的RAM内存为512 MB 希望能够以编程方式检索此值(512 MB)。 到目前为止,我已经在互联网上主要涉及这两种方式: https://stackoverflow.com/a/16143065/1521264这给了我386 MB 以及https://stackoverflow.com/a/23508821/1521264其中还提供了386 MB 我假设386 MB是用户进程可用的内存,所以我想得到所有内存或其他进程的细分。

google common cache – maximumSize的默认值(和其他“可选”设置) – 想要一个使用所有“可用”内存的缓存

我刚刚通过搜索缓存API找到了Guava (它非常适合我的需求)。 但是在阅读wiki和Javadoc时出现了一个问题 – CacheBuilder可以采用什么设置的默认值? Javadoc声明“这些function都是可选的”和“使用默认设置构造一个新的CacheBuilder实例,包括强键,强值,并且不会自动驱逐任何类型。” 在我看来, maximumSize一个很好的默认值是相对于Runtime.getRuntime().freeMemory(); 最后,我想要一个使用给定系统上可用内存的缓存。 所以我需要一个驱逐策略,询问freeMemory()有多少可用(可能相对于Runtime.getRuntime().maxMemory() )

为什么创建一个大型Javaarrays会占用如此多的内存?

为什么以下行 Object[] objects = new Object[10000000]; 导致JVM使用大量内存(~40M)? 有什么方法可以在分配数组时了解VM的内部工作原理吗?

Java内存行为:与Thread.sleep不同

我正在尝试使用visualvm进行一些内存分析。 我编写了一个基本代码,它运行一个无限循环来向List添加对象。 package home.always.learning.java; import java.util.ArrayList; import java.util.List; public class Heaper { private static List listObj = new ArrayList(); private static final String nameConst = “Tarun Trehan”; public static void main(String[] args)throws Exception{ personListCreation(); } public static void personListCreation() throws Exception { int i = 0; while(true) { System.out.println(“Looping to create person list…”); i++; listObj.add(new […]

primefaces读取然后在Java中写入ByteBuffer的一部分

我在java中有一个ByteBuffer ,想要读取,然后有条件地修改该字节,例如使用如下方法: public void updateByte(int index) { byte b = this.buffer.getByte(index); if (b == someByteValue) { this.buffer.setByte(index, someNewByte); } } 我怎样才能确保读取然后修改一个字节以primefaces方式发生? 我不想同步整个ByteBuffer或updateByte方法,因为我希望多个线程能够同时读/写缓冲区的不同字节(即只要index是多个线程就可以同时调用updateByte )不同)。 我正在使用的ByteBuffer没有byte []支持,所以在上面的例子中bb.hasArray() == false 。

哈希映射内存开销

我正在研究哈希地图的内部结构,我遇到了以下细节: 实现是一个HashMap $ Entry对象的数组: 每个HashMap $ Entry包含: – int KeyHash – Object next – Object key – Object Value 默认容量为16个条目 空大小为128个字节 HashMap的开销是48个字节,对于数组加上(16 +(条目* 4个字节)) – HashMap $ Entry对象的开销 每个键的额外32字节↔值输入HashMap的开销是 因此: – 48个字节,每个条目加36个字节 任何人都可以解释我“HashMap的开销是48字节,加上(16 +(条目* 4字节))数组”和“每个键的额外32字节↔值条目HashMap的开销是 因此: – 48个字节,每个条目加36个字节“ ??? 我无法理解这些结论是如何产生的,即我们如何遇到关于哈希映射的最终内存细节。