java 面试知识点笔记(二)底层知识 jvm 内存模型 上篇

问:你了解java的内存模型嘛?

内存简介:

地址空间划分

  • 内核空间(主要是操作系统程序和C运行时的空间,包含链接硬件、调度程序、提供联网、虚拟内存等逻辑和基于C的进程)
  • 用户空间(java实际运行时使用的空间,32位系统最多访问3G,内核代码可以访问所有物理内存。64位系统可以访问超过512G,内核代码同样可以访问所有物理内存)

jvm内存模型--jdk8及以后

  • 线程私有:程序计数器、虚拟机栈、本地方法栈
  • 线程共享:MetaSpace(元空间)、java堆

程序计数器(是一块较小的内存空间,线程私有)

  • 当前线程所执行的字节码行号指示器(逻辑)
  • 改变计数器的值来选取下一条需要执行的字节码指令(分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器)
  • 和线程是一对一的关系即“线程私有内存”(jvm是多线程运行的,为了确保切换线程后能恢复到每个线程原来运行的位置就需要私有程序计数器)
  • 对java方法技术,如果是Native方法则计数器位Undefined
  • 不会发生内存泄漏(因为只是记录了行号)

java虚拟机栈(stack,线程私有)

  • java方法执行的内存模型
  • 包含多个栈帧(方法运行的基础数据结构,包含局部变量表、操作栈、动态链接、返回地址等入栈到出栈的过程。栈帧持有局部变量、部分结果、参与方法的调用与返回,方法调用结束时帧才会被销毁。)

局部变量表和操作数栈

  • 局部变量表:包含方法执行过程中的所有变量(包括this引用、所有方法参数、其他局部变量)
  • 操作数栈:入栈、出栈、复制、交换、产生消费变量(在执行字节码指令过程中被用到,这种方式类似于原生cpu寄存器,大部分jvm字节码把时间花费在操作数栈的操作上,因此局部变量的数组和操作数栈的操作指令通过字节码频繁执行)

实例:

编译二进制,再反编译字节码 (这里javac的时候遇到了个小问题,因为中文注释的原因,GBK不可映射字符 所以加上 -endcoding UTF-8 解决问题)

descript:(II)I 表示描述方法:有2个int参数 返回int, flags 标记public的 static的

stack=2 操作数栈 深度2 ,locals 本地变量是3 ,args_size参数大小是2个

然后就是一堆进栈出栈的指令

LineNumberTable是代码的行号对应字节码行号

执行add(1,2)过程:

问:递归为什么会引发java.lang.StackOverflowError异常?

递归过深,栈帧数超出虚拟栈深度  解决方法就是减少递归次数或者循环替换递归

虚拟机栈过多会引发java.lang.OutOfMemoryError异常

虚拟机栈不需要GC回收,用完就会释放掉

本地方法栈:

  • 与虚拟机栈相似,主要作用于标注了native的方法
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid