zoukankan      html  css  js  c++  java
  • 《深入理解Java虚拟机》-- 对缓存的理解

    此文转载自:https://blog.csdn.net/qq_39414348/article/details/113184169

    不才,笔者第一次学习缓存,是在学习redis的时候,是在培训班学习了一些java的启蒙知识。但是在后来的深入学习之后,对缓存又有了新的认识。

    1.池的思想。比如java的各种池,常量池,线程池,句柄池,连接池,池的思想也是源于缓存,就是把一些需要反复建立的对象从一个空间***搬***到一个更快更容易获取的空间,减少了因为对象的建立而导致的等待时间,也减少了反复新建一个对象的资源和空间。

    2.Java的包装类也有自己的缓存数据,所以包装类的比较也是用equals,而不是“==”,比较的实际内容,而不是实际的堆内地址。

    3.JIT(即时编译器)也会把热点代码(超过规定的阈值)放到本地内存,而不是反复的使用使用解释器反复编译,而是使用编译器把热点代码编译放到缓存,提升后续的编译效率。这个思想其实也启发了我在实际工作中对一些程序的优化思考。比如说,在程序中做一些埋点动作来记录一些数据和对象的出现次数,达到一定阈值后,可以考虑把这些热点数据存到redis或者本地HashMap,LinkedHashMap中来提高程序整体性能,也减少了堆的空间,减少JVM参数优化的必要。

    4.Mybatis也有的自己的一级缓存和二级缓存,把第一次查询结构缓存到sqlsession和namespace中,实际上我们的Mysql的InnoDB存储引擎也暖心的增加了自己的缓存,所以实际上sqlssion级别的缓存只能提升一些ORM转换,和连接池建立的时间,实际上的sql查询已经被innoDB缓存了。

    5.redis把硬盘的数据拿到了内存中,提升了服务器拿数据的效率,也减少了反复请求服务器,导致数据从硬盘上由文件转化为流的IO压力较大。

    但是滥用缓存也会导致很多问题。缓存适用与不太经常变化的数据,如果数据变化太快,而导致缓存数据没即时跟新,将会导致一些数据不一致性的问题。缓存和索引一样,如果程序或者服务器本身获取数据就很快,缓存或者索引就失去了存在的必要性,反而会浪费空间和资源。

    文笔有限,仅做读后感而写。

       

    更多内容详见微信公众号:Python测试和开发

    Python测试和开发

  • 相关阅读:
    Java 9.10习题
    Java同步synchronized与死锁
    Java线程操作方法
    Java多线程
    Java——private default protected public访问控制权限
    Java——jar命令
    Java导包——import语句
    ubuntu删除输入法后,循环登陆
    ubuntu下Eclipse安装
    Java——包的概念及使用
  • 原文地址:https://www.cnblogs.com/phyger/p/14340315.html
Copyright © 2011-2022 走看看