我是靠谱客的博主 怕孤单柜子,这篇文章主要介绍Jdk8新特性(八):新的内存空间和异常处理8. JDK8 新的内存空间和异常处理,现在分享给大家,希望可以做个参考。

8. JDK8 新的内存空间和异常处理

8.1. JDK8内存空间Matespace

 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。


8.2. JDK7异常处理try-with-resources

8.2.1. Try-catch-finally

经典案例代码:数据库查询操作

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/dept?useUnicode=true&characterEncoding=utf8"; String username = "root"; String password = "1234"; public void OldTest() { Connection conn = null; PreparedStatement pst = null; ResultSet rs = null; try { Class.forName(driver); conn = DriverManager.getConnection(url, username, password); String sql = "select * from dept limit 1"; pst = conn.prepareStatement(sql); rs = pst.executeQuery(); while(rs.next()) { String name = rs.getString("name"); System.out.println(name);//研发部 } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { if(conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } if(pst != null) { try { pst.close(); } catch (SQLException e) { e.printStackTrace(); } } if(rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } }

8.2.2. Try-with-resources

在JDK7以前,Java没有自动关闭外部资源的语法特性,直到JDK7中新增了try-with-resources语法,才实现了这一功能。

try-with-resources并不是JVM虚拟机的新增功能,只是JDK实现的一个语法糖,反编译后,看到JVM实际执行的还是Try-catch-finally中的代码。

try-with-resources中,try后面圆括号内的代码即为resources(resources必须为实现java.lang.AutoCloseable或者java.io.Closeable接口的类),并且resources可以有多个,用分号隔开。try代码块执行完毕后,Java会自动调用close方法,这个动作会早于finally中的方法。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void newTest() { try { Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } String sql = "select * from dept limit 1"; try ( Connection conn = DriverManager.getConnection(url, username, password); PreparedStatement pst = conn.prepareStatement(sql); ResultSet rs = pst.executeQuery(); ){ while(rs.next()) { String name = rs.getString("name"); System.out.println(name);//研发部 } } catch (SQLException e) { e.printStackTrace(); } }

最后

以上就是怕孤单柜子最近收集整理的关于Jdk8新特性(八):新的内存空间和异常处理8. JDK8 新的内存空间和异常处理的全部内容,更多相关Jdk8新特性(八):新的内存空间和异常处理8.内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(82)

评论列表共有 0 条评论

立即
投稿
返回
顶部