JVMMemory

全网最硬核 JVM 内存解析 - 1.从 Native Memory Tracking 说起 本篇是关于 JVM 内存的详细分析。网上有很多关于 JVM 内存结构的分析以及图片,但是由于不是一手的资料亦或是人云亦云导致有很错误,造成了很多误解;并且,这里可能最容易混淆的是一边是 JVM Specification 的定义,一边是 Hotspot JVM 的实际实现,有时候人们一些部分说的是 JVM Specification,一部分说的是 Hotspot 实现,给人一种割裂感与误解。 阅读详情


/**
 * java体系
 * -----Java程序设计语言
 * -----各种硬件平台上的Java虚拟机
 * -----class文件格式
 * -----JavaAPI类库
 * -----第三方Java类库
 * 
 * JDK	java development kit
 * 	---Java程序设计语言
 * 	---Java虚拟机
 *  ---JavaAPI类库
 * JRE  java runtime environment 
 * --java api类库中的java se api子集
 * --java虚拟机
 * 
 * java技术体系四个平台
 * ----java card 支持java小程序Applets 运行在小内存设备上的平台
 * ----java me 支持程序运行在移动终端上的平台,对javaapi精简
 * ----Java	se支持面向桌面级应用的java
 * ----java	ee支持使用多层架构的企业应用(erp)的java平台
 * 
 * 
 * java1.6	Mustang		野马
 * 2006年11月13日 javaOne大会 ,宣布java开源
 * java1.7	Dolophin	海豚
 * 
 * 发展未来
 * -----模块化
 * -----混合语言
 * -----混合语言    表示层用其他语言,中间层使用java     python  
 * -----多核并行
 *
 */
	
	/**
	 * Java虚拟机在执行java程序的过程中会把所管理的内存分为若干不同的数据区域
	 * 运行时数据区
	 * -----方法区		Method Area
	 * -----虚拟机栈		VM Stack
	 * -----本地方法栈		Native Method Stack
	 * -----堆			Heap
	 * -----程序计数器		Program Couter Register
	 * 
	 * 程序技术器
	 * 是当前线程所执行的字节码的行号指示器
	 * 字节码解释器工作时是通过改变这个计数器的值来选取下一条需要执行的字节码指令
	 * 
	 * 多线程是通过线程轮流切换并分配处理器执行时间的方式来实现
	 * 为了线程切换后能恢复到正确的执行位置
	 * 每条线程都需要有一个独立的程序计数器
	 * 各条线程之间的计数器互不影响,独立存储,称为这类内存区域为   线程私有   的内存
	 * 
	 * 执行java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址
	 * 执行Natvie方法,这个计数器值则为空Undefined 
	 * 此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域
	 * 
	 * 
	 * java虚拟机栈
	 * 是线程私有的,它的生命周期与线程相同
	 * 虚拟机栈描述的是java方法执行的内存模型
	 * 每个方法被执行的时候都会创建一个栈帧  Stack Frame 用于存储局部变量表、操作栈、动态、链接、方法出口等
	 * 每个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程
	 * 
	 * java栈指的就是虚拟机栈,也就是说虚拟机栈中的局部变量表部分
	 * 局部变量存放了编译期可知的各种基本类型的数据、
	 * 对象引用(reference类型,它不等同于对象本身,根据不同的虚拟机实现可能是一个对象起始地址的引用指针,或者句柄
	 * returnAddress类型(指向了一条字节码指令的地址)
	 * 
	 * 64位长度的long和double类型的数据会占用2个局部变量空间(slot),其余的数据类型只占用一个
	 * 局部变量表所需的内存空间在编译期间完成分配
	 * 当进入一个方法时
	 * 这个方法需要在帧中分配多大的局部变量空间是完全确定的
	 * 方法运行期间不会改变局部变量表的大小
	 * 
	 * 虚拟机栈的两种异常
	 * --线程请求的栈深度大于虚拟机所允许的深度,将会抛出StackOverflowError异常
	 * --虚拟机栈可以动态扩展,扩展时无法申请到足够的内存时会抛出OutOfMemoryError异常
	 * 
	 * 
	 * 本地方法栈
	 * 与虚拟机栈所发挥的作用是非常相似的
	 * 虚拟机栈为虚拟机栈执行java方法也就是字节码服务
	 * 本地方法栈则是为虚拟机使用到的Native方法服务
	 * 虚拟机规范没有强制规定
	 * 
	 * 
	 * Java堆
	 * java虚拟机所管理的内存中最大的一块
	 * java堆是被所有线程共享的一块内存区域,在虚拟机启动创建
	 * 唯一的目的就是存放对象实例
	 * 随着jit编译器的发展与逃逸分析技术
	 * 所有对象都分配在堆上不是那么绝对了
	 * 
	 * java堆是垃圾收集器管理的主要区域
	 * 也称为GC堆 Garbage Collected Heap
	 * 内存回收的角度,
	 * 现在收集器基本都是采用的分代收集算法
	 * java堆中还可以细分为新生代和老生代
	 * 
	 * 内存分配的角度
	 * 线程共享的java堆中可能划分出多个线程私有的分配缓冲区Thread Local Allocation Buffer
	 * 
	 * java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续
	 * 
	 * 
	 * 方法区
	 * Method Area 和 heap ,是各个线程共享的内存区域
	 * 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器后的代码等数据
	 * java虚拟机规范把方法区描述为堆得一个部分,别名NonHeap非堆
	 * 垃圾回收收集行为在这个区域是较少的出现
	 * 非数据进入了方法区就永久存在了
	 * 这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载
	 * 
	 * 
	 * 运行时常量池
	 * Runtime Constant Pool 
	 * 是方法区 的一部分
	 * class文件中除了有类的版本、字段、方法、接口等描述信息,
	 * 常量池Constant Pool Table用于存放编译期生成的各种字面量和符号引用
	 * 这部分内容将在类加载后存放到方法区的运行时常量池中
	 * 
	 *  jvm对class文件的每一部分的格式都有严格的规定
	 *  但是对运行时常量池没有做任何细节要求
	 *  
	 *  运行时常量池相对于class文件常量池的另一个重要的特征是具备动态性
	 *  运行期间也可能将新的常量放入池中
	 *  
	 *  
	 *  直接内存
	 *  Direct Memory并不是虚拟机运行时数据区的一部分
	 *  但是使用的频繁
	 *  NIO类,引用了一种基于通道Channel 与缓冲区Buffer的IO方式
	 *  可以使Native函数库直接分配堆外内存
	 *  然后通过一个存储在java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作
	 *  避免在java堆和Native堆中来回复制数据
	 *  
	 *  
	 *  
	 *  对象访问
	 *  程序的行为基本上都会涉及java栈、java堆、方法区
	 * 
	 *  指向对象的引用,对象访问方式有
	 *  --使用句柄
	 *  java堆中将会划分出一块内存作为句柄池,引用中存储的就是对象的句柄地址
	 *  句柄中包含了对象实例数据和类型数据各自的具体地址信息
	 *  --直接指针,不用经过句柄池
	 *  Java堆对象的布局就必须考虑如何放置访问类型数据的相关信息
	 *  reference 中直接存储的就是对象地址
	 * 
	 * 
	 * 句柄访问方式reference中存储的是稳定的句柄地址,对象被移动时,只会改变句柄中的实例数据指针,reference本身不需要改变
	 * 
	 * 直接指针访问方式的最大好处就是速度快,节省了一次指针的时间开销
	 * 
	 */

