直到今天,我才知道java有堆,堆是由JVM创建的。此外,这个内存是由操作系统分配给JVM实例的,即堆驻留在JVM实例中。
这表明,JVM和堆相距甚远。
所以,我现在很困惑,有谁能让我知道,我以前是错的还是我不能理解这幅画?
你混淆了两件事。第一个是进程内存。是的,堆是JVM进程内存的一部分。图片中标记为“JVM”的内容很可能是JVM的程序代码。它与堆分开是有道理的。实际上,几乎所有的程序都有独立的代码/数据区;我不确定,但我认为操作系统对此负有部分责任。
绿色的JVM很可能不是JVM实例,而是驻留在系统内存中的JVM代码,在Java堆中有您期望的JVM实例。
如果你看下面这张图,就会更清楚,图中绿色的JVM将位于主机操作系统的蓝色区域内
关于这个问题有很多要讨论的。我总是喜欢IBM的文章,因为它包含非常好的信息。对于这个具体问题,这里是一个节选。
来自IBM上的native和Java heaps文章:
JVM维护两个内存区域,Java™ 堆,以及本机(或系统)堆。这两个堆有不同的目的,由不同的机制维护。
Java堆包含Java对象的实例,通常被称为“堆”。垃圾收集维护的是Java堆,命令行堆设置更改的是Java堆。Java堆是使用mmap分配的,如果请求大页面支持,则使用shmat。Java堆的最大大小在JVM启动期间预先分配为一个连续区域,即使最小堆大小设置较低。此分配允许最小堆大小设置施加的人工堆大小限制随着堆扩展而向实际堆大小限制移动。
本机或系统堆是使用操作系统的底层malloc和free机制分配的,用于特定Java对象的底层实现;例如:
希望它能帮助你理解。
我在阅读HBase文档时遇到了离堆读取路径,据我所知,离堆是内存中的一个地方,Java在那里存储垃圾回收器无法触及的对象。我还去搜索了一些方便使用离堆内存的libs,并找到了Ehcatche,但是,我找不到任何关于他的oracle或JVM的官方文档。那么,这是JVM的标准功能,还是某种程度的攻击,如果是,那么底层的类和技术是什么。
我们Java开发人员有时会使用来确保我们为每个特定于线程的堆栈提供了1MB的空间。现在,我经常感到困惑,JVM从哪里借用了1MB,从堆或系统内存中借用,或者Java为线程分配任何特定的内存。你能帮我理解一下吗? 此外,我们是否有一个可视化(插件)运行时工具,可以以可理解的方式显示堆和堆栈的内容? 提前感谢。
我使用的是ignite 2.9。本机持久性已禁用。 使用在堆缓存上启用 缓存配置。setOnheapCacheEnabled(真) 但我仍然可以在日志中看到堆外指标。 在将on heap设置为true后,它不应该只使用堆内存吗 什么类型的数据存储在堆外 在为堆上的默认数据区域定义的逐出策略为random2Lru和LRU的情况下,逐出如何工作
问题内容: 我们在 Tomcat 服务器上部署了一个Web应用程序。我们运行某些计划的作业,然后堆内存达到峰值并稳定下来,一切似乎都很好。但是,系统管理员抱怨内存使用率(Linux上的“ top”)随着计划的作业的增加而不断增加。堆内存和CPU内存之间有什么关联?可以通过任何JVM设置来控制它吗?我使用 JConsole 监视系统。 我通过JConsole强制进行垃圾收集,并且堆使用率下降了,但是
问题内容: 以下代码段是否会降低性能? 还是这段代码实际上更有意义? 如果在字节码中这两个完全相等,那么显然第一种方法在样式方面看起来更好,但我想确保确实如此。 问题答案: 在当今的编译器中,没有。我在最小范围内声明对象,因为对于下一个家伙而言,它更具可读性。
问题内容: 我有一个div元素,并且在该div中,我们在p元素之间有文本。 我想添加一个标题。它应该放在p的内部还是外部? 哪个更好: 要么 问题答案: 无法将heading元素放置在HTML标记的元素内,不仅是形式上的,而且因为浏览器在遇到标题时会隐式终止一个打开的元素。所以这个问题是没有意义的:一个在特定上下文中不存在的元素在那个上下文中不能有任何意义(语义)。 您可以使用元素,也可以使用HT