阅读 深入理解JVM虚拟机笔记一

今日开始拜读大作 深入理解JVM虚拟机 在此做一些笔记记录:

        1.关于java运行时数据区域,其实远不止堆和栈,在这里粗浅的有个认知:

            

            1)程序计数器:一块比较小的内存区域。字节码解释器需要通过计数器去执行下一条指令。考虑一下多线程处理的问题,为了能够让线程切换间还能找到原先执行的位置,有必要为每一个线程开辟一个内存区域。我们称这样的内存区域是线程私有的。[额外注意:当执行一个java程序时,计数器记录字节码执行位置,当执行本地方法,记录空(undifined)。这个内存区域没有OutOfMemoryError。]

            2)java虚拟机栈:也是线程私有的内存区域。一个方法的执行会在此内存创建一个栈帧(基本数据结构,后会详述),一个方法的执行到结束,对应了栈帧的入栈和出栈。其中局部变量表是我们通常所说的堆和栈中的栈了,记录了基本类型、引用类型(可以是指针,也可以是句柄)。这个内存区域会抛出StackOverflowError和OutOfMemoryError。

            3)本地方法栈:与虚拟机栈功能类似,只不过这块内存是为了native方法服务的。与虚拟机栈一样抛出两种异常。

            4)java堆:线程共享的内存块,最大的一块内存区域,用于管理创建的对象,也是GC垃圾处理器主要管辖范围。堆中无法继续为新实例分配空间,也无法扩展内存,会抛出OutOfMemoryError。

            5)方法区:可以认为是堆的一个逻辑部分,用来存放类信息、常量、静态变量、即时编译器编译后的代码。由于GC管辖的划分方式,堆可以分为新生代和老年代,从而有人认为方法区是永久代(并不合理,也不靠谱)。会抛出OutOfMemoryError。[注:此处有运行时常量池。类文件中包含了常量信息,我们称为类常量池,运行时他们会被加入运行时常量池,同时运行时也能通过诸如String的intern()加入常量池。]

            6)之外:直接内存:也是需要留意的,物理内存决定了上限。        


        2.浅谈一个对象的创建过程:

        一句简单的new: 虚拟机在堆上为新实例开辟空间(线程间的冲突问题,一方面可以CAS保证原子性,也可以为线程单独先开辟一个小的线程堆,完成了创建再同步)--->除了对象头外所有值初始化为零值--->对象的类信息、哈希码值、GC年代等放入对象头---><init>你所写的对象初始化逻辑。

        对象:对象头+数据信息+对其填充(没啥用)。

        

        3.堆溢出的解决方式:

        在java启动项中加入参数-XX:+HeapDumpOnOutOfMemoryError,可以获得堆内存快照,运用eclipse memory analyzer打开分析。如果是内存泄漏,可以根据GC root引用链找到泄露源头。如果不存在泄露,那么就需要考虑扩大内存,或者尽可能的减少一些生命周期过长,过于庞大的实例对象。

        

        4.栈溢出(java栈和本地方法栈)

            在单线程程序中,无论如何都会抛出StackOverflowError,这样很好理解,无论栈帧过大还是虚拟栈内存太小,都可以认为是栈内存不足/深度不足。在多线程程序中,为每个线程栈分配过多的内存将会抛出OutOfMemoryError,一般来说遇到这种情况,只能通过考虑减少堆内存、栈内存来更多的获得线程(操作系统所给的内存是有限的,将会被堆栈、进程所共享)。


        5.关于常量池溢出:

            首先记录一个很有趣的问题:

            

            在JDK1.6下输出的是两个false,而到了JDK1.7下输出变成了true,false。在1.6时,intern方法会将首次遇到的字符串复制到常量池中,并返回引用。StringBuilder实例与常量池实例一定不是同一个东西,必然是false。而在1.7后,intern将首次遇到的字符串添加到常量池,但不复制,因此第一条输出true。但是考虑java这个字符串已经存在与常量池中,所以第二个必然返回false。

            

            方法区溢出是需要注意的:往往回收类十分的苛刻,对于动态产生类,或者CGLib这类加强类或者大量jsp文件...的地方,一定要格外小心。


        6.直接内存泄露

            如果发现OOM下HeapDump文件很小,基本可以考虑是直接内存泄露了。

猜你喜欢

转载自blog.csdn.net/zkANewer/article/details/79756841