JVM笔记(一)

最近开始看一些JVM的内容,做点笔记和一些代码加深记忆,也方便以后来回顾

JVM运行时数据区
运行时数据区
程序计数器:行号指示器,分支,循环,跳转,异常处理,县城回复基础功能依靠计数器记录相应行号。每条县城都需要一个独立的程序计数器,独立存储,线程私有内存,此内存区域是唯一一个在java虚拟机规范中没有任何规定OutOfMemoryError情况的区域

Java虚拟机栈:线程私有,生命周期与线程相同,描述的是Java方法执行的内存模型,每个方法执行时都会创建一个栈帧用于存储局部变量变,操作数栈,动态链接,方法出口等信息,方法从调用到执行完成的过程对应着栈帧在虚拟机栈入栈到出栈的过程。
局部变量表存放基本类型(boolean,byte,char,short,int,float,long,double),对象引用(reference类型)和returnAddress类型(指向一条字节码指令的地址),局部变量变所需内存空间编译期完成分配
虚拟机栈在Java虚拟机规范中规定两种异常①线程请求栈深度大于虚拟机所允许深度,StackOverFlowError异常,对于可动态扩展虚拟机栈当扩展时无法申请到足够的内存抛出OutOfMemoryError

tip:这里边的两个异常栈深度在我理解看来应该是一次方法所请求的内存大小,后面的OOM异常相对比于此处的SOF异常可以算是多次方法请求内存不足的异常,上两段代码说说应该就比较清楚了

public class HeapSOF{

    private int count = 0;

    public void testAdd(){
        count ++;
        testAdd();
    }
    public void test(){
        try{
        testAdd();
         }catch(Throwable e){
             System.out.println(e);
             System.out.println("栈深度:"+count);
         }
    }
    public static void main(String [] args){
        new HeapOOM().test();
    }    
}

这里的testAdd方法在自己方法体内执行本方法,所以栈深度是无限下沉,本机上执行结果如下

java.lang.StackOverflowError
栈深度:29971

其中每次执行栈深度都会不一样,把代码改动一下,改成OOM异常

public class HeapOOM{
static class OOMObject{
}
public static void main(String[]args){
List<OOMObject>list=new ArrayList<OOMObject>();
int i = 0; 
while(true){
list.add(new OOMObject());
list.add(new OOMObject());
System.out.println(i);
i++;
}
}
}

本机执行数次短时间内结果一致,但是间隔三个小时以上在执行结果又会跟三小时之前不一致,但是短时间内仍旧一致,具体什么原因还没搞清楚。所以目前来讲就我认为的栈深度的报异常和内存不足报异常的区别类似于递归和循环的区别。似懂非懂,但却说不明白,等再往后看了看看能不能有更深入的理解

ps:笔记内容大多来自周志明所著《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在同测试函数上运行算法以观察性能差异,并可进步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
### 关于JVM的学习资源 对于希望深入学习 Java 虚拟机 (JVM) 的开发者来说,《黑马程序员 JVM 完整教程》是份非常有价值的入门材料[^1]。这份笔记涵盖了 JVM 基础概念、内存模型以及性能调优等内容,适合初学者快速掌握 JVM 的核心知识点。 如果需要更深层次的理解,可以参考以下书籍: 1. **《深入理解 Java 虚拟机:Jvm 高级特性与最佳实践(第 2 版)》** 这本书详细讲解了 JVM 的内部机制,包括类加载过程、垃圾回收算法、性能优化策略等高级主题。它仅提供了丰富的理论知识,还通过实际案例帮助读者解决常见的 JVM 性能问题。 2. **《实战 Java 虚拟机》** 此书侧重于 JVM 实战技巧,特别适用于那些希望通过真实项目经验提升技能的技术人员。书中包含大量实用工具和技术的应用场景分析。 3. **《深入 JAVA 虚拟机第二版》** 另本经典著作,专注于 JVM 架构设计及其运行原理,能够为开发者的日常编码提供指导和支持。 除了上述书籍外,在线还有许多免费资源可供利用。例如官方文档总是最好的起点之;另外像 Oracle 提供的各种技术白皮书也是可多得的好资料。 需要注意的是,当涉及到并发编程时,了解重排序现象非常重要。因为即使代码按特定顺序编写出来,编译器或者处理器为了提高效率可能会改变它们的实际执行次序——只要这种变化会影响单线程环境下的最终结果即可[^2]。 至于方法实现方面,则需确保函数签名中的返回类型同其逻辑体内的最后句`return`表达式的类别相一致。否则将会引发编译错误[^3]。 以下是基于这些原则的个简单示例展示如何判断个数是否偶数并找出两个数值之间的较大者: ```java public class Example { public static void main(String[] args){ System.out.println(isEvenNumber(4)); // 输出true System.out.println(getMax(8,5)); // 输出8 } public static boolean isEvenNumber(int number ){ return ((number % 2)==0); } public static int getMax(int a,int b){ if(a>b) return a; else return b; } } ``` ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值