当前位置: 首页 > 面试题库 >

-d64开关对Sun JVM驻留内存使用量有什么影响(如果有)?

董高洁
2023-03-14
问题内容

我有一个需要一些内存调整的webapp。尽管我已经对应用程序本身进行了概要分析并进行了精简,但在我们最繁忙的实例上,JVM本身似乎显得过分膨胀。(低容量实例不存在此问题。)详细信息:

  • 平台:
    • RHEL4 64位(Linux 2.6.9-78.0.5.ELsmp #1 SMP x86_64
    • Sun Java 6(Java HotSpot(TM) 64-Bit Server VM (build 10.0-b23, mixed mode)
    • 带有-d64in的Tomcat 6startup.sh
  • 我的webapp当前有一些代码在生产中需要运行64位的好处。
  • 我观察到,一段时间(一周)后,JVM的驻留内存大小(如顶部所示)是我的-Xmx设置的 三倍
  • 非堆内存大小等相对来说都是微不足道的,仅占堆大小的百分之几
  • 只有一段代码需要64位位地址空间

如果我可以重构对64位JVM的需求并放弃-d64开关,那是否会使JVM的驻留内存占用空间更小?换一种说法…

-d64 切换对Sun JVM驻留内存使用有什么影响(如果有)?


问题答案:

使用d64开关可使JVM进入64位模式。从技术上讲,在Solaris / Linux和大多数Unix上,JVM进程将以LP64模型执行

该LP64模型是从32位模型(ILP32)中的指针碰巧是64位宽的,而不是32位指针的不同。对于JVM,这允许更大的内存可寻址性,但这也意味着仅对象引用所占用的大小增加了一倍。因此,在给定的时间,在32位JVM和64位JVM中,相同数量的对象会有更大的膨胀。

经常被忘记的另一件事是指令本身的大小。在64位JVM上,指令的大小将占用本机寄存器的大小。

但是,如果您在64位环境中使用压缩对象指针,则对于堆大小大于4
GB的情况,JVM将尽可能对指针进行编码和解码。简而言之,当您使用压缩指针时,JVM会尝试尽可能多地使用32位宽的值。

提示:使用 -XX:+ UseCompressedOops
来打开UseCompressedOops标志,以消除某些膨胀。YMMV,但是人们报告说使用压缩的oops可使内存膨胀减少多达50%。

编辑

Java HotSpot VM的14.0版支持UseCompressedOops标志,可从Java 6 Update
14开始使用



 类似资料:
  • 问题内容: 我有一个用Golang编写的小守护程序,该守护程序可以循环运行并完成一些工作。我发现,在使用CGO_ENABLE = 1或CGO_ENABLED = 0进行编译时,守护程序的行为会有所不同。例如,在CGO_ENABLE = 1(默认设置)的情况下,程序的VSZ在短时间内(在一小时内)膨胀到1-2GB。如果CGO_ENABLED = 0,则VSZ在很长一段时间(几天内)都相同。查看以下数

  • 问题内容: 一个的类上堆和参考变量指向它创建。 如果我写的时候没看错 类的对象在堆上创建并指向它。在堆中,我们有两个单独的对象,其中包含它们自己的实例变量。 但是如果我写 还有两个将在堆上创建,一个用于,另一个用于。但仅提供参考 即可。谁指的是堆外层?如果没有任何引用引用它,那么它应该有资格进行垃圾回收,这将影响的使用。 问题答案: 内部类包含对其外部类实例的隐藏引用。如果没有其他引用,则该隐藏引

  • 我是java内存问题的新手,在调试java进程的内存使用时遇到了问题,需要你的帮助。根据“the java进程占用8G常驻内存和9.4G虚拟内存。这对于这个进程来说太多了,我想检查一下为什么它会吃掉内存。所以我使用jmap进行了一次堆转储(没有使用‘live’选项,因为它可能会触发GC ),发现只有100MB的活动对象,还有1.5G的不可达对象。那么剩下的6G内存去哪了?我应该检查哪些其他类型的非

  • 问题内容: 我们最近对生产系统的观察告诉我们Java容器的常驻内存使用量正在增长。关于此问题,我们已经进行了一些调查,以了解为什么Java进程使用pmap之类的本地工具会比堆+线程堆栈+共享对象+代码缓存+等消耗更多的内存。结果,我们发现本机进程(可能是malloc / mmap)分配了一些64M内存块(成对): 我将0000000720000000 3670016K的行解释为我们使用JVM参数“

  • 下面是vb中的一个特殊情况。我搞乱了SuppressKeyPress属性,发现了一些奇怪的东西。 形势 假设我有一个名为的输入框,我希望名称不带任何数字,当插入数字时,会弹出一个MessageBox并报告错误。 在这种情况下,由于某种奇怪的原因,如果我键入一个数字,它将被写入文本框中,尽管我抑制了按键。 我发现,如果我删除MsgBox行,数字将不会出现在输入框中。 问题 这是怎么回事?为什么Msg

  • 我在Apache HttpClients教程中读到关闭并丢弃连接。我的问题是,当我们使用一个只管理单个连接的时,我调用我是否无法重用同一个HttpClient,因为连接已经关闭并被丢弃?