public class sunjava {

}

 

CiteSpace修改jvm emory大小,提高运行效率方法 CiteSpace处理数据的多少和快慢可以通过对Java虚拟机内存参数的设置来增强。 阅读详情

相关推荐

计算pi小数点后10000位

数据结构课上,老师让我们计算一下pi的10000位,复习一下面向对象。 First Try:定义一个高精度类hp(high precision),实现加减乘除,输入输出,然后随便找一个公式,比如Wallis公式,全都用hp进行计算。 现实是:大数乘大数或者大数除大数,实在是太慢了。而且Wallis公式收敛太慢。 Second Try先找到一个收敛较快的公司:BBP公式,观察公式发现,...

我的技术人生 7394

JVM memory

JVM memory

caicongyang 1529

别再只设接触压力了!用ANSYS Workbench模拟O型圈密封泄漏的完整流程

本文详细介绍了在ANSYS Workbench中模拟O型圈密封泄漏的完整流程,重点解析了流体渗透压力载荷的设置与应用。通过双物理场耦合模型和精确的参数配置,帮助工程师准确评估密封性能,避免传统方法仅考虑接触压力的局限性。文章还提供了常见问题的解决方案和工程实践建议,提升密封设计的可靠性。

weixin_30372371的博客 398

JVM直接内存(Direct Memory)

