Tag: 内存管理

Java中内存分配的典型速度是多少?

我正在分析Java应用程序,并发现对象分配发生的速度比我预期的要慢得多。 我运行了一个简单的基准测试来尝试建立小对象分配的整体速度,我发现在我的机器上分配一个小对象(3个浮点数的向量)似乎需要大约200纳秒。 我正在运行(双核)2.0 GHz处理器,因此大约有400个CPU周期。 我想问一下这里的人们是否有关于Java应用程序的概述,然后才能预期这种速度。 这对我来说似乎有点残忍和不寻常。 毕竟,我认为像Java这样可以压缩堆并重定位对象的语言会让对象分配如下所示: int obj_addr = heap_ptr; heap_ptr += some_constant_size_of_object return obj_addr; ….这是几行assembly。 至于垃圾收集,我不会分配或丢弃足够的对象来进行游戏。 当我通过重用对象来优化我的代码时,我得到的性能大约为15纳秒/对象我需要处理而不是每个对象需要处理200 ns,因此重用对象可以极大地提高性能。 我真的很想不重用对象,因为这会使符号变得多毛(许多方法需要接受receptacle参数而不是返回值)。 所以问题是:对象分配花费这么长时间是否正常? 或者我的机器上可能出现问题,一旦修复,可能会让我在这方面有更好的表现? 小对象分配通常需要多长时间用于其他人,并且是否有典型值? 我正在使用客户端计算机,目前不使用任何编译标志。 如果您的机器上的速度更快,那么您机器的JVM版本和操作系统是什么? 我意识到个人里程在性能方面可能会有很大差异,但我只想问我上面提到的数字是否正好在他们正确的范围内。

是否可以让GC管理本机对象的生命周期?

凭借C ++和C#经验以及一些小知识,我现在正在开始一个Java + JNI(C ++)项目(Android,如果这很重要)。 我有一个本机方法,它创建一些C ++类并返回一个指向它的指针作为Java long值(比如句柄)。 然后使用Java代码调用其他本机方法,使用句柄作为参数在此类上执行一些本机操作。 C ++方面不拥有该对象,它是Java方面的人。 但是在当前的架构设计中,很难定义谁拥有对象以及何时删除它。 因此,使Java VM垃圾收集器以某种方式管理对象的生命周期可能会很好。 C ++类不消耗任何资源,除了一些内存,不是很大。 所以没关系,如果几个这样的对象不会被破坏。 在C#中,我可能会在一些托管包装类中包装本机IntPtr句柄。 并且当托管包装器被垃圾收集时,覆盖它的终结器来调用本机对象的析构函数。 SafeHandle,AddMemoryPressure等也可能对此有所帮助。 这是与Java最终确定的不同的故事。 你在Java中的’Hello world’之后知道的第二件事是使用finalize是不好的。 有没有其他方法可以在Java中实现这一目标? 也许使用PhantomReference?

Java增强的循环 – 编辑原始数组值

我想详细了解Enhanced For Loop如何在Java中工作(假设我确实了解了这个循环的基本用法以及它是如何工作的)。 给出以下代码: String[] a = {“dog”, “cat”, “turtle”}; for (String s : a) { out.println(“String: ” + s); s = in.readLine(“New String? “); } 它实际上并没有修改原始列表’a’。 为什么不? 内存管理如何工作? 这不是’a [i]’的同一个存储单元的引用吗? 我在oracle文档中读到,增强for循环不能用于从原始数组中删除元素,这是有道理的。 修改值是否相同? 提前致谢

限制JTextPane内存使用量

我有一个应用程序,它不断地在套接字上接收数据,然后将这些数据记录到文件中,同时在JTextPane中显示这些数据。 当然,随着数据被写入JTextPane的底层文档,内存使用量继续增加。 是否有一种简单的方法来限制允许使用JTextPane的内存? 我希望JTextPane的工作方式类似于典型命令shell的命令历史记录的工作方式。

