JVM内存参数( -Xms -Xmx -Xmn -Xss 直接内存)

JVM调优总结 -Xms -Xmx -Xmn -Xss 

jvm 内存 在不同的情况下如何增大 及 PermGen space 相关

JVM日志和参数的理解

JVM崩溃Log日志分析

-Xms 为jvm启动时的内存
-Xmx 为jvm运行最大内存
-Xss  为jvm每个线程内存大小
-Xmn :设置年轻代大小。
整个堆大小=年轻代大小 + 年老代大小 ,而整个堆大小=年轻代 大小 + 年老代大小 + 持久代大小
-XX:PermSize=64M     JVM初始分配的非堆内存
-XX:MaxPermSize=128M JVM最大允许分配的非堆内存
-XX:MaxDirectMemorySize=10M   最大直接内存

堆和非堆

1,堆就是Java代码可及的内存,是留给开发人员使用的;
2,非堆就是JVM留给自己用的,
  方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。 

直接内存(Direct Memory)

并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,也可能导致OutOfMemoryError 异常出现

在JDK 1.4 中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O 方式,

它可以使用Native 函数库直接分配堆外内存,然后通过一个存储在Java 堆里面的DirectByteBuffer 对象作为这块内存的引用进行操作。

这样能在一些场景中显著提高性能,因为避免了在Java 堆和Native 堆中来回复制数据。

优点:

Java直接内存与非直接内存性能测试

直接内存需要allocateDirect创建,但是它比申请普通的堆内存需要耗费更高的性能。
不过,这部分的数据是在JVM之外的,因此它不会占用应用的内存。

ByteBuffer有两种:

heap ByteBuffer -> -XX:Xmx
1
.一种是heap ByteBuffer,该类对象分配在JVM的堆内存里面,直接由Java虚拟机负责垃圾回收,
direct ByteBuffer -> -XX:MaxDirectMemorySize
2.一种是direct ByteBuffer是通过jni在虚拟机外内存中分配的。通过jmap无法查看该快内存的使用情况。只能通过top来看它的内存使用情况

 

posted @ 2018-03-03 11:34  假程序猿  阅读(2832)  评论(0编辑  收藏  举报