Java虚拟机(五) -性能调优

一、分配大容量的堆内存,可能导致一次Full GC的停顿时间过长(网站不定期失去响应)。

给虚拟机分配超大堆的前提:

是有把握把应用程序的Full GC频率控制得足够低,至少要低到不影响用户使用。 譬如十几个小时乃至一天才会出现一次Full GC, 这样可以通过在深夜执行定时任务的方式触发Full GC甚至自动重启应用服务器来保持内存的可用空间在一个稳定的水平。

控制Full GC频率的关键:
应用中绝大多数对象符合“照生夕灭”的原则,即大多数对象的生存时间不应太长,尤其不能有成批量的、长生存时间的大对象产生,这样才能保障老年代空间的稳定。

二、堆外内存导致的溢出错误

如果程序不定时抛出内存溢出错误,但jstat(上一篇讲到的,虚拟机统计信息监视工具)显示,GC并不频繁,Eden区、Survivor区、老年代内存全部正常,压力不大。
这时候可以考虑,是否是堆外内存不够,导致的溢出错误。

堆外内存:

  • Direct Memory
    可通过-XX:MaxDirectMemorySize调整大小,内存不足时抛出OutOfMemoryError或者OutOfMemoryError: Direct buffer memory.
  • 线程对战:
    可以通过-Xss调整大小,内存不足时抛出StackOverflowError或者OutOfMemoryError: unable to create new native thread.
  • Socket缓存区:
    每个Socket连接都有Receive和Send两个缓冲区,分别占37KB和25KB内存,如果连接多,这块内存占用也很可观。如果无法分配,可能会抛出IOException: Too manay open files异常
  • JNI代码:
    如果代码中使用JNI调用本地库,那本地库使用的内存也不在堆中。
  • 虚拟机和GC:
    虚拟机、GC的代码执行也要消耗一定的内存。

[1] 周志明 · 深入理解Java虚拟机 :机械工业出版社

一、什么是JVM  JVMJava Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。  Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。二、JVM的组成我们先把JVM这个虚拟机画出来,如下图所示:从这张图中我们可以看出,JVM是运行在操作系统之上的,它与硬件没有直接的交互,我们再来看JVM由哪些部分组成,如下图所示:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值