一.JVM的出现

  1. JVM将字节码解释成不同os下的机器指令,有了jvm,java语言在不同平台上运行时不需要重新编译

  2. 虚拟机发展史

    (1)Sun Classic

    1. classic jvm要么采用纯解释器解释执行,要么采用JIT编译执行,一旦JIT进行编译执行,则解释器不再生效
    2. 如果使用JIT编译代码,则JIT会对每个方法,每行代码都进行编译,对于那种只需运行一次,不具有编译价值的代码,也会被JIT编译执行。迫于程序响应时间的压力,此阶段的JIT不敢采用编译耗时的优化技术,所以及时采用JIT输出本地代码,他的执行效率也和C代码有很大差距。被人诟病“java语言很慢”

    (2)Exact VM

    1. Exact VM进入了高性能虚拟机时代,开始使用编译器解释器混合模式
    2. Exact VM使用了精确式内存管理,他能判定内存中摸个位置的数据具体是什么类型。eg:内存中有一个数是12345,ExactVM可以判断他是一个int数字,还是一个指向内存12345地址的引用。这种精确式内存管理,在gc时,可以直接回收引用类型的数据,少了像classic vm时代gc时的数据类型查找过程

    (3)HotSpot虚拟机

    1. Hot Spot是当前jdk采用的虚拟机 (1.4以后)
    2. 热点代码探测技术:通过计数器找出最具编译价值的代码,通知JIT以方法为单位进行编译。如果方法被频繁调用,则触发标准编译;如果方法中循环次数很多,触发栈上替换编译动作。
    3. HotSpot无需等待本地代码输出后才能执行程序,使得即时编译压力减小,有助于采用更更多的代码优化技术。输出高质量的操作系统本地代码

二. JVM运行时数据区域

  1. 线程隔离的数据区

    (1)程序计数器:

    1. 字节码的行号指示器。解释器根据程序计数器选取要执行下条指令。分支,循环,跳转,异常处理,线程恢复等基础功能都需要程序计数器来完成。
    2. 为了线程切换后能继续执行正确的代码,每条线程都要维护自己的程序计数器,各个线程间的程序计数器互不影响
    3. 如果线程执行的是native方法,则该线程的程序计数器值为空

    (2)虚拟机栈:

    1. 虚拟机栈用来执行java方法
    2. 每个java方法执行的时候都会创建一个栈帧。栈帧用来存储局部变量表,操作数栈,动态链接,方法出口等信息。

    (3)本地方法栈

    1. 本地方法栈用来执行native方法
  2. 线程共享数据区

    (1)java堆

    1. java堆存储对象实例
    2. java堆分为新生代和老年代。新生代分为eden,from survive,to survive空间

    (2)静态区

    1. 静态区也叫做永久带,存放类信息,常量池,静态变量,JIT编译后的代码等。
    2. 常量池技术:为了方便创建一个对象二出现的。当需要创建一个对象时,如果常量池中有该对象,则直接从池子中取出来,在重复创建相等变量时节省了很多时间。eg:str1=“abc”,str2=“abc”。这样直接声明的字符串会放到常量池中,所以str1和str2是静态区常量池中的同一块内存地址

三. JVM的4中引用

  1. 强引用:new对象。其他引用方式都实在强引用失效(置成null后才有用)

  2. 软引用

    (1)一个对象被强引用new出来以后,在jvm中,可以存在软引用

    (2)对象=null使得强引用失效后,如果对象还存在软引用,则引用的对象在gc时不会被垃圾回收。只有当jvm发生内存溢出前,软引用引用的对象才被回收。因此,软引用可以被当做缓存

    Person p = new Person();
    SoftReference<Person> softReference = new SoftReference<>(p); p = null; // 断开强引用
    System.gc();
    System.out.println(softReference.get().getName()); // 输出aaa
  3. 弱引用

    触发gc时,就会被当做垃圾回收。若引用的生命周期是强引用失效后,到gc触发时

        Person p = new Person();
    WeakReference<Person> reference = new WeakReference<>(p); p = null; // 断开强引用
    System.out.println(reference.get().getName()); // 输出aaa
    System.gc();
    System.out.println(reference.get().getName()); // 抛出nullexception
  4. 幽灵引用

    幽灵引用和没有引用一样,对象的生命周期和只有强引用时一样。只是在对象被回收时会收到一个系统通知

        Person p = new Person();
    ReferenceQueue<Person> referenceQueue = new ReferenceQueue<>();
    PhantomReference<Person> reference = new PhantomReference<>(p,referenceQueue); p = null; // 断开强引用
    try{
    System.out.println(reference.get().getName()); // 抛出nullpointer Exception
    }catch (Exception e){e.printStackTrace();}
    System.gc();
    try{
    System.out.println(reference.get().getName()); // 抛出nullpointer Exception
    }catch (Exception e){e.printStackTrace();}

【注】:软引用和若引用都延长了对象引用的生命周期,一个延长至oom发生,一个延长至gc发生时。幽灵引用只是提供对象gc的通知

ThreadLocal使每个线程保存各自的变量副本,值得注意的是,这个变量要在每个线程内部初始化,因为ThreadLocal不会生成变量副本,如果在线程外初始化变量,仍然有线程安全问题

一. JVM发展史,运行时数据区域,四大引用的更多相关文章

  1. JVM<一>----------运行时数据区域

    参考:1.JVM Specification: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5 2.< ...

  2. JVM学习-运行时数据区域

    目录 前言 运行时数据区 程序计数器 Java虚拟机栈 局部变量表 基础数据类型 对象引用 returnAddress 操作数栈 动态链接 方法返回地址 Java堆 方法区 类型信息 字段描述符 方法 ...

  3. JVM学习笔记:Java运行时数据区域

    JVM执行Java程序的过程中,会使用到各种数据区域,这些区域有各自的用途.创建和销毁时间.根据<Java虚拟机规范>,JVM包括下列几个运行时数据区域,如下图所示: 其中红色部分是线程私 ...

  4. JVM运行时数据区域

    上面已经聊过JVM是什么东东,也谈过了JVM内存的垃圾回收机制.这一篇博客我们来聊聊JVM运行时数据区域. JVM运行时数据区域由5块部分组成,分别是堆,方法区,栈,本地方法栈,以及程序计数器组成. ...

  5. JVM 内存区域 (运行时数据区域)

    JVM 内存区域 (运行时数据区域) 链接:https://www.jianshu.com/p/ec479baf4d06 运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内 ...

  6. 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域

    深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...

  7. [jvm]运行时数据区域详解

    了解虚拟机是怎么使用内存的,有助于我们解决和排查内存泄漏和溢出方面的问题.详解java虚拟机内存的各个区域,分析这些区域的作用服务对象以及可能发生的问题. 一.运行时数据区域 java虚拟机在执行ja ...

  8. JVM学习笔记(1)--运行时数据区域

    运行时数据区域 相对于c,c++.程序设计时,java并不需要手动释放或者创建内存用于存放程序,这的确使得java开发变得容易和轻松,一旦有一天出现了内存泄漏或者内存溢出的问题,如果不了解JVM虚拟机 ...

  9. JVM 运行时数据区域划分

    目录 前言 什么是JVM JRE/JDK/JVM是什么关系 JVM执行程序的过程 JVM的生命周期 JVM垃圾回收 JVM的内存区域划分 一.运行时数据区包括哪几部分? 二.运行时数据区的每部分到底存 ...

随机推荐

  1. ASP.NET Web API与Rest web api(一)

    本文档内容大部分来源于:http://www.cnblogs.com/madyina/p/3381256.html HTTP is not just for serving up web pages. ...

  2. c#部分---网吧充值系统;简易的闹钟;出租车计费;简单计算器;对战游戏;等额本金法计算贷款还款利息等;随机生成10个不重复的50以内的整数;推箱子;

    网吧充值系统namespace ConsoleApplication1 { class Program { struct huiyuan { public string name; public st ...

  3. JavaWeb学习记录总结(二十九)--Servlet\Session\Cookie\Filter实现自动登录和记住密码

    一.Servlet package autologin.servlet.login; import java.io.IOException;import java.security.MessageDi ...

  4. HDU 5957 Query on a graph

    HDU 5957 Query on a graph 2016ACM/ICPC亚洲区沈阳站 题意 \(N(N \le 10^5)\)个点,\(N\)条边的连通图. 有\(M \le 10^5\)操作: ...

  5. sql中的字符串匹配、函数大全

    假设你想建立一个与Yahoo功能相似的Internet目录.你可以建立一个表用来保存一系列的站点名称,统一资源定位器(URL),描述,和类别,并答应访问者通过在HTML form中输入要害字来检索这些 ...

  6. Oracle数据库五种约束

    oracle 数据库 数据表的5个约束类型:1.主键约束2.外键约束3.唯一约束4.检查约束5.非空约束 主键约束:用来唯一标示表中的一个列,一个表中的主键约束只能有一个,但是可以在一个主键约束中包含 ...

  7. 英语语法最终珍藏版笔记-17名词性-主语-宾语-同位语-表语-that从句

    名词性从句 在主从复合句中,从句可以充当主句的主语.表语.宾语或同位语.由于在多数情况下,主语.表语.宾语或同位语这四种句子成分由名词性词类充当,所以,我们把这些作用相当于名词的从句统称为名词性从句, ...

  8. Debugging a Parallel Application

    Walkthrough: Debugging a Parallel Application https://msdn.microsoft.com/en-us/library/dd554943.aspx ...

  9. premiere视频输出参数设置

  10. Java文件读写操作指定编码方式。。。。。

    读: File file=new File(this.filePath);BufferedReader br=new BufferedReader(new InputStreamReader(new ...