zoukankan      html  css  js  c++  java
  • 初识JVM--java虚拟机的基本知识

    JVM运行时的内存块

    1. pc寄存器:(线程独有)保存线程运行的java方法地址
    2. Java 虚拟接栈(线程独有):用于存储线程的栈帧
    3. Java堆(全局共享):随着Java虚拟机的启动 创建 存储着所有对象的实例以及数组对象,而且内置gc(垃圾回收机制)
    4. 方法区:运行常量池
    5. 本地方法栈:线程独有。

     

    在jvm中gc(垃圾回收机制)是Java立足点之一。垃圾自动回收可以让Java程序员减少与内存打交道,更专注于业务的开发与实现。

    垃圾回收需要实现如下几点

    1. 什么对象可以回收‘
    2. 何时回收
    3. 怎么回收

     

    关于垃圾回收的对象定义,主要有两种:

    • 检查这个对象是否有引用

      比如:a =new A(); 那么对象A是有引用的。但这种方式会出现死锁,就是有两个或者多个对象之间相互引用,但这些对象都是没用的。怎么办?

    • 检查这个对象是否根部对象可达。

    只有一个root,root与其他对象直接或间接关联,如果这个对象根部不可达,那么这个对象就“垃圾”

    利用根部是否可达的方式没有死锁,是目前jvm gc的主流实现方式。当然未来的路还很长,说不定还有更好的算法实现呢?

     

    何时回收?

      垃圾对象的产生,一般都是周期回收。在回收垃圾的时候,停止运行的java程序

    怎么回收?

    1. 标记-清理:先将视为垃圾的对象标记,然后进行清理,这样清理出来的空间是不连续的
    2. 复制:将内存分成两半,然后将有效的复制到另一半。这样整理出来的内存空间是连续的
    3. 标记-清理-整理:针对标记-清理加了优化,整理出连续的内存空间。

     

    进一步优化:

      总会有一些对象会一直存在如静态变量,线程池。。。这些“老不死”就没必要老是检查它们了,可以减少检查和清理的周期。于是就有了,新生代,老生代,永久代

    • 新生代:新建的对象,这里一般是局部对象,使用过后很快消亡。经过几个周期之后,将升级为老生代,新生代的存活率10%左右
    • 老生代:从新生代升级为的老生代,拥有更顽强的生命,所以垃圾清理的算法和周期都与新生代不同
    • 永久代:永久代并不是不可能死亡,清理还是要的只不过周期很长而已。

     

    学习的时间不一定要特定安排
  • 相关阅读:
    [转载] VsCode中使用Emmet神器快速编写HTML代码
    Hexo 博客部署到私有云服务器
    钉钉小程序通过 Canvas 将页面生成图片并保存到本地相册
    2021你应该了解的前端知识体系
    JavaScript 中的模块化
    vue中click事件方法不加括号则会将事件作为入参
    css:左右元素没对齐,调整子元素的vertical-align属性
    js通过宽高特征对图片进行分类
    配置服务器上的git仓库
    js获取当前设备信息
  • 原文地址:https://www.cnblogs.com/zhongzheng123/p/5853054.html
Copyright © 2011-2022 走看看