java8新特性(六)元空间

JDK8⾥⾯的新的内存空间MetaSpace

  • JVM 种类有很多,⽐如 Oralce-Sun Hotspot, Oralce JRockit, IBM J9, Taobao JVM,我们讲的是Hotspot才有,JRockit以及J9是没有这个区域
  • JVM内存知识 在JDK8之前的HotSpot JVM,有个区域叫做“永久代(permanent generation), 通过在命令⾏设置参数-XX:MaxPermSize来设定永久代最⼤可分配的内存空间
  • 如果JDK8⾥⾯设置了PermSize 和 MaxPermSize 会被忽略并给出警告
  • 作⽤:该块内存主要是被JVM⽤来存放 class 和 mate 信息的,当 class 被加载 loader 的时候就会被存储到该内存区中,如⽅法的编译信息及字节码、常量池和符号解析、类的层级信息,字段,名字等
  • jdk8的修改 JDK8 HotSpot JVM 使⽤本地内存来存储类元数据信息,叫做 元空间(Metaspace)
  • 在默认情况下Metaspace的⼤⼩只与本地内存⼤⼩有关
  • 常⽤的两个参数 -XX:MetaspaceSize=N 指Metaspace扩容时触发FullGC的初始化阈值
  • -XX:MaxMetaspaceSize=N 指⽤于限制Metaspace增⻓的上限,防⽌因为某些情况导致Metaspace⽆限的使⽤本地内存
  • 不管两个参数如何设置,都会从20.8M开始,然后随着类加载越来越多不断扩容调整直到最⼤
  • 查看⼤⼩ jstat -gc pid MC: current metaspace capacity MU: mateaspace utilization 单位是KB

JDK7新特性之try-with-resources

  • JDK7⾥⾯的try-with-resources资源处理
  • 什么是try-with-resources
    • 资源的关闭很多⼈停留在旧的流程上,jdk7新特性就有,但是很多⼈以为是jdk8的 在try( …)⾥声明的资源,会在try-catch代码块结束后⾃动关闭掉

旧的

public static void main(String[] args) throws IOException {
 String path = "/Users/jack/Desktop/t.txt";
 test(path);
 }
 private static void test(String filepath) throws FileNotFoundException {
 OutputStream out = new FileOutputStream(filepath);
 try {
 out.write((filepath+"可以学习java架构课程").getBytes());
 } catch (Exception e) {
 e.printStackTrace();
 }finally {
 try {
 out.close();
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 }
  • 新的
private static void test(String filepath){
 try(OutputStream out = new FileOutputStream(filepath);) {
 out.write((filepath+"可以学习java架构课程").getBytes());
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
  • 注意点 1、实现了AutoCloseable接⼝的类,在try()⾥声明该类实例的时候,try结束后⾃动调⽤的close⽅法,这个动作会早于finally⾥调⽤的⽅法
  • 不管是否出现异常,try()⾥的实例都会被调⽤close⽅法
  • try⾥⾯可以声明多个⾃动关闭的对象,越早声明的对象,会越晚被close掉

猜你喜欢

转载自blog.csdn.net/lin819747263/article/details/102750176
今日推荐