首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
triggers
perl
usb
dll
loops
netty
actionscrip
export
require
lua
window
frameworks
substring
version
request
expression
tags
select
include
数组
foreach
flutter
cmd
install
express
python
php5
python2
js
go
rsa
nodejs
process
filter
config
io
email
match
input
string
bytecode
runtime
heatmap
c语言
metadata
subset
instance
format
php8
ip
yaml
hashtable
random
cpython
join
keyword
timestamp
httpclient
byte
erlang
merge
char
less
object
python3
search
emoji
grid
java
solr
vba
scala
uri
datetime
client
default
stream
php7
bit
当前位置:
开发笔记
>
编程语言
> 正文
巩固java(二)----JVM堆内存结构及垃圾回收机制
作者:鎏源大哥 | 来源:互联网 | 2023-09-23 17:59
前言:我们在运行程序时,有时会碰到内存溢出(OutOfMemoryError)的问题,为了解决这种问题,我们有必要了解JVM的内存结构和垃圾回收机制。正文:1.JVM堆内存
前言:
我们在运行程序时,有时会碰到内存溢出(OutOfMemoryError)的问题,为了解决这种问题,我们有必要了解JVM的内存结构和垃圾回收机制。
正文:
1.JVM堆内存结构
JVM主要管理两种类型的内存,堆内存和非堆内存。
“java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此分配,堆是java虚拟机启动时创建的”,对内存就是代码可及的地方。
“java虚拟机除堆外的内存称为非堆内存”,是java虚拟机自己内部所需的内存。
JVM堆内存的结构如下图所示:
JVM堆内存分为新域,旧域,永久域三个部分。
我们下面通过程序申请内存的过程了解各个区域的作用:
1.当我们在程序中通过new创建一个对象时,会为该对象在堆的新域的eden中分配一块内存(eden用来存放新生对象);
2.执行1时,如果eden中的内存不够,JVM将试图释放eden中的不活跃对象(此时叫:minor collection),如果eden的内存仍不足以存放新创建的对象,则将eden中剩余的活跃对象转移到救助空间中;
3.当旧域的空间足够时,救助空间的对象会被转移到旧域(所以survivor相当于eden与旧域的中间交换区);
4.当旧域空间不够时会释放空间(此时叫:major collection)
5.如果survivor和旧域无法存放eden复制过来的对象,导致eden无法为新对象分配内存,会报:OutOfMemoryError
2.JVM垃圾回收
在上面的申请内存过程中已经涉及到了垃圾回收,下面在详细说一下。
先说一下新域的垃圾回收过程:
在新域中有两个survivor作为中转,两个survivor相对的作为from和to逻辑区域,其中from区域用来保存对象,to区域保持为空。
当eden区域不足以支持新增对象时,会执行垃圾回收(GC),eden中的对象和from区域的对象转移到to区域,当to区域满时,一部分对象转移到old区域,即旧域。
GC执行结束后eden和from区域被清空,这是from区域和to区域进行交换。
关于这里为什么JVM要用两个survivor来做中转,一说是:“对象在两个survivor之间来回移动,知道他们足够老,能够放入保存期较长的old即旧域”。
3.解决堆溢出问题
上面我们了解了JVM堆内存的结构和GC,当我们遇到java.lang.OutOfMemoryError: Java heap space这个异常时,可以通过重新设定参数来解决。
JVM在启动时会自动自动设置Heap Size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可 进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。 提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。 提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
java
jvm
数组
io
heap
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
数组
深入解析 Synchronized 锁的升级机制及其在并发编程中的应用
深入解析 Synchronized 锁的升级机制及其在并发编程中的应用 ...
[详细]
蜡笔小新 2024-11-11 13:09:38
include
Presto:高效即席查询引擎的深度解析与应用
本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ...
[详细]
蜡笔小新 2024-11-07 19:17:47
go
深入浅析JVM垃圾回收机制与收集器概述
本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》的阅读心得进行整理,详细探讨了JVM的垃圾回收机制及其各类收集器的特点与应用场景。通过分析不同垃圾收集器的工作原理和性能表现,帮助读者深入了解JVM内存管理的核心技术,为优化Java应用程序提供实用指导。 ...
[详细]
蜡笔小新 2024-11-07 18:39:45
数组
Scala学习指南:从零开始掌握基础
本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ...
[详细]
蜡笔小新 2024-11-07 18:07:59
数组
Java面向对象编程中的内存管理与分析
在Java面向对象编程中,内存管理是关键环节之一。Java虚拟机(JVM)的内存结构主要由栈(Stack)、堆(Heap)和方法区(Method Area)组成。其中,栈用于存储方法的执行上下文,每个方法调用时都会创建一个栈帧,用于保存局部变量表、操作数栈等信息。堆则是用于存储对象实例和数组,是垃圾回收的主要区域。方法区则用于存储类的元数据、常量池、静态变量等信息。通过合理管理和优化这些内存区域,可以显著提升程序的性能和稳定性。 ...
[详细]
蜡笔小新 2024-11-06 15:34:55
数组
2021年7月22日学习成果回顾与分析
2021年7月22日上午9点至中午12点,我专注于Java的学习,重点补充了之前在视频中遗漏的多线程知识。首先,我了解了进程的概念,即程序在内存中运行时形成的一个独立执行单元。其次,学习了线程作为进程的组成部分,是进程中可并发执行的最小单位,负责处理具体的任务。此外,我还深入研究了Runnable接口的使用方法及其在多线程编程中的重要作用。 ...
[详细]
蜡笔小新 2024-11-02 14:38:06
js
Java中高级工程师面试必备:JVM核心知识点全面解析
对于软件开发人员而言,随着技术框架的不断演进和成熟,许多高级功能已经被高度封装,使得初级开发者只需掌握基本用法即可迅速完成项目。然而,对于中高级工程师而言,深入了解Java虚拟机(JVM)的核心知识点是必不可少的。这不仅有助于优化性能和解决复杂问题,还能在面试中脱颖而出。本文将全面解析JVM的关键概念和技术细节,帮助读者全面提升技术水平。 ...
[详细]
蜡笔小新 2024-10-31 10:20:42
go
Spring – Bean Life Cycle
Spring – Bean Life Cycle ...
[详细]
蜡笔小新 2024-11-13 13:24:40
netty
面试中如何回答“零拷贝”技术问题?
零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ...
[详细]
蜡笔小新 2024-11-13 02:03:52
js
深入解析JDK 8 HashMap源代码:put方法详解及capacity、size、loadFactor和红黑树转换阈值的设定原理
本文深入解析了JDK 8中HashMap的源代码,重点探讨了put方法的工作机制及其内部参数的设定原理。HashMap允许键和值为null,但键为null的情况只能出现一次,因为null键在内部通过索引0进行存储。文章详细分析了capacity(容量)、size(大小)、loadFactor(加载因子)以及红黑树转换阈值的设定原则,帮助读者更好地理解HashMap的高效实现和性能优化策略。 ...
[详细]
蜡笔小新 2024-11-10 14:10:53
js
深入解析CAS机制:全面替代传统锁的底层原理与应用
本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ...
[详细]
蜡笔小新 2024-11-09 15:45:07
js
线程能否先以安全方式获取对象,再进行非安全发布?
线程能否先以安全方式获取对象,再进行非安全发布? ...
[详细]
蜡笔小新 2024-11-09 09:21:53
version
Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ...
[详细]
蜡笔小新 2024-11-08 10:38:37
go
如何利用Java 5 Executor框架高效构建和管理线程池
Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ...
[详细]
蜡笔小新 2024-11-07 17:05:32
js
Java测试服务器调试指南:远程调试与Java Xdebug参数详解
Java测试服务器调试指南详细介绍了如何进行远程调试,并深入解析了Java Xdebug参数的使用方法。本文首先概述了Java内置的调试功能,重点介绍了JDB这一类似于GDB的强大调试工具。通过实例演示,读者可以掌握在测试环境中高效调试Java应用程序的技巧,包括配置远程调试环境和优化调试参数,以提高开发效率和代码质量。 ...
[详细]
蜡笔小新 2024-11-06 17:15:54
鎏源大哥
这个家伙很懒,什么也没留下!
Tags | 热门标签
triggers
perl
usb
dll
loops
netty
actionscrip
export
require
lua
window
frameworks
substring
version
request
expression
tags
select
include
数组
foreach
flutter
cmd
install
express
python
php5
python2
js
go
RankList | 热门文章
1
PHP 代码规范,php代码规范
2
四十四、【CardView】
3
html和htm的区别_html/css_WEBITnose
4
转载,必看:Cocosx 3.2:从C++过渡到Lua
5
检查数组中的最小元素是否小于或等于每隔一个元素的一半
6
0x0000008e蓝屏,怎么回事?0x0000008e蓝屏修复
7
M2 Boot Camp解决苹果电脑安装Windows硬件不兼容问题
8
模仿ArcGIS用Graphics重绘的直方图分级调节器
9
org.apache.catalina.core.StandardContext.setResponseCharacterEncoding()方法的使用及代码示例
10
gradle学习
11
IP问题阿里云的服务器IP怎么是辽宁省丹东市铁通
12
25、商品服务–三级分类–树形三级分类添加append和delete按钮
13
NYOJ_37_回文字符串
14
TensorFlow安装 通过Anaconda Win10 64位 cpu and gpu
15
计算属性如何生成编辑功能需要的临时变量
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有