Java虚拟机八 分析Java堆

常见的内存溢出的原因及其解决思路

1.堆溢出:

由于大量的对象都直接分配在堆上,因此它最有可能发生溢出。因为大量对象占据了堆空间,而这些对象都持有强引用,导致无法回收,当对象大小之和大于堆空间时就会发生溢出。

为了解决堆溢出错误,一方面可以使用-Xmx参数指定一个更大的堆空间,另一方面,由于堆空间不可能无限增长,通过MAT或者Visual VM等工具,分析找到大量占用堆空间的对象,并在应用程序上作出合理的优化也是十分必要的。

2.直接内存溢出

在Java的NIO(New IO)中,直接内存的使用,也就是通过Java代码,获得一块堆外的内存空间,这块空间是直接向操作系统申请的。直接内存的申请速度一般要比堆内存慢,但是其访问速度要快于堆内存。因此对于那些可复用的,并且会被经常访问的空间,使用直接内存可以提高系统性能。但是由于直接内存没有被Java虚拟机完全托管,若使用不当,也会发生内存溢出而宕机。

原文地址:https://www.cnblogs.com/taiguyiba/p/9771993.html

时间: 2024-11-06 09:49:58

Java虚拟机八 分析Java堆的相关文章

实战Java虚拟机之中的一个“堆溢出处理”

从今天開始.我会发5个关于java虚拟机的小系列: 实战Java虚拟机之中的一个"堆溢出处理" 实战Java虚拟机之二"虚拟机的工作模式" 实战Java虚拟机之三"G1的新生代GC" 实战Java虚拟机之四"禁用System.gc()" 实战Java虚拟机之五"开启JIT编译" 以下说说[实战Java虚拟机之中的一个"堆溢出处理"] 在Java程序的执行过程中,假设堆空间不足.则有可能抛

【java虚拟机序列】java中的垃圾回收与内存分配策略

在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃圾回收(Garbage Collection,GC)是java语言的一大特色,在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理.而在C/C++中是需要程序员主动释放的,而在java中则交给JVM自动完成,既然是交给程序自动执行,那么这里就必须完成以下几件事:

<<深入Java虚拟机>>-第二章-Java内存区域-学习笔记

Java运行时内存区域 Java虚拟机在运行Java程序的时候会将它所管理的内存区域划分为多个不同的区域.每个区域都有自己的用途,创建以及销毁的时间.有的随着虚拟机的启动而存在,有的则是依赖用户线程来启动和销毁. 程序计数器 程序计数器是一块很小的区域,可以看做是用来表示线程所执行到字节码的某一行的行号指示器. 在Java虚拟机中,多线程是线程之间轮流切换并分配处理器的执行时间来实现的,为了线程切换之后能够继续回到之前的代码行继续执行,所以每个线程都有一个“线程私有”的程序计数器. 如果线程正在

java虚拟机学习-触摸java常量池(13)

java虚拟机学习-深入理解JVM(1) java虚拟机学习-慢慢琢磨JVM(2) java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制 java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3) java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4) java虚拟机学习-JVM调优总结(5) java虚拟机学习-JVM调优总结(6) java虚拟机学习-JVM调优总结-基本垃圾回收算法(7) java虚拟机学习-JVM调优总结-垃圾回收面临的

深入理解java虚拟机(1)走进java

1.JDK:java程序设计语言.java虚拟机.javaAPI 二.自动内存管理机制 ----------------------------------------------------- 1.运行时数据区域: (1)java虚拟机在执行java程序的过程中会把所管理的内存划分为若干个不同的数据区域.这些区域有着各自的用途,以及创建和销毁的时间,有些区域随着虚拟机的启动而存在,有些区域则是依赖用户线程的启动和结束而创建和销毁. (2)java虚拟机所管理的内存会包括以下几个运行时数据区域

java虚拟机内存分析

1.大致来说java虚拟机分为:堆  栈 栈在数据结构就是那个先进后出的栈.堆...这名字我一听就觉得大..毕竟我们形容东西多又没什么大多的组织的时候就是一堆一堆的....(原谅我发散性的思维,我是妹子...这样能理解我的思维么?) 栈是跟着线程走的.一个线程一个栈.一个方法一个栈帧(搞个这么专业的名字,其实就是一个方法的元数据包,比如记录了这个方法的名字,哪一行,参数,返回..等等等,你就想象下,你是虚拟机,你要执行个方法你要写什么信息...).栈的特点就是先进后出,正好跟方法的执行是匹配的,

java虚拟机体系分析

  一.JVM的生命周期: 1)程序开始执行,他就运行,程序停止,它就结束.有几个程序在执行,就有几个虚拟机在工作.只要Java虚拟机中还有普通的线程在执行,Java虚拟机就不会停止. 2)Java虚拟机总是开始于一个main()方法,这个方法必须是公有.返回void.接受一个字符串数组.在程序执行时,你必须给Java虚拟机指明这个包含main()方法的类名. Main()方法是程序的起点,他被执行的线程初始化为程序的初始线程.程序中其他的线程都由他来启动. 3)Java中的线程分为两种:守护线

从Java虚拟机角度分析类的实例化顺序

1.首先展示一下实例代码(Son.java & Father.java) public class Father { public static int a=10;//父类的静态变量 static{//父类的静态代码块 a=20; } {//父类的构造代码块 a=30; } public Father() {//父类的构造方法 a=40; } } public class Son extends Father{ public static int s=10;//子类的静态变量 public in

Java虚拟机六:Java进程占用cpu过高问题分析

在平时开发过程中,经常会碰到Java进程占用cpu过高的现象,本篇将简单记录一下自己分析该类问题的步骤. 1.使用 top -p <pid> 命令(<pid>为Java进程的id号)查看Java进程的cpu占用: 该Java进程占用cpu达到92.2%. 2.使用 top -Hp <pid>  命令(<pid>为Java进程的id号)查看该Java进程内所有线程的资源占用情况(按shft+p按照cpu占用进行排序,按shift+m按照内存占用进行排序)此处按