Java每日面试题(JVM)(day15)
目录
- Java对象内存布局
- markWord 数据结构
- JDK1.8 JVM 内存结构
- JDK1.8堆内存结构
- GC垃圾回收
- 如何发现垃圾
- 如何回收垃圾
- JVM调优参数
Java对象内存布局

markWord 数据结构

JDK1.8 JVM 内存结构


-
程序计数器:
线程私有,记录代码执行的位置. -
Java虚拟机栈:
线程私有,每个线程都有一个自己的Java虚拟机栈 ,默认大小是1M -
本地方法栈:
线程私有,每个线程都有一个自己的本地方法栈,Java虚拟机栈加载的是普通方法,本地方法加载的是native修饰的方法.native:表示这个方法不是java原生的,是由C或C++实现的 -
堆:
线程共享,用于存放对象,new的对象都存储在这个区域 -
元空间:
线程共享,存储class信息,类的信息,方法的定义,静态变量,常量池 等
- 堆和元空间是线程共享的,在Java虚拟机中只有一个堆、一个元空间,并在JVM启动的时候就创建,JVM停止才销毁。
- 栈、本地方法栈、程序计数器是每个线程私有的,随着线程的创建而创建,随着线程的结束而死亡。
每个存储位置会产生的异常:

JDK1.8堆内存结构