将值存储为变量还是再次调用方法更好?

最近,我开始学习一些Java。 从我已经了解的JVM开始,看起来JIT在需要CPU周期的操作(即调用方法)上使得它非常快,但也使它对内存感到饥饿。 因此,当我需要与之前相同的方法输出相同的输出时,通常更好的方法是将输出存储在变量中并再次使用它 – 同时将其保存在内存中 – 或者再次调用相同的方法?

使用App时Java内存使用量会增加,但在不使用时不会减少

我有一个java应用程序,使用时会占用大量内存,但是当程序没有被使用时,内存使用量不会下降。 有没有办法强制Java释放这个内存? 因为当时不需要这个内存,我可以理解保留少量内存,但Java只保留它曾经使用过的所有内存。 它也会在以后重用这个内存,但必须有一种方法可以强制Java在不需要时释放它。 System.gc无法正常工作。

Tomcat 6和Tomcat 8中使用Java 1.8的内存分配行为

相关问题: 从Java 6 + Tomcat 6升级到Java 8 + Tomcat 8时的垃圾收集器使用情况 我有一组用Java 8编译的webapps。如果我在Tomcat 8中运行它们,我会得到许多带有随机内存分配的次要GC集合。 在Tomcat 6中,内存分配更加线性和稳定(两种情况下都是空闲,没有流量)。 伊甸园空间雄猫8: 伊甸园空间雄猫6: 你知道为什么会这样吗? 编辑1: 这些是来自生产环境的数据,包括jdk 1.8和Tomcat 8.由于GC循环,CPU几乎总是很高。 对此有何评论? 编辑2: 这是一个heapdump analisis(1.8GB转储):

Android OutOfMemoryError – 加载JSON文件

我正在处理的应用程序需要读取一个大小为1.5到3 MB的JSON文件。 打开文件并将数据转换为字符串似乎没有问题,但是当它尝试将字符串转换为JSONArray时,会抛出OutOfMemoryErrors。 例外看起来像这样: E/dalvikvm-heap( 5307): Out of memory on a 280-byte allocation. W/dalvikvm( 5307): Exception thrown (Ljava/lang/OutOfMemoryError;) while throwing internal exception (Ljava/lang/OutOfMemoryError;) 关于这一点的一个奇怪的事情是崩溃只发生在应用程序运行的第二次或第三次,让我相信每次应用程序关闭时应用程序消耗的内存都不会被垃圾收集。 任何洞察我如何解决这个问题将不胜感激。 我对以块的forms加载文件的想法持开放态度,但我不太清楚这种任务的最佳方法是什么。 谢谢

删除Java中的一部分数组以释放堆上的内存

我正在为Java中的背包问题实现动态编程算法。 我声明了数组,然后将其大小初始化为[对象数] [背包的容量]。 当我的对象数量或容量变得太大时,我会收到内存错误,因为堆上的空间不足。 我的问题是:如果我继续删除双数组中的行,Java会在删除时释放内存吗? 或者Java是否保留了我最初创建的数组大小的内存空间? 如果是后者,有没有办法在Java中手动释放内存? 谢谢你的帮助!

使用HashMap进行Java内存管理

我正在开发一个应用程序,它将数据库中的大量数据读入Map<String,Map<String,Map>> ,对其进行处理,并使用in将处理后的报告写入电子表格-house xml writer。 整个运行大约需要12个小时。 我发现我得到了 Exception in thread “CursorController-Thread-0” java.lang.OutOfMemoryError: Java heap space at java.lang.AbstractStringBuilder.(AbstractStringBuilder.java:45) at java.lang.StringBuilder.(StringBuilder.java:68) 当我尝试编写这个jumbo文件时。 出于这个原因,我认为最好在完成处理时编写每个Map<String,Map> (注意这是一个更深的层)。 我的问题是,我怎样才能确保Map<String,Map>在我写完后不会保留在内存中,因为Map >>仍然会包含它?