JVM及反射

VM

java virtual machine.
sandbox

本地方法栈

程序计数器

栈区:push/pop

堆区:为线程共享,内放对象和数组,

方法区:为线程共享

线程:是进程内并发执行的代码段, 一个线程就是一栈,栈内压入的方法帧

绿色的共享的

dll(windows)

dynamic link library,动态链接库
函数库 + 资源.

so(linux)

shared object,共享对象

*.java ---> *.class --> ClassLoader

//类类,类的描述符 Class clazz = Person.class ;

new Person();

OOM

Outof memory,内存溢出.

www.StackOverflow.com //解决问题的网址,多去浏览

Runtime data area

1.Method area
    方法区.
    存放类描述符.
    Class只需加载一次。
    扩容.
    maven
    共享。
    Class.forName("");

2.heap
    堆区.
    存放对象和数组的地方。
    在所有线程间共享

3.java stack
    每个线程对应一个栈。
    每个进程至少有个一个线程(主线程).
    method frame(stack frame).

4.native method stack
    native方法。
5.program conter register
    略.

java内存由堆和非堆合成

java堆

heap    :   存放对象和数组
1、(yong generation):年轻代
        eden:伊甸区:对象创建所在,垃圾回收先去该区回收;
        survivor-1(幸存1区):同一时刻和幸存2区只有一个是空的
        survivor-2(幸存2区):
2、(old generation):年老代

non-heap:   非堆 (metaspace+code cache+compressed class space),方法区属于该部分
off-heap:   离堆:jvm之外的内存(unsafe)

可通过jvisualvm来查看这些分区

通过jdk自带jvisualvm软件考察

1.cmd>jvisualvm
2.安装visualgc的插件
    工具菜单 --> 插件 -> visual gc ->安装.

jconsole

jmap

1.查看堆信息
    jmap -heap 19524
2.查看永久区
    jmap -permstat 19524
3.查看类加载信息
    jmap -clstats 19524

JVM调优

-Xms            //堆初始值  1/64( < 1G)
-Xmx            //堆最大值  1/4 ( < 1G)
-Xmn            //年轻代(eden + s0 + s1),-Xmn150M

-XX:NewSize     //for 1.3/1.4/1.8,设置年轻带大小
                //-XX:NewSize=150m
                //优先级 > NewRatio.

-XX:MaxNewSize  //for 1.3/1.4/1.8,设置年轻带大小最大值

-XX:PermSize    //设置永久代值,1.8移除了该属性
                //-XX:PermSize=150m
-XX:MaxPermSize //设置永久代值最大值
                //-XX:MaxPermSize=150m

-XX:MetaspaceSize=2048m
-XX:MaxMetaspaceSize=2048m
-XX:CompressedClassSpaceSize=2048m      //***** 设置1.8的meta区 *****

-Xss            //栈空间
-XX:NewRatio    //年轻代和年老代的比例,-XX:NewRation=n,
                //代表 年轻代 : 年老代 = 1 : n
                //-XX:NewRatio=2
                //-XX:NewRatio=0.5,错误的,不能指定小数。

-XX:SurvivorRatio   //设置,单个幸存区 : 伊甸区 = 1 : n
                    //-XX:SurvivorRatio=2,

java com.it18zhang.java24.jvm.TestJVM

old   : 133.5M
young : 8  + 8 + 50.5 = 66.5M

young : old  = 1 : 2        //

eden : survivor = 3 : 1     //

ClassLoader加载

1.转换类名到location,定位class文件。
2.类加载方法:通过-cp拿到路径,通过解析出的类映射到层次结构,找到字节码文件,加载进去
3.

Map :

x instanceof Person ;           //模糊判断.
getClass() == Person.class ;    //精准判断

反射

动态访问对象的属性和方法。

Person p = new Person();
p.setName("xxx");
p.getName();

1.Class
    类的描述符.
    描述类的特征。
    Person.class ;
    Class clazz = Class.forName();
    Class clazz = Xxx.class()
    Class clazz = obj.getClass();
    //通过Class动态创建对象
    Class clazz=Class.forName("xxxx");
    Object obj=clazz.new Instance();

2.Method
    方法.
    方法描述符。
    //得到类中声明的方法(private + public + protected)
    Method m = clazz.getDeclaredMethod("name",String.class);

    //得到所可用的方法(继承的方法)·
    Method m = clazz.getMethod("name",...);

    //把私有方法定义为可用
    m.setAccessible(true);

3.Field
    字段。
    字段描述符.
    Field f = clazz.getField("name");
    Field f = clazz.getDeclaredField("name");

    f.setAccessible();