- 年轻代:Eden+S0+S1, S0和S1大小相等, 新创建的对象都在年轻代
- 老年代:经过年轻代 多次垃圾回收存活下来的对象存在年老代中.
GC垃圾回收
JVM的垃圾回收动作可以大致分为两大步:
- 如何发现垃圾
- 如何回收垃圾
线程私有的不存在垃圾回收,只有线程共享的才会存在垃圾回收,所以堆中存在垃圾回收.
如何发现垃圾
常见的用于「发现垃圾」的算法有两种,引用计数算法 和 根搜索算法。
-
引用计数算法
堆中的对象每被引用一次,则计数器加1,每减少一个引用就减1,当对象的引用计数器为0时可以被当作垃圾收集。- 优点:快。
- 缺点:无法检测出循环引用。如两个对象互相引用时,他们的引用计数永远不可能为0。
-
根搜索算法(也叫根可达性分析)
根搜索算法是把所有的引用关系 看作一张图,从根节点(GCRoot)开始遍历,找出被根节点引用的节点,对于没有被根节点指向的节点,即可以当作垃圾。- Java中可作为GCRoot的对象有:
- java虚拟机栈中引用的对象
- 本地方法栈引用的对象
- 元空间中静态属性引用的对象
- 元空间中常量引用的对象
- Java中可作为GCRoot的对象有:
如何回收垃圾
Java中用于「回收垃圾」的常见算法有4种:
-
标记-清除算法(markandsweep)
首先标记出所有需要回收的对象,在标记完成之后统一回收掉所有被标记的对象。缺点: 标记清除之后会产生大量的不连续的内存碎片
-
标记-整理算法
首先标记出所有需要回收的对象,让所有存活的对象移动到另一个位置,在移动过程中清理掉可回收的对象,这个过程叫做整理。优点:内存被整理后不会产生大量不连续内存碎片
缺点:耗时耗力 -
复制算法(copying)
将空间分成大小相等的两块,每次只使用其中一块,当这块内存使用完了,就将存活的对象复制到另一块内存上去,然后把使用过的内存空间一次清理掉。缺点:可使用的内存只有原来一半。在某一个时刻点,总有一个 S 是空的,可能是S0 也可能是S1.。
-
分代收集算法(generation)
当前主流JVM都采用分代收集(GenerationalCollection)算法,这种算法会根据对象存活周期的不同将内存划分为年轻代、年老代,不同生命周期的对象可以采取不同 的回收算法,以便提高回收效率。-
年轻代(YoungGeneration)
- 所有新生成的对象首先都是放在年轻代的。
- 新生代内存按照
8:1:1的比例分为一个eden区和两个Survivor(s0,s1)区。大部分对象在Eden区中生成。
回收流程:
回收时先将eden区存活的对象复制到一个s0区,然后清空eden区,当这个s区,也存放满了时,则将eden区和s0区存活对象复制到另一个s1区,然后清空eden和这个s0区,此时s0区是空的,然后将s0区和s1区交换,即保持s1区为空,如此往复.-
特殊情况:当一个大对象不足于存放到eden区时,就将存活对象直接存放到老年代。若是老年代也满了就会触发一次
FullGC,也就是新生代、老年代都进行回收。 -
新生代发生的GC也叫做MinorGC,MinorGC发生频率比较高
-
年老代(OldGeneration)
-
在年轻代中经历了 N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。默认是15次,且最大15次。
-
内存比新生代也大很多(大概是2倍),当老年代内存满时触发FullGC,
FullGC发生频率比较低,老年代对象存活时间比较长,存活率比较高。
-
-
元空间-持久代(PermanentGeneration)
用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响。
-
JVM调优参数
这里只给出一些常见的性能调优的参数及其代表的含义。
-Xms8g: 设置JVM中堆初始堆大小为8g。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmx8g: 设置JVM中堆最大可用内存为8g。
-Xmn4g: 设置年轻代大小为4G。
-XX:NewRatio=2 设置年轻代(包括Eden和两个Survivor区)与年老代的比值。设置为2,则年轻 代与年老代所占比值为1:2,年轻代占整个堆栈的1/3。
-XX:SurvivorRatio=8 ,所以默认值 Eden:S0:S1=8:1:1。
-Xss1m:设置每个线程的栈大小
-XX:MaxMetaspaceSize=128m: 设置元空间最大为为128m ,
-XX:MetaspaceSize=128m 用于设置元空间的初始大小, 默认值约21M
-XX:MaxTenuringThreshold=15:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。 对于年老代比较多的应用,可以提高效率。最大不超过15。
相关文章:
Java每日面试题(JVM)(day15)
目录 Java对象内存布局markWord 数据结构JDK1.8 JVM 内存结构JDK1.8堆内存结构GC垃圾回收如何发现垃圾如何回收垃圾 JVM调优参数 Java对象内存布局 markWord 数据结构 JDK1.8 JVM 内存结构 程序计数器: 线程私有,记录代码执行的位置. Java虚拟机栈: 线程私有&#…...
在 CentOS 8 上安装和部署 OpenSearch 2.17 的实战指南20240924
在 CentOS 8 上安装和部署 OpenSearch 2.17 的实战指南 引言 随着数据的快速增长,企业对高效搜索和分析工具的需求也在不断增加。OpenSearch 是由社区主导的搜索和分析引擎,它为大规模数据索引、日志分析、全文检索等场景提供了强大的支持。在这篇博客…...
青动CRM-E售后V2.0.4
CRM售后管理系统,旨在助力企业销售售后全流程精细化、数字化管理,主要功能:客户、合同、工单、任务、报价、产品、库存、出纳、收费,适用于:服装鞋帽、化妆品、机械机电、家具装潢、建材行业、快销品、母婴用品、办公用…...
免杀对抗—C++混淆算法shellcode上线回调编译执行
前言 上次讲了python混淆免杀,今天讲一下C混淆免杀。其实都大差不差的,也都是通过各种算法对shellcod进行混淆免杀,只不过是语言从python换成c了而已。 实验环境 测试环境依旧是360、火绒、WD还有VT。 shellcode上线 下面是最基本几个sh…...
考研数据结构——C语言实现插入排序
插入排序是一种简单直观的比较排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place(原地排序)&#…...
苍穹外卖学习笔记(十三)
三. 导入商品浏览功能代码 由于user的Controller与admin的相同,记得修改RestController注释 1. 查询分类 CategoryController package com.sky.controller.user;import com.sky.entity.Category; import com.sky.result.Result; import com.sky.service.Categor…...
如果没有pos信息,只有一些近景的照片,可以用编辑重建大师进行建模吗?
可以。软件在新建工程时,提供有无人机和近景的选择,选择为近景即可。 重建大师,这是一款专为超大规模实景三维数据生产设计的集群并行处理软件,支持卫星影像、航空影像、倾斜影像和激光点云多源数据输入建模,可完成超…...
智能感知,主动防御:移动云态势感知为政企安全护航
数字化时代,网络安全已成为企业持续运营和发展的重要基石。随着业务扩展,企业资产的数量急剧增加,且分布日益分散,如何全面、准确地掌握和管理资产成为众多政企单位的难题。同时,传统安全手段又难以有效应对新型、隐蔽…...
论文笔记(四十六)RobotGPT: Robot Manipulation Learning From ChatGPT
xx RobotGPT: Robot Manipulation Learning From ChatGPT 文章概括摘要I. 介绍II. 相关工作III. 方法论A. ChatGPT 提示机器人操作B. 机器人学习 IV. 实验A. 衡量标准B. 实验设置C. 模拟实验D. 真实机器人实验E. AB测试 V. 结论 文章概括 引用: article{jin2024r…...
docker - 镜像操作(拉取、查看、删除)
文章目录 1、docker search --help(用于显示 Docker 搜索命令的帮助信息)2、docker pull(拉取镜像)3、docker images (查看镜像)3.1、docker images --help(用于显示 Docker 镜像管理相关命令的帮助信息)3.…...
如何选择数据库架构
选择合适的数据库架构是一个复杂的过程,它取决于多种因素,包括应用程序的需求、数据量的大小、并发访问量、数据一致性要求、预算以及技术团队的熟悉程度等。以下是一些关键的步骤和考虑因素,帮助你选择合适的数据库架构: 1. 分析…...
Mysql高级篇(中)——锁机制
锁机制 一、概述二、分类1、读锁2、写锁⭐、FOR SHARE / FOR UPDATE(1)NOWAIT(2)SKIP LOCKED(3)NOWAIT 和 SKIP LOCKED 的比较 ⭐、 脏写3、表级锁之 S锁 / X锁(1)总结(2…...
JavaWeb图书借阅系统
目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 login.jsp 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优…...
文档矫正算法:DocTr++
文档弯曲矫正(Document Image Rectification)的主要作用是在图像处理领域中,对由于拍摄、扫描或打印过程中产生的弯曲、扭曲文档进行校正,使其恢复为平整、易读的形态。 一. 论文和代码 论文地址:https://arxiv.org/…...
Vxe UI vue vxe-table vxe-grid 单元格与表尾单元格如何格式化数据
Vxe UI vue vxe-table vxe-grid 单元格与表尾单元格如何格式化数据 查看 github vxe-table 官网 单元格内容格式化 通过 formatter 属性自定义格式化方法 <template><div><vxe-grid v-bind"gridOptions"></vxe-grid></div> </t…...
【百日算法计划】:每日一题,见证成长(021)
题目 栈排序 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,p…...
数据恢复篇:如何恢复几年前删除的照片
您是否曾经遇到过几年前删除了一张图片并觉得需要恢复旧照片的情况?虽然,没有确定的方法可以丢失或删除的照片。但是,借助奇客数据恢复等恢复工具,可以恢复多年前永久删除的照片、视频和音频文件。 注意 – 如果旧数据被覆盖&…...
前端注释规范
1、目的和原则 提高可读性和可维护性 如无必要,无增注释;如有必要,尽量详尽 2、语法 单行注释: // 多行注释: /**/ 3、规范 1、注释符与注释内容之间加一个空格 2、注释行与上方代码间加一个空行 4、Javascript …...
uniapp踩坑 tabbar页面数据刷新了但视图没有更新
问题描述: 有个uni-data-checkbox组件,两个选项:选项1和选项2(对应的value值分别为1和2),v-model绑定属性名为value 两个tabbar页面:tab1,tab2。 tab1页面有个逻辑是在onShow中刷新v…...
WebAssembly与WebGPU:游戏开发的新时代
文章目录 WebAssembly简介WebGPU简介Wasm WebGPU 在游戏开发中的优势创建一个简单的WebAssembly模块使用WebGPU绘制一个三角形WebAssembly 的高级特性内存管理异步加载与多线程 WebGPU 的高级特性着色器编程计算着色器 实战案例:创建一个简单的 2D 游戏游戏逻辑设计…...
保姆级教程:在i.MX6ULL开发板上用LVGL v8.3.11跑个炫酷UI(附触屏配置)
嵌入式Linux系统LVGL图形库移植实战指南:从零构建炫酷UI界面 在嵌入式系统开发中,图形用户界面(GUI)的实现一直是开发者面临的挑战之一。传统解决方案要么过于笨重,要么功能简陋,直到LVGL的出现改变了这一局面。这款轻量级开源图形…...
阿里云百炼 + OpenClaw 打造超强自动化 AI
前置准备 已安装并可正常打开 OpenClaw Windows 版本 OpenClaw 部署包获取:https://xiake.yun/api/download/package/14?promoCodeIVD643FDE29AOpenClaw 顶部 Gateway 状态显示为在线准备好可正常登录的阿里云账号可正常访问阿里云百炼控制台地址确认账号已开通百…...
tchMaterial-parser:5分钟快速上手,轻松获取国家中小学智慧教育平台电子课本的完整指南
tchMaterial-parser:5分钟快速上手,轻松获取国家中小学智慧教育平台电子课本的完整指南 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载&#x…...
别再拿冰河木马当玩具了!从一次真实的渗透测试复盘,聊聊Windows XP时代的安全漏洞与防御思路
从冰河木马看Windows XP时代的安全漏洞与现代防御启示 2000年代初的互联网环境与今天截然不同。那时,Windows XP系统占据着绝对市场份额,而安全意识对大多数用户来说还是个陌生概念。正是在这样的背景下,"冰河"这类远程控制工具得以…...
Midjourney v7艺术风格跃迁路径:从基础写实到超现实叙事的5阶能力模型,含GPT-4o协同提示链模板
更多请点击: https://intelliparadigm.com 第一章:Midjourney v7艺术风格跃迁路径总览 Midjourney v7 并非简单迭代,而是以扩散模型架构重构与多模态风格理解为内核的范式跃迁。其核心突破在于引入「语义风格锚点(Semantic Style…...
基于RAG的个人知识库AI助手:从原理到部署实战
1. 项目概述:当RAG遇上个人知识库最近几年,大语言模型(LLM)的能力边界不断被拓展,但一个核心痛点始终存在:它无法记住你私有的、非公开的、不断更新的知识。比如,你想让AI助手帮你分析上周的团队…...
基于MCP协议与RAG技术构建智能聊天应用:架构解析与实战指南
1. 项目概述:一个基于MCP协议的RAG聊天应用最近在开源社区里,一个名为gogabrielordonez/mcp-ragchat的项目引起了我的注意。乍一看标题,它融合了当下两个非常热门的技术概念:MCP和RAG。对于从事AI应用开发,特别是希望构…...
CircuitPython displayio与触摸交互实战:复刻经典Neko猫咪动画
1. 项目概述与核心价值如果你玩过一些复古的掌机或者小型的嵌入式设备,可能会对屏幕上那只跟着你手指或光标跑的“Neko猫咪”有印象。这个源自上世纪经典屏保的小动画,在今天看来,依然是学习嵌入式图形和交互编程的绝佳入门项目。它麻雀虽小&…...
NewLife.Core配置系统深度解析:XML/JSON/HTTP多源配置实战
NewLife.Core配置系统深度解析:XML/JSON/HTTP多源配置实战 【免费下载链接】X Core basic components: log (file / network), configuration (XML / JSON / HTTP), cache (memory / redis), network (TCP / UDP / HTTP), RPC framework, serialization (binary / X…...
危化园区 ReID 跨镜管控难,镜像视界无感定位筑牢安全防线
危化园区 ReID 跨镜管控难,镜像视界无感定位筑牢安全防线危化工业园区作为化工生产、仓储、运输的核心载体,承载着易燃易爆、有毒有害等高危物料的全流程作业,其安全管控水平直接关系到人员生命安全、财产安全与生态环境安全。不同于普通工业…...
