JVM

1. Jvm

1.1 内存模型包含方法区,栈,堆,本地方法栈。

1.2 方法区,也称为"永久代"、"非堆",它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。默认最小值为16MB,最大值为64MB,可以通过-xx:PermSize和-xx:MaxPermSize参数限制方法区的大小。

注:方法区又称为永久区。在JDK6中,String等常量信息置于方法区,在JDK7中,已经移到了堆。

1.3栈,描述的是java方法执行的内存模型:每个方法被执行的时候都会创建一个"栈帧"用于存储局部变量表(包括参数)、操作栈、方法出口等信息。每个方法被调用到执行完的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。生命周期与线程相同,是线程私有的。局部变量表存放了编译器可知的各种基本数据类型(booleanbytecharshortintfloatlongdouble)、对象引用(引用指针,并非对象本身)其中64位长度的longdouble类型的数据会占用2个局部变量的空间,其余数据类型只占1个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量表是完全确定的,在运行期间栈帧不会改变局部变量表的大小空间。

1.4本地方法栈,与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的java方法服务,而本地方法栈则是为Native方法服务。

1.5堆,也叫做java堆、GC堆,是java虚拟机所管理的内存中最大一个块内存区域,也是被各个线程共享的内存区域,在JVM启动时创建。该内存区域存放了对象实例及数组(所有new出来的对象)。其大小通过-Xms(最小值)-Xmx(最大值)参数设置,-XmsJVM启动时申请的最小内存,默认为操作系统物理内存的1/64-XmxJVM可申请的最大内存,默认为物理内存的1/4,默认当空余堆内存小于40%时,JVM会增大Heap直到-Xmx指定值的最大限制,可通过-xx:MinHeapFreeRation=值,来指定这个比例的大小;当空余堆内存大于70%时,JVM会减小heap直到-Xms指定值的最小限制,可通过-xx:MaxHeapFreeRation=值,来指定这个比例的大小。对于运行系统,为避免在运行时频繁调整Heap的大小,通常-Xms-Xmx的值都设置成一样。

由于现在收集器都是采用分代收集算法,堆被划分新生代和老年代。新生代主要存储新创建的对象和尚未进入老年代的对象。老年代存储经过多次新生代GC(Minor GC)仍然存活的对象

新生代:

程序新创建的对象都是从新生代分配内存,新生代有Eden Space和两块相同大小的Survivor Space(通常又称为S0S1或者FromTo)构成,可通过-Xmn参数来指定新生代的大小,也可以通过-xx:survivorRation来调整Eden SpaceSurvivor Space的大小。Survivor Space主要用于存放每次垃圾回收后存活的对象。

老年代:

用于存放经过多次新生代GC仍然存活的对象,例如缓存对象,新建的对象也有可能直接进入老年代,主要有两种情况:一种是大对象,可通过启动参数设置-xx:PretenureSizeThreshold=1024(单位字节,默认为0)来代表超过多大时就不再新生代分配,而是直接在老年代分配。另外一种情况是大的数组对象。

注:老年代所占的内存大小为-Xmx对应的值减去-Xmn对应的值。

1.6 GC,分代回收算法

我们一般讨论的垃圾回收主要针对Java堆内存中的新生代和老年代,也正因为新生代和老年代结构上的不同,所以产生了分代回收算法,即新生代的垃圾回收和老年代的垃圾回收采用的是不同的回收算法。针对新生代,主要采用复制算法,而针对老年代,通常采用标记-清除算法或者标记-整理算法来进行回收。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值