小滴课堂-学习笔记:(9) Java高级核心之玩转 JDK8 新的内存空间和异常处理

56 篇文章 0 订阅

logo 愿景:"让编程不再难学,让技术与生活更加有趣"


更多架构课程请访问 xdclass.net

目录

第1集 JDK8新特性之新内存空间Matespace

第2集 JDK7新特性之try-with-resources

干货文档


第1集 JDK8新特性之新内存空间Matespace

简介:讲解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 的时候就会被存储到该内存区中,如方法的编译信息及字节码、常量池和符号解析、类的层级信息,字段,名字等

  • 有大项目经验的同学对下面这个异常应该熟悉 java.lang.OutOfMemoryError: PermGen space

    原因是: 永久代空间不够,类太多导致

 

  • 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

 

第2集 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里调用的方法

2、不管是否出现异常,try()里的实例都会被调用close方法

3、try里面可以声明多个自动关闭的对象,越早声明的对象,会越晚被close掉

干货文档

                                                        关注公众号发送:“CSDN干货文档”  即可领取

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dev666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值