4.Constructor
    构造函数描述符.
    clazz.getConstructor(Class...)
时间: 2024-11-04 17:45:38

JVM及反射的相关文章

【DAY23】JVM与反射的学习笔记

JVM: ----------------- 1.JVM: java virtual machine. 2.class file *.class 3.ClassLoader 4.runtime data area 运行时数据区. 1.Method area : 方法区.(shared) 供所有线程共享. 2.heap(shared): 供所有线程共享. 3.java stack(栈区) 独占的. 4.native method stack(本地方法栈) 独占 5.Program counter

JVM的反射实现

java的反射机制 java的反射机制是在运行状态中,对于任意一个类都能知道他的属性和方法,对于任意一个对象都能够调用它的方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制.它允许正在运行的java程序观测甚至是修改程序的动态行为. 我们可以通过Class对象枚举该类中的所有方法,还可以通过Method.setAccessible(位于java.lang.reflect包,该方法继承自AccessibleObject)绕过java语言的访问权限,在私有方法所在类之外

《深入理解Java虚拟机》- JVM是如何实现反射的

Java反射学问很深,这里就浅谈吧.如果涉及到方法内联,逃逸分析的话,我们就说说是什么就好了.有兴趣的可以去另外看看,我后面可能也会写一下.(因为我也不会呀~) 一.Java反射是什么? 反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁. 反射是由类开始的,从class对象中,我们可以获得有关该类的全部成员的完整列表:可以找出该类的所有类型.类自身信息. 二.反射的一些应用 1.java集成开发环境,每当我们敲入点号时,IDE便会根

Java开发人员必懂的基础——反射与动态代理

Java的反射与动态代理是java体系结构中较为底层的知识,初学者可能觉得没有太大的用处,但他们确实著名Spring框架IOC和AOP所用的最重要的内容.当我们需要开发更基础,更广泛的的代码时,就会用到这学知识了. 在此之前,我们先来了解一下java的类加载机制 JVM与类加载机制: /* * 1.JVM:当调用java命令来运行某个java程序时,该命令会启动一个java虚拟机进程,同一个JVM中的所有线程,所有变量都处于同一个进程里,都使用该JVM的内存区 * 2.JVM:运行下面两个测试类

JDK动态代理

一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A proxy is an agent or substitute authorized to act for another person or a document which authorizes the agent so to act. 意思是说:代理指的是一个代理人(或替代品),它被授权代表

深入剖析动态代理

动态代理是指在运行时,动态生成代理类.代理类的字节码将在运行时生成并载入当前的ClassLoader. 生成动态代理类的方法很多,如JDK自带的动态代理.CGLIB.Javassist或者ASM库. JDK动态代理使用简单,它内置在JDK中,因此不需要引入第三方Jar包,但相对功能比较弱.CGLIB和Javassist都是高级的字节码生成库,总体性能比JDK自带的动态代理好,而且功能十分强大.ASM是低级的字节码生成工具,使用ASM已经近乎在于使用Javabytecode编程,对开发人员要求较高

代理模式(静态代理和动态代理)

一.代理模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 静态代理的一个代理只能代理一种类型,而且是在编译器就已经确定被代理的对象.而动态代理是在运行时,通过反射机制实现动态代理,并且能够代理各种类型的对象. 二.静态代理 由程序员创建或工具生成代理类的源码,再编译代理类.所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了. 静

Java基础:动态代理在RPC框架中应用

转载请注明出处:jiq?钦's technical Blog RPC,远端过程调用.就是调用远端机器上的方法. 原理其实很简单,就是客户端上运行的程序在调用对象方法时,底层将针对该方法的调用转换为TCP/HTTP请求,发送到远端服务器,远端服务器监听固定端口,收到这个TCP/HTTP请求后会解析出相关信息,包括客户端想要调用哪个类的哪个方法,参数是什么等,然后进行对应的调用,将调用结果再通过数据包发回即可. RPC中一般会有一些"契约"的概念,即客户端和服务端双方约定好的接口,表明服务

JStorm与Storm源码分析(五)--SpoutOutputCollector与代理模式

本文主要是解析SpoutOutputCollector源码,顺便分析该类中所涉及的设计模式–代理模式. 首先介绍一下Spout输出收集器接口–ISpoutOutputCollector,该接口主要声明了以下3个抽象方法用来约束ISpoutOutputCollector的实现类.接口定义与方法说明如下: /** * ISpoutOutputCollector:Spout输出收集器接口 */ public interface ISpoutOutputCollector { /** * 改方法用来向外