深入理解java虚拟机读书笔记(一)

Chapter1:走近Java

jdk::java程序设计语言,Java虚拟机,Java API。。

JRE:java虚拟机,java API的SE子集


jdk1.7:dolphin


Chapter2:Java内存区域与内存溢出异常


C/C++语言认为内存分配太重要了,所以需要程序员全部负责内存的分配和回收。

优点:内存全部可见,程序员能够很灵活的控制内存的分配;

缺点:程序员的责任太多,非常容易出现不知名错误...


Java语言认为内存分配太重要了,所以需要Jvm来控制

优点:相对C/C++来说,人为造成内存错误发生的概率大大降低

缺点:一旦出现问题,很难排查出错误


jvm内存分布:

线程共享区域:所有线程共享的区域;

1、方法区:方法区用来存放已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据.....

方法区会出现OutOfMemoryError异常,例如在J2ee项目中加载进很多Jsp页面编译成的Servlet类..方法区中包含一个很重要的区域,运行时常量池,用来保存编译期生成的各种字面量和符号引用。在String实现的是时候用的比较多,是享元模式的一种实现。在运行期调用String的intern()方法可以将字符串常量存放进运行时常量池...

 2、堆:堆用来存放对象的实例,几乎所有的对象实例都在这里分配内存

        堆是垃圾收集器管理的主要区域,也被称为GC堆....

线程私有区域:

 3、程序计数器:当前线程的字节码的行号指示器,可以认为是当前线程的标识符

       程序计数器是唯一一个没有内存溢出异常的区域

  4、jvm栈:jvm栈描述了Java方法执行的内存模型,每个方法被执行的过程都会创建一个栈帧用于存储局部变量表、操作数栈、方法出口等信息

        每一个方法执行的过程,就对应着一个栈帧在虚拟机里从入栈到出栈的过程。jvm栈相当于一个先进后出的栈,每个栈帧从入口进入,达到满足条件之后移除栈,代         表方法结束;在一个方法内调用其他方法相当于在该栈帧的上方将另一个栈帧入栈,在这片区域内,会出现StackOverFlowError和OutOfMemoryError

  5、本地方法栈:用来执行Native方法的栈


StackOverFlowError例子:

public class Client{
	public static void main(String[] args) {
		A a = new A();
	}
}

class A{
	public B b = new B();
}
class B{
	public A a = new A();
}
在上述例子中只有一个线程,首先调用类A的init()方法,A的init方法的栈帧进入线程的jvm栈,该方法需要调用类B的init方法,Bini方法的栈帧t进入线程的jvm栈..现在栈中有两个栈帧..执行B的init方法又需要执行A的init方法,也就是将A的init方法的栈帧入栈...所以出现无限循环,栈的深度过大,出现StackOverFlowError..


OutOfMemorErroryError例子:

public class Client{
	public static void main(String[] args) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		for(int i = 1;i>0;i++)
			list.add(1);
	}
}
在上述例子中,在堆上申请了一个list,然后无限添加数据,直到超过堆的最大容量,就会报出Exception in thread "main" java.lang.OutOfMemoryError: Java heap space错误...


对象访问:

例子:Object a = new Object(),

“Object a”会映射到Java栈中的本地变量表中,作为一个reference类型数据出现;

"new Object()"会映射到Java堆中,形成一块存储了Object类型的所有实例数据值的内存,里面还包含了方法区Object Class的地址...(在堆中new出的一个对象,只包含该类的对象的实例数据值,而方法及其他信息都存放在方法区中)


引用的两种定位方式:

1、句柄访问模式:堆中划分出句柄池,引用指向句柄池的一个句柄,句柄指向对象地址和类型信息..图片如下:

该模式的优点在于reference中存储的是固定的句柄地址,在垃圾收集中对象被移动的时候,不需要修改reference中的数据,直接修改句柄池的指向即可

2、直接指针访问模式:reference中直接存储对象的地址..


该模式的优点在于可以直接通过引用访问对象,不需要经过句柄池,所以速度相对较快...Sun HotSpot就是用这一种方式实现的..


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值