jvm内存区域与内存溢出异常

对象的创建过程:

一.现在常量池中定位符号的引用

二.是否被加载,解析或者初始化过,如果没有初始化,则执行classLoader,执行里面的static块内容等

三.从java堆中划分内存空间,有以下两种方式

    1.指针碰撞,要求内存空间是连续的。每次将指针移动需要的空间。

    2.空闲列表,内存空间可以不连续,需要有一个列表来维护哪些空间是可用的

    多线程创建对象,由于只有一个指针,所以会出现a线程已经在使用指针,b线程获取了尚未移动的指针,这样操作了相同的内存地址,就会出现问题,解决方案有二:

    1.cas(乐观锁)加上失败重试来保证更新的原子性。

    2.给每个线程都有一小块内存缓冲(Thread Local Allocation Buffer,TLAB),线程需要分配内存,先使用TALB,使用完之后同步锁定分配内存。

     内存分配完毕,给内存空间初始化零值。

    最后在new之后执行init方法,这样一个真正可用的对象才算真正初始化完毕。

对象的内存布局

    一. 对象头,它具有以下两种类型数据

        1.自身运行时的数据,hashcode,gc分代年龄,锁状态标记,线程持有锁,偏向线程id,偏向时间戳

        2.类型指针,对象指向它的类元数据。来说明他是哪个类的实例。如果是数组,还需要记录数组长度。

    二.实例部分

    存储了java对象中真正有效的内容,包含了各种类型的字段内容。按照字段来分配,如shorts/chars

    三.对齐填充

    并非必须的,只是为了凑齐8的整数倍而已

对象的访问定位

    java程序通过栈上的reference来操作堆上的具体对象,他们之间只是建立了引用关系,通常有以下两种方式来访问:

    1.句柄访问

    堆中会划分一块内存来作为句柄池,reference存储的是句柄的地址,而句柄中包含了对象实例数据与各自的具体地址信息

从这里看出来,每个对象其实只保存了它独有的变量数据,对于method存放在对象类型数据里面,也就是method里面。

另外一种方式是直接指向对象实例数据的

第一种方式,发生gc时不需要修改reference的指向,但是慢。第二种方式相反。

OOM异常的发生

1.堆溢出,内存泄漏,内存溢出

2.栈溢出

    当jvm总的内存,超过了系统分配的则会oom

    当单线程的深度超过了栈的内存,则出现StackOverflowError

3.当方法区内 class过多或者运行时常量过多,则会出现oom错误

    

    

   

 

转载于:https://my.oschina.net/vqishiyu/blog/1828538

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 1. Spark中JVM内存使用及配置详情: Spark中的JVM内存使用主要包括堆内存和非堆内存。堆内存用于存储对象实例,而非堆内存用于存储类信息、方法信息等。在Spark中,可以通过以下参数来配置JVM内存使用: - spark.driver.memory:用于配置Driver进程的堆内存大小,默认为1g。 - spark.executor.memory:用于配置Executor进程的堆内存大小,默认为1g。 - spark.driver.extraJavaOptions:用于配置Driver进程的非堆内存大小和其他JVM参数。 - spark.executor.extraJavaOptions:用于配置Executor进程的非堆内存大小和其他JVM参数。 2. Spark报错与调优: 在Spark运行过程中,可能会出现各种报错,如内存溢出、任务失败等。针对这些报错,可以采取以下调优措施: - 内存溢出:增加Executor进程的堆内存大小、减少每个任务的数据量、使用缓存等方式来减少内存使用。 - 任务失败:增加Executor进程的数量、减少每个任务的数据量、调整任务的并行度等方式来提高任务的执行效率。 3. Spark内存溢出OOM异常: Spark内存溢出OOM异常是指Executor进程的堆内存不足以存储当前任务所需的数据,导致任务执行失败。可以通过增加Executor进程的堆内存大小、减少每个任务的数据量、使用缓存等方式来减少内存使用,从而避免内存溢出异常的发生。 ### 回答2: Spark中JVM内存使用及配置详情: Spark使用JVM来执行任务,其中一个非常重要的参数是堆内存(Heap Memory)的大小。堆内存用于存储对象实例和方法调用的信息。在使用Spark时,可以通过spark.driver.memory和spark.executor.memory参数来配置JVM内存的大小,默认情况下,它们都是1g。需要根据具体的任务需求和集群资源情况来进行调整。如果遇到内存不足的情况,可以增加堆内存的大小,但是需要保证集群资源充足。 Spark报错与调优: 在使用Spark过程中,常见的报错有内存溢出、数据倾斜、任务运行时间过长等问题。对于这些问题,可以采取一些调优策略进行处理。例如,在遇到内存溢出(Out of Memory)异常时,可以通过增加堆内存大小或者减少数据量来解决;对于数据倾斜的情况,可以考虑数据重分区或者使用一些聚合策略来优化;对于任务运行时间过长的情况,可以考虑增加Spark任务的并行度或者使用缓存机制来加速计算等。 Spark内存溢出(OOM)异常: Spark中的内存溢出异常通常是由于使用的内存超过了配置的阈值引起的。在配置Spark应用程序时,可以设置spark.driver.memory和spark.executor.memory参数来调整JVM内存的大小。如果内存不足,则需要增加内存配置或者优化代码逻辑。另外,可以通过设置spark.memory.offHeap.enabled参数来开启堆外内存,将一部分内存放到堆外,从而减少对JVM内存的占用。此外,还可以通过设置spark.memory.fraction参数来调整JVM内存的分配比例,更好地利用内存资源。如果调整参数后仍然出现内存溢出问题,还可以考虑调整Spark任务的并行度或者增加集群资源。 ### 回答3: Spark是一个基于内存的数据处理框架,能够高效地处理大规模数据集。在Spark中,JVM内存的使用及配置对于保证程序的稳定和性能的提升非常重要。 首先,Spark的JVM内存分为堆内存和非堆内存两部分。堆内存是用来存储对象实例的,而非堆内存则用来存储JVM本身的运行时数据。为了合理配置JVM内存,可以通过配置spark.driver.memory和spark.executor.memory参数来设置堆内存的大小。根据集群的硬件配置和任务的需求情况,可以根据具体情况来调整这两个参数的数值。 其次,在Spark运行过程中,经常会遇到各种报错。常见的报错有内存溢出(OutOfMemoryError)、任务失败(TaskFail)等。当遇到内存溢出错误时,可以尝试以下几种方法来调优: 1. 增加可用内存:可以通过增加executor内存或调整任务分区大小来扩大可用内存。 2. 减少数据规模:可以通过过滤数据、采样数据或者使用压缩算法来减少数据的大小。 3. 优化代码:可以优化代码逻辑和算法,减少内存使用。 4. 调整缓存策略:可以通过手动控制缓存的数据量,及时释放不再使用的缓存。 最后,Spark的内存溢出(OOM)异常通常是由于数据量过大,超出了可用内存的限制而导致的。当出现内存溢出异常时,可以参考上述的调优方法来解决问题。 总之,合理配置JVM内存、及时处理报错、避免内存溢出异常是保证Spark程序稳定与性能的关键。希望以上回答对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值