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

Wesley13
• 阅读 476

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

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

地址空间划分

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

jvm内存模型--jdk8及以后

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

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

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

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

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

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

局部变量表和操作数栈

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

实例:

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

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

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

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

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

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

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

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

执行add(1,2)过程:

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

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

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

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

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

本地方法栈:

  • 与虚拟机栈相似,主要作用于标注了native的方法
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这