jdk1.8之jvm变化

1、jvm图解—1.6,1.7,1.8

14195428_ip7j.jpg

2、jvm内存

栈内存:主要用于执行线程方法,存放局部变量、对象的引用地址。最常见的错误就是StackOverflowError,如无法返回的递归;

堆内存:主要存放对象、数组,比栈内存大的多,通过对堆内存划分不同的功能区块实现对堆内存中对象管理。最常见的错误就是OutOfMemoryError;

3、jdk1.8

194404_b8BO_3787772.png

3.1、jvm变化

元空间(Metaspace): 一个新的内存空间,完全移除了永久代(PermGen)。

元空间的本质和永久代类似,都是对JVM规范中方法区的实现。他们的最大区别在于元数据空间并不在虚拟机中,而是使用本地内存

JVM参数-XX:PermSize 和 -XX:MaxPermSize会被忽略,当前在启动时会有警告信息

元空间参数:-XX:MetaspaceSize、-XX:MaxMetaspaceSize、-XX:MinMetaspaceFreeRatio、-XX:MaxMetaspaceFreeRatio

3.2、对比

jdk1.7及以往的版本中,Java 类信息、常量池、静态变量都存储在 Perm(永久代)里(说明其实jdk1.7 就开始“去永久代”的工作了,如把字符串常量池从永久代中剥离出来,存放在堆空间中)。

类的元数据和静态变量在类加载的时候分配到 Perm,当类被卸载的时候垃圾收集器从 Perm 处理掉类的元数据和静态变量。常量池的东西也会在 Perm 垃圾收集的时候进行处理。

jdk1.8对 jvm 架构的改造将类的元数据放到本地内存中,另外,将常量池和静态变量放到 Java 堆里。HotSopt VM 将会为类的元数据明确分配和释放本地内存。

在这种架构下,类元信息就突破了原来 -XX:MaxPermSize 的限制,现在可以使用更多的本地内存。这样就从一定程度上解决了原来在运行时生成大量类的造成经常 Full GC 问题,如运行时使用反射、代理等。

注意:如果不设置-XX:MaxMetaspaceSize ,JVM将会根据一定的策略自动增加本地元内存空间。如果你设置的元内存空间过小,你的应用程序可能得到以下错误:

java.lang.OutOfMemoryError: Metadata space

3.3、优点

1、java.lang.OutOfMemoryError: PermGen的空间问题将不复存在,并且不再需要调整和监控这个内存空间;

2、permSize:原来的jar包及你自己项目的class存放的内存空间,这部分空间是固定的,启动参数里面-permSize确定,如果你的jar包很多,经常会遇到permSize溢出,且每个项目都会占用自己的permGen空间。改成metaSpaces,各个项目会共享同样的class内存空间,比如两个项目都用了fast-json开源包,在mentaSpaces里面只存一份class,提高内存利用率,且更利于垃圾回收;

3、元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制;

4、Minor GC、Major GC和Full GC

清理Eden区和 Survivor区叫Minor GC。

清理Old区叫Major GC。

清理整个堆空间—包括年轻代和老年代叫Full GC。

 

Ref:

http://blog.youkuaiyun.com/o_nianchenzi_o/article/details/78629929

http://blog.youkuaiyun.com/bruce128/article/details/79357870

https://www.cnblogs.com/sxdcgaq8080/p/7156227.html

 

转载于:https://my.oschina.net/u/3787772/blog/1634807

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值