关于JVM个人浅谈(一)

Java虚拟机是Java程序运行的基础,也是深入理解java的必备知识。

首先JVM的内存分布主要有:程序计数器,虚拟机栈,本地方法栈,Java堆,方法区。其中标红的表示相对更重要。

1)程序计数器

程序计数器是一块很小的内存,是每一块线程的私有空间,主要负责为每一个线程记录下一条需要运行的指令。如果当前线程正在执行一个Java方法,则程序计数器记录正在执行的Java字节码地址,如果电器一个线程正在执行一个Native方法,则程序计数器为空。

2)Java虚拟机栈

Java虚拟机栈是线程的私有空间,它保存方法的局部变量,部分结果,并参和方法的调用和返回。一般和本地方法栈归到一类,没有做过细的区分。在Java虚拟机规范中,定

义了两种异常与栈空间有关:stackOverflowErro和OOM。如果线程在计算过程中,请求栈的深度大于最大可用深度,则抛出SOF;如果在扩展栈的过程中没有足够的内存空间来支持栈的扩展,则抛出OOM。当然这里需要强调一点,当花在GC的时间超过了GCTimeLimit一样会抛出OOM。在Hot Spot虚拟机中,可以使用-Xss来设置栈的大小,栈的大小直接决定了函数调用的可达深度。这里需要注意一点是:函数嵌套调用的次数由栈的大小决定,栈越大,函数嵌套调用次数越多,对于一个方法而言,他的参数越多,内部局部变量就越多,他的栈帧就越大,器嵌套调用次数就越少。

3)Java堆(共享区域)

Java对可以说是Java内存中最重要的部分了,几乎所有的对象和数组都是在堆分配空间的。Java堆分为新生代和年老代。如果Java堆中刚刚产生的对象在经过几轮MiniorGC后仍然存活的话,就会被挪至年年老代。

新生代又可以划分为eden,surivivor space()简称s0和survivor space1()简称s1.。eden是对象刚出生的地方,大部分对象刚出生都会存放到这里。s0

与s1为survivor空间,这里也是MiniorGC的发送区域。具体如下图:

   

关于如何配置堆大小,后面会做解释。

4)方法区(共享区域)

方法区叫永久区域,它保存大部分来之于class的文件,常量池,经过多次MiniorGC仍然存活的对象,以及静态文件。通过-XX:MaxPermSize=进行设置。

好了,现在介绍完Java虚拟机的分布,下一章将介绍GC的基本回收算法。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-28 19:28:54

关于JVM个人浅谈(一)的相关文章

关于JVM个人浅谈(三)

在上一篇中,大致讲述了GC回收的算法,接下来就在本篇文章里介绍一下如何去预估Java对象的大小,以便后续再优化JVM提供数据理论基础. 一个普通对象的内存大小如下: 1._mark对象头 占用8byte: 2.oop指针,默认占用4byte: 3.数据区 具体根据对象属性而定: 4.padding,内存对齐(如果不懂,可以看看计算机组成原理 这本书 大学计算机系必修之一) Java以8的倍数对齐 一个普通的数组内存大小如下: 1._mark对象头 占用8byte 2.oop指针,默认占用4byt

jvm 原理浅谈

jvm 包含了堆栈区.方法区等存储区域.类装载子系统以及执行引擎. jvm执行流程:编译(字节码)-->类装载(加入内存)-->类执行(分配内存执行) jvm 内存机制:堆内存(new出来的所有对象)    栈内存(基础数据类型.形参.new对象的引用) 静态方法区(方法代码.final常量.静态变量) 本地方法栈 类被装载后执行前,会进行链接即初始化,初始化一些方法,先初始化默认值,然后静态初始化函数和静态域的初始化构造方法的执行!

关于JVM个人浅谈(二)

在上一章,我们了解Java虚拟机的分布以及各个部分的主要存储内容,下面将介绍GC的长用回收算法. 1.引用计数法: 引用计数法是比较古老的一种垃圾回收算法.主要实现就是当任何一个对象引用A对象的时候,则在A对象的计数器上加1,如果引用失效的时候,则将A的计数器减1,如果对象A的引用计数器为0,则回收该对象的内存空间.这种方式虽然简单,但是存在不足,就是当A对象引用B对象,B对象又引用A对象,这样,A与B对象的计数器一直都是1,产生死锁,引起内存泄漏. 2.标记-清除法 在Java堆内存中从根节点

浅谈web应用的负载均衡、集群、高可用(HA)解决方案(转)

1.熟悉几个组件 1.1.apache     —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安 全Socket层(SSL)等等,目前互联网主要使用它做静态资源服务器,也可以做代理服务器转发请求(如:图片链等),结合tomcat等 servlet容器处理jsp.1.2.ngnix     —— 俄罗斯人开发的一个高性能的 HTTP和反向代理服务器.由于Nginx 超越 Apache 的高性能和稳

【转】浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初

java多线程浅谈

经常看到,一个对象的synchronized方法被一个线程调用后,那么其他线程还能调用该线程的其他方法吗? 网上给出各种答案,其中一种是:不能. 但是,我们有没有自己动手去写一个简单的程序来验证一下?从这个问题浅谈一下我对java多线程的理解. 要理解java的多线程,首先的理解jvm. 参见http://blog.csdn.net/kyfg27_niujin/article/details/7942006

浅谈java异常[Exception]

本文转自:focusJ 一. 异常的定义 在<java编程思想>中这样定义 异常:阻止当前方法或作用域继续执行的问题.虽然java中有异常处理机制,但是要明确一点,决不应该用"正常"的态度来看待异常.绝对一点说异常就是某种意义上的错误,就是问题,它可能会导致程序失败.之所以java要提出异常处理机制,就是要告诉开发人员,你的程序出现了不正常的情况,请注意. 记得当初学习java的时候,异常总是搞不太清楚,不知道这个异常是什么意思,为什么会有这个机制?但是随着知识的积累逐渐也

java反射机制浅谈

一.Java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动,说不定会请各位吃饭哦! 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2.反射

浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初