zoukankan      html  css  js  c++  java
  • JVM基础

    概述

    java虚拟机是一台虚拟的机器,在这台机器上可以运行java源代码编译后的class文件,运行的入口是main方法,第一步是找到main方法,然后开始执行main方法,java类中的方法都会被编译器编译为字节码,字节码也就是指一个字节一个字节的二进制代码,字节码和所有的汇编语言一样是有很多指令组成的,每条指令有分为操作码和操作数部分,操作数并不是必须的,简单的指令如iadd会将操作数栈中的两个整型数字相加,然后把结果再放入操作数栈中。

    数据结构

    每个方法被编译器编译为字节码,运行时的数据结构是所有的方法都会被包装成一个栈帧(stack frame),栈帧被放入虚拟机栈中(jvm stack),栈帧中又包括了局部变量表和操作数栈,这两个结构的大小会在编译时计算好。

    虚拟机指令

    虚拟机指令的操作码有一个字节表示,所以最多可以有256条指令,当前虚拟机标准定义的指令数已经有200多条了

    垃圾回收

    垃圾回收算法

    • 复制算法
    • 标记清除算法
    • 标记整理算法
    • 分代收集算法

    大专栏  JVM基础垃圾回收器

    当前有7款垃圾收集器

    • 串行收集器有两款
      Serial和Serial Old分别用于收集新生代和老年代,特点是单线程

    • 并行收集器2款 Parallel Scavenge和Parallel Old分别用于收集新生代和老年代,特点是吞吐量优先,适用于不需要进行交互的任务,如只在后台运行的批处理任务

    • 剩下两款当前最常用的收集器ParNew和CMS,一般默认的这两款收集器 -XX:+UseConcMarkSweepGC参数开启CMS收集器,默认的新生代配合即是ParNew

    类加载过程

    加载->验证->准备->解析->初始化
    verify->preapre->resolve这三个阶段称为链接阶段(link)

    • 类加载阶段classloader根据类的完全限定名读取class文件中的二进制数据
    • verify阶段对二进制数据进行验证
    • prepare阶段对静态变量赋零值,常量赋值
    • resolve阶段将常量池中的符号引用替换为直接引用
    • init阶段对静态变量赋值,执行static代码块,执行构造函数
  • 相关阅读:
    写个perl程序自动下载《南方周末》(2005年12月最后一期,38版,值得一看)
    Android 关于inflate
    Android读取系统相册图片并获得绝对地址
    Android设置一个SubMenu来更改背景颜色
    ExpandableListView(可展开的列表组件)使用方法
    Android自定义Tabs文字,背景
    Android上开发新浪微博OAuth2.0认证
    Android线程显示进度框
    Android http get/post传递参数
    总结:Upate field which lookups from Content Types
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12026846.html
Copyright © 2011-2022 走看看