JVM直接内存(Direct Memory)

cocolin2022的博客 2161

Informer复现 -- 完整模型

有了数据和核心的ProbAttention,接下来就可以复现完整的Informer(图1)了。图1:Informer模型结构[1]如果对图1还不太熟悉的同学,可以参考图2。由图2可知,informer与Transformer之间的差异并不大。主要区别是ProbAttention和可能的encoder最后一层的conv(源代码中用来distil)。图2:参考Transformer画的Informer模型结构。

AI_daily的博客 3491

告别Qweb!用ReportBro在Odoo 13-19版本中5步搞定动态报表

本文介绍了如何在Odoo 13-19版本中使用ReportBro替代Qweb快速实现动态报表设计。通过5步集成指南,包括环境准备、前端集成、后端服务搭建等,展示了ReportBro在可视化设计、即时预览和多格式输出(PDF/XLSX)方面的优势,显著提升开发效率和报表灵活性。

mac99的博客 799

JVM(Memory)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34074740的博客 285

别再只会按按钮了!用NanoStat开源项目学ESP32硬件设计:BOOT与自动下载电路的避坑指南

本文通过NanoStat开源项目深入解析ESP32硬件设计中BOOT与自动下载电路的关键技术。从启动机制、电路设计陷阱到三极管选型,提供了一套完整的避坑指南和优化方案,帮助开发者提升设计可靠性和烧录效率。特别适合中级开发者学习ESP32硬件设计的精髓。

weixin_30296405的博客 439

JVM MEMORY(虚拟机内存模型)+计算对象占用内存程序

函数的基本类型存储 函数的引用类型存储

weixin_44893467的博客 485

六轴机器人正解

采用的是John H.Craig在【机器人学导论】中的改进DH模型 1.六轴坐标系 2.DH参数 i αi−1\alpha_{i-1}αi−1​ ai−1a_{i-1}ai−1​ did_idi​ θi\theta_iθi​初值 1 0 0 0 0 2 -90 a1a_1a1​ 0 -90 3 0 a2a_2a2​ 0 -90 4 -90 a3a_3a3​ d4d...

m0_37581770的博客 2511

SystemC实战:用C++搞芯片建模的5个典型场景(含代码示例)

本文通过五个典型实战场景,详细介绍了如何使用SystemC这一基于C++的硬件建模库进行芯片设计与系统级建模。内容涵盖从基础并发模块构建、事务级总线建模、跨时钟域验证,到与ModelSim协同仿真及多核系统性能探索,并提供了完整的代码示例,帮助软件工程师利用熟悉的C++工具链高效参与硬件架构设计与验证。

weixin_29191761的博客 314

(MaxProcessMemory – JVMMemory – ReservedOsMemory) / (ThreadStackSize) = Number o

(MaxProcessMemory – JVMMemory – ReservedOsMemory) / (ThreadStackSize) = Number of threads    转自:http://www.chinasb.org/archives/2011/12/4138.shtml

fanday的专栏 721

2026年数字IC设计紫光展锐笔试带答案解析

