1、jvm图解—1.6,1.7,1.8
2、jvm内存
栈内存:主要用于执行线程方法,存放局部变量、对象的引用地址。最常见的错误就是StackOverflowError,如无法返回的递归;
堆内存:主要存放对象、数组,比栈内存大的多,通过对堆内存划分不同的功能区块实现对堆内存中对象管理。最常见的错误就是OutOfMemoryError;
3、jdk1.8
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