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

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

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中的方法。

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();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值