本文是一份数字IC设计工程师/芯片验证工程师的笔试样题,包含单选题和多选题两部分。单选题共20题(每题2分),涵盖数字电路、C++/Verilog编程、芯片设计基础等内容,例如D/A转换计算、面向对象编程特性、三极管工作区域、Verilog仿真时间格式等。多选题15题(每题2分),考察Hold违例修复方法、验证方法学等知识点。试卷总分100分,考试时长90分钟,题型设计兼顾基础理论与工程实践,重点测试应聘者对芯片设计核心概念和工具链的掌握程度。部分题目解析详细说明了计算过程或概念原理,如第1题通过二进制转换

Open 110

java虚拟机运行过程_详细理解Java虚拟机的运行过程

基本概述:Java虚拟机简称JVM,是JRE中的一部分,也是Java程序运行的最关键的部分。完整的Java运行流程大致包括编译.java文件形成.class文件,然后根据.class文件的内容进行一系列的步骤使整个程序运行起来。其中将.java文件编译为.class文件由Java编译器完成,而由.class文件进而完成整个运行过程则主要是由JVM来完成的。由于所有的编译链接过程都由JRE来完成,所...

weixin_27058835的博客 371

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JAVA-JVM-原理优化篇

JVM(Java Virtual Machine java虚拟机) jvm的工作原理: java语言最大的特点是可以跨平台操作,是因为java将写好的目标代码装载在一个叫JAVA虚拟机的平台上,这样恶意保证在不同平台上运行时,不需要再次编译代码。运行的代码其实是在JVM中,即代码不是直接运行在我们操作平台,所以JVM调优核心是如何让JAVA源代码在JVM中运行的效率最高。 影响JVM运行效率的核心指标是内存的使用,所以我们通常说JVM调试都是在谈论内存分配的问题。 Class Loader: 类的加

SmallIPPig的博客 382

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Unhandled event loop exception unable to create new native thread

i = 5602  Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread     at java.lang.Thread.start0(Native Method)     at java.lang.Thread.start(Thread.java:597)    

qq_31328063的博客 2077

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

详细理解Java虚拟机的运行过程

详细理解Java虚拟机的运行过程 基本概述:   Java虚拟机简称JVM,是JRE中的一部分,也是Java程序运行的最关键的部分。完整的Java运行流程大致包括编译.java文件形成.class文件,然后根据.class文件的内容进行一系列的步骤使整个程序运行起来。其中将.java文件编译为.class文件由Java编译器完成,而由.class文件进而...

weixin_34247155的博客 86

解决 - java.lang.OutOfMemoryError: unable to create new native thread

在java语言里, 当你创建一个线程的时候,虚拟机会在JVM内存创建一个Thread对象同时创建一个操作系统线程,而这个系统线程的内存用的不是JVMMemory,而是系统中剩下的内存(MaxProcessMemory - JVMMemory - ReservedOsMemory)。所以如果确实需要更多的线程来支撑业务的运行,得考虑把(MaxProcessMemory - JVMMemory - ReservedOsMemory)调整大,(a), MaxProcessMemory 使用64位操作系统。

wsyyyyy的博客 1221

如何科学的高效率的选择创建线程数

如何科学的高效率的选择创建线程数 因为我电脑的配置有点高 ,所以创建了九千多条没出错,我也不想在测试了,csdn再更新 我也老是登陆不了所以我就直接把答案放出来,以前测试的结果: Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native threa...

weixin_34144450的博客 101

java.lang.OutOfMemoryError: unable to create new native thread

1、问题起因 这个异常问题本质原因是我们创建了太多的线程,而能创建的线程数是有限制的,导致了异常的发生。能创建的线程数的具体计算公式如下: (MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads Ma...

weixin_34341229的博客 284

JVM最多可创建多少线程

JVM可支持的最大线程数 JVM最大线程数 (2012-07-04 23:20:15) 转载▼ 标签: jvm 最大线程数 it 分类:java分布式总结 摘自:http://sesame.iteye.com/blog/622670 工作中碰到过这个问题好几次了,觉得有必要总结一下,...

weixin_30920091的博客 108
上一篇: IO
下一篇: mavne build
go_sparrow
博客等级 码龄11年 25粉丝 257原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值