全部 文章 问答 分享 共找到456个相关内容
[问答] MyBatis / Spring Data JPA



Spring Data JPA 、是看康师傅的博客系统才知道的


Mybatis plus 看到好像好多人用,我也不知道好在哪

2022-03-28 09:43 · JDBC / JPA / Mybatis
[问答] Data和Extra有什么区别?
我理解Intent里,Data和Extra都可以用来传数据吧?应用上有什么区别呢?Extra是不是不可以在manifest里加内容?
2020-04-15 22:05 · Android / Intent
[文章] Android开发中如何读取meta-data里内容呢?
Android开发中如何读取meta-data里内容?这个知识点不长用,但是也有见到的地方,什么地方常用呢?
[问答] DDMS中无法查看data文件夹
运行程序后创建SQLite数据库,但DDMS中data文件夹无法打开,命令行查询也显示权限被拒绝。跪求大佬帮忙解决.
2020-03-29 11:56 · Android
[问答] retrofit form-data 提交请求的问题
目的是文字信息和图片一起上传,在postman上面使用form-data可以提交成功。
2020-04-09 22:24 · 安卓retrofit
[问答] data parcel size 4242052 bytes


android.os.TransactionTooLargeException: data
2022-01-27 15:29 · Android
[文章] Android Data Binding 开发普通列表
lt;SobLoop>>()funhttpGetLoop(){viewModelScope.launch{request{getLoop()}.onSucceed{//成功处理.有些接口,data
2021-02-01 14:05 · Android / debug / 断点 / jetpack / mvvm
[问答] Android 修改data目录下文件的默认权限

Android 修改data目录下文件的默认权限,就是通过chmod 777 update.zip一样的权限。

2023-02-22 11:38 · android
[问答] android加载手机本地视频,从data中找不到path(视频路径)。
问题:onActivityResult返回后,要获得data中的视频地址数据,用上面代码,for循环了一下,看其中有视频名字,没有视频路径。求解答。谢谢了。
2020-05-17 17:10 · android / 加载本地视频 / uri / 视频地址
[问答] 用 retrofit 请求后台给的 Content-Type: multipart/form-data 类型的接口
首先,后台给的接口是没问题的,参数:keyword,cid1,cid2,参数有值返回符合参数的数据,无值返回所有数据因为后台用的是Content-Type:multipart/form-data类型的接口所以我用的是
2020-10-07 12:03 · 网络请求
[问答] 网络请求得到的数据不能转换成DataBean,如何取出data里面的数据
我通过Http请求模拟得倒了返回的Json字符串,但是data里面有斜杠,不能够转成DataBean直接就是String格式,那我在下面得到请求的数据的时候要怎么得倒data里面的数据
2020-05-06 14:48 · android
[问答] 通过data.getParcelableExtra("data"); 显示的照片很小,为什么?
Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
2021-04-12 09:42 · android / 拍照
[文章] 给服务器post数据报错:Expected BEGIN_OBJECT but was STRING at line 1 column 70 path $.data
给服务器post数据报错:ExpectedBEGIN_OBJECTbutwasSTRINGatline1column70path$.data服务器期望的是String,但是我给了Object对象。
2020-06-09 22:16 · retrofit / okhttp
[文章] spring data jpa 多表操作之多对多
springdatajpa多表操作之多对多前面我们学习了多表操作之一对多SpringDataJPA多表关系之一对多接下来我们看看多对多什么情况下有多对多关系呢?比如说用户和角色一个用户可以有多个角色吧,比如说你是管理员,又是审查员,又是VIP用户,又是讲师,对吧。一个角色也可以对应多个用户,比如说讲师,可以是张三,也可以是赵四呀!创建表CREATETABLE`tb_user`(`user_id`INTEGERPRIMARYKEYAUTO_INCREMENT,`user_name`VARCHAR(32)NOTNULL,`user_gender`CHAR(1)NOTNULL,`user_age`INTEGERNOTNULL,`user_password`VARCHAR(32)NOTNULL);CREATETABLE`tb_role`(`role_id`INTEGERPRIMARYKEYAUTO_INCREMENT,`role_name`VARCHAR(32)UNIQUENOTNULL,`role_description`VARCHAR(32)NOTNULL);CREATETABLE`tb_user_role`(`role_id`INTEGERNOTNULL,`user_id`INTEGERNOTNULL,CONSTRAINT`fk_tb_user_id`FOREIGNKEY(`user_id`)REFERENCES`tb_user`(`user_id`),CONSTRAINT`fk_tb_role_id`FOREIGNKEY(`role_id`)REFERENCES`tb_role`(`role_id`));三张表吧,一个是用户表,一个是角色表还有一张是中间表创建bean类User.javapackagenet.sunofbeach.security.domain;importjavax.persistence.*;importjava.util.HashSet;importjava.util.Set;@Entity@Table(name="tb_user")publicclassUser{@Id@Column(name="user_id")@GeneratedValue(strategy=GenerationType.IDENTITY)privateIntegeruserId;@Column(name="user_name")privateStringuserName;@Column(name="user_gender")privateStringgender;@Column(name="user_password")privateStringpassword;@Column(name="user_age")privateIntegerage;/***1、声明表关系,多对多*2、配置中间表*/@ManyToMany(targetEntity=Role.class,fetch=FetchType.EAGER)@JoinTable(name="tb_user_role",//current对象在中间表里的外键,name指的是中间表的字段,referencedColumnName指的是当前表的字段joinColumns={@JoinColumn(name="user_id",referencedColumnName="user_id")},//target对象在中间表的外键,name指的是中间表的字段,referencedColumnName指的是当前表的字段inverseJoinColumns={@JoinColumn(name="role_id",referencedColumnName="role_id")})privateSet<Role>roles=newHashSet<>();publicSet<Role>getRoles(){returnroles;}publicvoidsetRoles(Set<Role>roles){this.roles=roles;}publicIntegergetUserId(){returnuserId;}publicvoidsetUserId(IntegeruserId){this.userId=userId;}publicStringgetUserName(){returnuserName;}publicvoidsetUserName(StringuserName){this.userName=userName;}publicStringgetGender(){returngender;}publicvoidsetGender(Stringgender){this.gender=gender;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}publicIntegergetAge(){returnage;}publicvoidsetAge(Integerage){this.age=age;}}Role.javapackagenet.sunofbeach.security.domain;importjavax.persistence.*;importjava.util.HashSet;importjava.util.Set;@Entity@Table(name="tb_role")publicclassRole{@Id@Column(name="role_id")@GeneratedValue(strategy=GenerationType.IDENTITY)privateIntegerid;@Column(name="role_name")privateStringroleName;@Column(name="role_description")privateStringroleDescription;/***不需要维护外键,否则容易冲突*/@ManyToMany(mappedBy="roles")privateSet<User>users=newHashSet<>();publicSet<User>getUsers(){returnusers;}publicvoidsetUsers(Set<User>users){this.users=users;}publicStringgetRoleDescription(){returnroleDescription;}publicvoidsetRoleDescription(StringroleDescription){this.roleDescription=roleDescription;}publicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.id=id;}publicStringgetRoleName(){returnroleName;}publicvoidsetRoleName(StringroleName){this.roleName=roleName;}}DAO自行创建啦,接下来我们就进行测试一下测试测试添加角色我在实际使用的时候,也是单独添加角色的,最好不要级联操作。删除数据容易出错。/***添加角色*/@TestpublicvoidaddRole(){Rolerole=newRole();role.setRoleName("admin");role.setRoleDescription("管理员用户");roleDao.save(role);}添加结果:添加用户在添加用户的时候,我们先是查询到现有的角色,然后在创建用户的时候,关联起来。@TestpublicvoidtestAdd(){Useruser=newUser();user.setPassword("123456");user.setAge(15);user.setUserName("president");user.setGender("1");Roleadmin=roleDao.findOneByRoleName("admin");user.getRoles().add(admin);Roleteacher=roleDao.findOneByRoleName("teacher");user.getRoles().add(teacher);userDao.save(user);}我多添加几个用户的结果:用户表中间表查询测试通常来说,我们要知道某一个用户,ta对应的角色或者我们在后台编辑的时候,查看这个角色都有哪些用户@TestpublicvoidtestListUser(){List<User>all=userDao.findAll();for(Useruser:all){StringuserName=user.getUserName();StringBuffersb=newStringBuffer("[");for(Rolerole:user.getRoles()){StringroleName=role.getRoleName();sb.append(roleName+",");}sb.replace(sb.length()-1,sb.length(),"");sb.append("]");System.out.println("user-->"+userName+"role-->"+sb.toString());}}执行结果:user-->presidentrole-->[teacher,admin]user-->BillGatesrole-->[register,teacher]user-->LarryPagerole-->[register]查询角色,把对应的用户也弄出来@TestpublicvoidtestListRole(){List<Role>all=roleDao.findAll();for(Rolerole:all){StringroleName=role.getRoleName();StringBuffersb=newStringBuffer("[");for(Useruser:role.getUsers()){sb.append(user.getUserName());sb.append(",");}sb.replace(sb.length()-1,sb.length(),"");sb.append("]");System.out.println("role-->"+roleName+"uses-->"+sb.toString());}}执行结果role-->registeruses-->[LarryPage,BillGates]role-->teacheruses-->[BillGates,president]role-->adminuses-->[president]通常来说,我们是在登录的时候,需要知道用户是什么角色。所以,一般是前面的查询方式,不过呢,只是查一个用户罢了。对应的角色也出来了,根据角色跟权限的关系,再决定这个用户是否要以访问该接口。后期我们可以通过springSecurity的例子来说明一下。
2020-03-19 15:28 · 多对多 / SpringData / JPA / 后台 / 数据库
[文章] Spring Data JPA多表关系之一对多
SpringDataJPA多表关系之一对多我们使用Springdata操作数据库特别方便,增删改查基本的方法都有了。对于单表来说,结合sql语句,基本上可以满足项目单表操作需求。那么多表怎么操作呢?比如一对多,举个例子一个员工在一家公司上班,一个公司有很多员工。这里面我们涉及到公司表,员工表那么我们就看看怎么实现一对多吧。员工里有属于哪一家公司的关系,有一个外键约束。创建数据表公司表CREATETABLEtb_company(`id`INTEGERPRIMARYKEYauto_increment,`name`varchar(50)NOTNULL,`address`VARCHAR(128)NOTnull);工人表CREATETABLEtb_employee(`id`integerPRIMARYKEYauto_increment,`name`varchar(32)NOTNULL,`age`INTEGER,`gender`CHAR(1)NOTNULL,`company_id`INTEGERNOTNULL,CONSTRAINT`fk_tb_employee_company_id`FOREIGNKEY(`company_id`)REFERENCES`tb_company`(`id`));对应的实体类创建公司实体类packagecom.sunofbeach.security.domain;importjavax.persistence.*;importjava.util.HashSet;importjava.util.Set;@Entity@Table(name="tb_company")publicclassCompany{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateIntegerid;@Column(name="name")privateStringname;@Column(name="address")privateStringaddress;/***一个公司有很多员工吧,所以可以使用一个集合来保存*///配置关系@OneToMany(targetEntity=Employee.class,fetch=FetchType.EAGER)//company_id表示的是外键名称,referencedColumnName表示的是参照主表主键字段@JoinColumn(name="company_id",referencedColumnName="id")privateSet<Employee>employees=newHashSet<>();publicSet<Employee>getEmployees(){returnemployees;}publicvoidsetEmployees(Set<Employee>employees){this.employees=employees;}publicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicStringgetAddress(){returnaddress;}publicvoidsetAddress(Stringaddress){this.address=address;}@OverridepublicStringtoString(){return"Company{"+"id="+id+"\n,name='"+name+'\''+"\n,address='"+address+'\''+'}';}}员工表packagecom.sunofbeach.security.domain;importjavax.persistence.*;@Entity@Table(name="tb_employee")publicclassEmployee{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateIntegerid;@Column(name="name")privateStringname;@Column(name="age")privateIntegerage;@Column(name="gender")privateStringgender;@Column(name="company_id")privateIntegercompanyId;@ManyToOne(targetEntity=Company.class)@JoinColumn(name="company_id",referencedColumnName="id",insertable=false,updatable=false)privateCompanycompany;publicCompanygetCompany(){returncompany;}publicvoidsetCompany(Companycompany){this.company=company;}publicIntegergetCompanyId(){returncompanyId;}publicvoidsetCompanyId(IntegercompanyId){this.companyId=companyId;}publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicIntegergetAge(){returnage;}publicvoidsetAge(Integerage){this.age=age;}publicStringgetGender(){returngender;}publicvoidsetGender(Stringgender){this.gender=gender;}}测试CRUD添加公司packagenet.sunofbeach.test;importcom.sunofbeach.security.SecurityApplication;importcom.sunofbeach.security.dao.CompanyDao;importcom.sunofbeach.security.domain.Company;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)@SpringBootTest(classes=SecurityApplication.class)publicclassTestDao{@AutowiredprivateCompanyDaocompanyDao;@TestpublicvoidtestAddCompany(){Companycompany=newCompany();company.setAddress("Shenzhen");company.setName("sunofbeachInc");companyDao.save(company);}}后面的话只写方法部分啦添加员工@TestpublicvoidtestAddEmployee(){Companycompany=companyDao.findOneByName("AlibabaInc");Employeeemployee=newEmployee();employee.setAge(28);employee.setCompanyId(company.getId());employee.setGender("m");employee.setName("Jack");employeeDao.save(employee);}这里的结果如下,我使用sql查询一下,然后再使用java代码去查询公司加了这么几个工人加了这些:代码进行查询查询一个工人@TestpublicvoidtestFindEmployee(){Employeejack=employeeDao.findOneByName("jack");System.out.println("jack-->"+jack);}结果如下:jack-->Employee{id=5,name='Jack',age=28,gender='m',companyId=6,company=Company{id=6,name='AlibabaInc',address='HangZhou'}}查找公司@TestpublicvoidtestFindCompany(){Companycompany=companyDao.findOneByName("sunofbeachInc");System.out.println("company-->"+company);Set<Employee>employees=company.getEmployees();for(Employeeemployee:employees){System.out.println("employee-->"+employee);}}测试结果company-->Company{id=4,name='sunofbeachInc',address='Shenzhen'}employee-->Employee{id=1,name='Lisi',age=28,gender='m',companyId=4,company=Company{id=4,name='sunofbeachInc',address='Shenzhen'}}employee-->Employee{id=2,name='Zhangsan',age=28,gender='f',companyId=4,company=Company{id=4,name='sunofbeachInc',address='Shenzhen'}}到这里我们就不删除了哈,一对多的关系就搞定了,后面我们再去看看多对多的怎么整吧。这些都不用记,用得上的时候,看看。写着写着就会了。
2020-03-17 00:02 · 多对多 / 数据库 / Spring / Data / JPA
[文章] JVM内存运行时数据区域( Run-Time Data Areas)
JVM内存运行时数据区域(Run-TimeDataAreas)文档:Run-TimeDataAreas可以参考着文档来理解TheJavaVirtualMachinedefinesvariousrun-timedataareasthatareusedduringexecutionofaprogram.SomeofthesedataareasarecreatedonJavaVirtualMachinestart-upandaredestroyedonlywhentheJavaVirtualMachineexits.Otherdataareasareperthread.Per-threaddataareasarecreatedwhenathreadiscreatedanddestroyedwhenthethreadexits.Java虚拟机定义了几部分运行时数据区域用于执行程序。某些数据区域在虚拟机启动的时候创建,在虚拟机退出的时候销毁。某些数据区域属于每个线程,所以线程独享的数据区域会在线程创建的时候创建,线程结束的时候销毁。不过文章没有图,比较抽象的说话那么我们后面根据文档画个图出来吧,先把文档看完吧有哪些分类呢?ThepcRegisterTheJavaVirtualMachinecansupportmanythreadsofexecutionatonce(JLS§17).EachJavaVirtualMachinethreadhasitsownpc(programcounter)register.Atanypoint,eachJavaVirtualMachinethreadisexecutingthecodeofasinglemethod,namelythecurrentmethod(§2.6)forthatthread.Ifthatmethodisnotnative,thepcregistercontainstheaddressoftheJavaVirtualMachineinstructioncurrentlybeingexecuted.Ifthemethodcurrentlybeingexecutedbythethreadisnative,thevalueoftheJavaVirtualMachine'spcregisterisundefined.TheJavaVirtualMachine'spcregisteriswideenoughtoholdareturnAddressoranativepointeronthespecificplatform.Java虚拟机支持多线程执行,每一个线程都有它自己的计数器。在每个时间片,每一个java虚拟机线程执行着单独一个方法,也就是当前线程所执行的方法。如果那个方法不是本地方法,那么计数器就会包含当前执行的方法地址。如果当前方法是本地方法,那么计数器里的值会是undefined。虚拟机的计数器有足够大的空间来容纳所返回的地址或者平台所执行到的地方。从这文档中,我们可以得知道计数器的作用:保存当前线程所执行方法的位置(地址),如果是本地方法,那么就会是undefined特点:线程私有,也就是每个线程有自己独立的计数器空间足够记录地址,不会出现内存溢出的异常JavaVirtualMachineStacksJava虚拟机栈apartinmethodinvocationandreturn.BecausetheJavaVirtualMachinestackisnevermanipulateddirectlyexcepttopushandpopframes,framesmaybeheapallocated.ThememoryforaJavaVirtualMachinestackdoesnotneedtobecontiguous.Java虚拟机栈是方法调用和返回的一部分。因为Java虚拟机不会直接操作,除非是栈帧的入栈和出栈,栈帧会被大量分配。Java虚拟机的栈内存不一定要连续的。IntheFirstEditionofTheJava®VirtualMachineSpecification,theJavaVirtualMachinestackwasknownastheJavastack.在第一版Java虚拟机规范中,大家所说的Java栈指的就是Java虚拟机栈。ThisspecificationpermitsJavaVirtualMachinestackseithertobeofafixedsizeortodynamicallyexpandandcontractasrequiredbythecomputation.IftheJavaVirtualMachinestacksareofafixedsize,thesizeofeachJavaVirtualMachinestackmaybechosenindependentlywhenthatstackiscreated.这套规范中规定了Java虚拟机的栈大小可以是固定的,或者是动态扩展的,也就是动态计算所得的。如果Java虚拟机栈的大小是固定的,每一个栈创建的时候,大小都是独立设定的。AJavaVirtualMachineimplementationmayprovidetheprogrammerortheusercontrolovertheinitialsizeofJavaVirtualMachinestacks,aswellas,inthecaseofdynamicallyexpandingorcontractingJavaVirtualMachinestacks,controloverthemaximumandminimumsizes.Java虚拟机可以让程序或者用户设置栈的最大空间和最小空间的值ThefollowingexceptionalconditionsareassociatedwithJavaVirtualMachinestacks:以下的异常跟栈有关:IfthecomputationinathreadrequiresalargerJavaVirtualMachinestackthanispermitted,theJavaVirtualMachinethrowsaStackOverflowError.如果线程所使用的栈内存超出了所允许的,就会抛出栈溢出异常(StackOverflowError)IfJavaVirtualMachinestackscanbedynamicallyexpanded,andexpansionisattemptedbutinsufficientmemorycanbemadeavailabletoeffecttheexpansion,orifinsufficientmemorycanbemadeavailabletocreatetheinitialJavaVirtualMachinestackforanewthread,theJavaVirtualMachinethrowsanOutOfMemoryError.如果Java虚拟机栈可以动态地扩展,在尝试扩展时,如果内存不足的情况下,动态伸缩会无效。或者给新的线程去初始化化栈空间,则会抛出超出内存大小的错误(OutOfMemoryError),也就是我们常说的内存溢出。由上我们可以知道:栈的大小可以设定,可以动态扩展,我们在执行java程序的时候,可以通过参数来设定如果是我们手动执行Java程序,我们是不是javaxxx呀所以是在java上加参数即可IDE也是可以配置的具体的参数内容可以看这里java命令的说明设置栈的大小,有例子和说明了栈有可能抛出的异常内存溢出异常,也就是所定的size不够用了超出内存大小异常,也就是所申请的内存超出了内存的大小了,也就是内存溢出栈数据的内存安全问题,栈是线程独享的如果是站内的数据,则是线程安全的如果是返回给外部使用,或者由外部传进来的数据,则不一定线程安全所以这里就有个问题了,怎么排查异常,后面再分出专题去写吧。另外这里的栈帧其实就是方法块,里面有可能做一些耗时操作,占用CPU的资源过来,也有可能出现死锁之类的。这些怎么分析,在android里有ANR异常,也会产生traces.txt文件,其实在java里也一样的。先是获取到进程--->获取到当前进程所有的线程--->dump一个快照出来,再结合代码去分析。Heap堆客家话里的堆是不是屁股的意思,哈哈!上学的时候常听同学说,[捂脸]先看原文档吧TheJavaVirtualMachinehasaheapthatissharedamongallJavaVirtualMachinethreads.Theheapistherun-timedataareafromwhichmemoryforallclassinstancesandarraysisallocated.Java虚拟机里的堆内存是所有线程共享的。堆内存是给对象和数组分配的内存。Theheapiscreatedonvirtualmachinestart-up.Heapstorageforobjectsisreclaimedbyanautomaticstoragemanagementsystem(knownasagarbagecollector);objectsareneverexplicitlydeallocated.TheJavaVirtualMachineassumesnoparticulartypeofautomaticstoragemanagementsystem,andthestoragemanagementtechniquemaybechosenaccordingtotheimplementor'ssystemrequirements.Theheapmaybeofafixedsizeormaybeexpandedasrequiredbythecomputationandmaybecontractedifalargerheapbecomesunnecessary.Thememoryfortheheapdoesnotneedtobecontiguous.当虚拟机启动的时候,对内存就创建了。这些内存会被gc管理器回收;在某个时间就会回收。Java虚拟机没有什么特定的空间管理系统,所以呢,写JVM的人,可以自己去选择或者写一套自己的管理方式。堆内存的大小可以是固定的,可以是动态的,可以是不连续的。AJavaVirtualMachineimplementationmayprovidetheprogrammerortheusercontrolovertheinitialsizeoftheheap,aswellas,iftheheapcanbedynamicallyexpandedorcontracted,controloverthemaximumandminimumheapsize.Java虚拟机允许用户设置堆的初始大小,可以通过设置最大空间和空间最小值来控制堆内存动态伸缩。Thefollowingexceptionalconditionisassociatedwiththeheap:以下异常跟堆相关:Ifacomputationrequiresmoreheapthancanbemadeavailablebytheautomaticstoragemanagementsystem,theJavaVirtualMachinethrowsanOutOfMemoryError.如果所需要的大小超出了所给的空间,那么java虚拟机就会抛出一个内存溢出的异常。堆内存从上面我们可得知道堆用存放实例和数组的堆是线程共享的堆是在虚拟机开启的时候初始化/分配的堆内存的大小一样可以通过参数设置,如果你想它动态伸缩的话,设置最大值和最小值即可设置堆内存的初始大小,或者最大值,最小值可以参考上图的参数。堆内存如果出现了溢出的问题,我们结合Log和代码去分析就好。MethodArea方法区TheJavaVirtualMachinehasamethodareathatissharedamongallJavaVirtualMachinethreads.Themethodareaisanalogoustothestorageareaforcompiledcodeofaconventionallanguageoranalogoustothe"text"segmentinanoperatingsystemprocess.Itstoresper-classstructuressuchastherun-timeconstantpool,fieldandmethoddata,andthecodeformethodsandconstructors,includingthespecialmethods(§2.9)usedinclassandinstanceinitializationandinterfaceinitialization.Java虚拟机的方法区是线程共享的。代码区就是存储编译后的代码,比如说类的信息,常量池,字段,方法之类的数据。也包括一些用于对象实例初始化的方法。这里我就反编译一下给大家看看,.class文件有什么内容。简单来一个Helloworld吧!源代码publicclassTest{publicstaticvoidmain(String[]args){System.out.println("helloworld");}}编译-->得到了.class文件然后反编译:这种反编译出来的跟我们的IDE反编译出来的是一样的我们加个参数-v查看详细信息这样子,我们就可以看到:Classfile/C:/Users/TrillGates/Desktop/demo/Test.classLastmodified2020-4-25;size413bytesMD5checksum3bdd27cc59148b93fb3dc3f1b4a43e8bCompiledfrom"Test.java"publicclassTestminorversion:0majorversion:52flags:ACC_PUBLIC,ACC_SUPERConstantpool:#1=Methodref#6.#15//java/lang/Object."<init>":()V#2=Fieldref#16.#17//java/lang/System.out:Ljava/io/PrintStream;#3=String#18//helloworld#4=Methodref#19.#20//java/io/PrintStream.println:(Ljava/lang/String;)V#5=Class#21//Test#6=Class#22//java/lang/Object#7=Utf8<init>#8=Utf8()V#9=Utf8Code#10=Utf8LineNumberTable#11=Utf8main#12=Utf8([Ljava/lang/String;)V#13=Utf8SourceFile#14=Utf8Test.java#15=NameAndType#7:#8//"<init>":()V#16=Class#23//java/lang/System#17=NameAndType#24:#25//out:Ljava/io/PrintStream;#18=Utf8helloworld#19=Class#26//java/io/PrintStream#20=NameAndType#27:#28//println:(Ljava/lang/String;)V#21=Utf8Test#22=Utf8java/lang/Object#23=Utf8java/lang/System#24=Utf8out#25=Utf8Ljava/io/PrintStream;#26=Utf8java/io/PrintStream#27=Utf8println#28=Utf8(Ljava/lang/String;)V{publicTest();descriptor:()Vflags:ACC_PUBLICCode:stack=1,locals=1,args_size=10:aload_01:invokespecial#1//Methodjava/lang/Object."<init>":()V4:returnLineNumberTable:line1:0publicstaticvoidmain(java.lang.String[]);descriptor:([Ljava/lang/String;)Vflags:ACC_PUBLIC,ACC_STATICCode:stack=2,locals=1,args_size=10:getstatic#2//Fieldjava/lang/System.out:Ljava/io/PrintStream;3:ldc#3//Stringhelloworld5:invokevirtual#4//Methodjava/io/PrintStream.println:(Ljava/lang/String;)V8:returnLineNumberTable:line3:0line4:8}SourceFile:"Test.java"这里面呢,就有文档里说到的pre-classstructures了还有Constantpool,自己去对吧。Themethodareaiscreatedonvirtualmachinestart-up.Althoughthemethodareaislogicallypartoftheheap,simpleimplementationsmaychoosenottoeithergarbagecollectorcompactit.Thisspecificationdoesnotmandatethelocationofthemethodareaorthepoliciesusedtomanagecompiledcode.Themethodareamaybeofafixedsizeormaybeexpandedasrequiredbythecomputationandmaybecontractedifalargermethodareabecomesunnecessary.Thememoryforthemethodareadoesnotneedtobecontiguous.方法区是在虚拟机启动的时候创建的。虽然说方法区逻辑上是堆的一部分,但通常来说不会由gc去回收它。此规范不会方法区里的代码。方法区的大小可以固定,或者动态伸缩。内存也不是必须是连续的。AJavaVirtualMachineimplementationmayprovidetheprogrammerortheusercontrolovertheinitialsizeofthemethodarea,aswellas,inthecaseofavarying-sizemethodarea,controloverthemaximumandminimummethodareasize.Java虚拟机可以让用户或者程序设置方法区的初始大小,或者设置方法区大小的最大值和最小值。Thefollowingexceptionalconditionisassociatedwiththemethodarea:相关的异常:Ifmemoryinthemethodareacannotbemadeavailabletosatisfyanallocationrequest,theJavaVirtualMachinethrowsanOutOfMemoryError.内存溢出通过这些文档,我们里了解到了:方法区是线程共享的方法区的大小不够用了,会抛出内存溢出的异常方法区存放已经编译的代码Run-TimeConstantPool运行时常量池前面我们在方法区里有一个常量池,这个是在.class文件里的而里面的常量池,加载时会被载入到运行时常量池里。Arun-timeconstantpoolisaper-classorper-interfacerun-timerepresentationoftheconstant_pooltableinaclassfile(§4.4).Itcontainsseveralkindsofconstants,rangingfromnumericliteralsknownatcompile-timetomethodandfieldreferencesthatmustberesolvedatrun-time.Therun-timeconstantpoolservesafunctionsimilartothatofasymboltableforaconventionalprogramminglanguage,althoughitcontainsawiderrangeofdatathanatypicalsymboltable.运行时常量池是根据字节码文件里的常量池表加载的类或者接口。它包括了几类的常量:数字、文字、方法、字段、引用。运行时常量池就像一个符号一表一样,给编程语言提供转换的功能。它包含的范围很广,比基本数据类型还大。Eachrun-timeconstantpoolisallocatedfromtheJavaVirtualMachine'smethodarea(§2.5.4).Therun-timeconstantpoolforaclassorinterfaceisconstructedwhentheclassorinterfaceiscreated(§5.3)bytheJavaVirtualMachine.每一个运行时常量表从方法区中分配。运行时常量池在类或者接口创建被虚拟机的创建的时候创建。Thefollowingexceptionalconditionisassociatedwiththeconstructionoftherun-timeconstantpoolforaclassorinterface:相关异常:Whencreatingaclassorinterface,iftheconstructionoftherun-timeconstantpoolrequiresmorememorythancanbemadeavailableinthemethodareaoftheJavaVirtualMachine,theJavaVirtualMachinethrowsanOutOfMemoryError.内存溢出See§5(Loading,Linking,andInitializing)forinformationabouttheconstructionoftherun-timeconstantpool.由上可知:运行时常量池在类/接口创建的时候而分配常量池在方法区里其实这里面还有一个StringTable的概念,俗称‘串池’,字符串池嘛。在1.6的版本它在常量池里但是这个用得了太频繁了,到了1.8以后,放在了堆内存里。因为方法区指向的是在本地内存里的元空间我们后面可以开专题去验证一下即可。了解,要是你的面试官能问到这里,你工资往多要就对了。NativeMethodStacks本地方法栈本地方法就是native方法,比如说我们的Object里的clone,hasCode之类的。换句话说,就是JNI接口方法,再往下就是C/C++实现了AnimplementationoftheJavaVirtualMachinemayuseconventionalstacks,colloquiallycalled"Cstacks,"tosupportnativemethods(methodswritteninalanguageotherthantheJavaprogramminglanguage).NativemethodstacksmayalsobeusedbytheimplementationofaninterpreterfortheJavaVirtualMachine'sinstructionsetinalanguagesuchasC.JavaVirtualMachineimplementationsthatcannotloadnativemethodsandthatdonotthemselvesrelyonconventionalstacksneednotsupplynativemethodstacks.Ifsupplied,nativemethodstacksaretypicallyallocatedperthreadwheneachthreadiscreated.Java虚拟机通常会使用栈,俗称C栈来支持本地方方法的实现。本地方法栈也会被Java虚拟机用C语言写的解析器调用。Java虚拟机不通过本地方法栈的话是无法加载本地方法的。如果想加载的话,得通过本地方法栈。本地方法栈会在每个线程创建的时候被分配。Thisspecificationpermitsnativemethodstackseithertobeofafixedsizeortodynamicallyexpandandcontractasrequiredbythecomputation.Ifthenativemethodstacksareofafixedsize,thesizeofeachnativemethodstackmaybechosenindependentlywhenthatstackiscreated.规范规定,本地方法的尺寸是可以固定的,也可以动态地伸缩。如果本地方法栈的空间是固定的,每个线程在创建本地方法栈是,可以独立地设置。AJavaVirtualMachineimplementationmayprovidetheprogrammerortheusercontrolovertheinitialsizeofthenativemethodstacks,aswellas,inthecaseofvarying-sizenativemethodstacks,controloverthemaximumandminimummethodstacksizes.可以在初始化的时候设置本地房发栈的大小。这跟前面的一样的,我怀疑写文档的人是复制粘贴的。Thefollowingexceptionalconditionsareassociatedwithnativemethodstacks:相关异常:Ifthecomputationinathreadrequiresalargernativemethodstackthanispermitted,theJavaVirtualMachinethrowsaStackOverflowError.栈溢出异常Ifnativemethodstackscanbedynamicallyexpandedandnativemethodstackexpansionisattemptedbutinsufficientmemorycanbemadeavailable,orifinsufficientmemorycanbemadeavailabletocreatetheinitialnativemethodstackforanewthread,theJavaVirtualMachinethrowsanOutOfMemoryError.内存溢出异常本地方法栈跟Java的栈一样,都是线程独享的。有异常前面提到了可以设置它的size图是如何的呢?总结我感觉我翻译得不咋滴,哈哈。看能看懂,但是说明中文就不知道怎么说更好。因为英语里有很多定语,翻译了前面后面发现要调整一下。知道这几个内存区的特点有什么用,就差不多了。至于后面的内存溢出,或者栈溢出,我们再去分析如何解决。
2020-04-25 16:24 · JVM / 内存模型 / 数据区 / 内存溢出 / 堆栈
[问答] Gson 解析空指针异常
"id":1169,"cell_id":908,"name":"照明灯","unit":"","sign":"floodlight","hex_start":0,"data_type":"3","data_type_str
2020-10-13 18:25 · 求助
[文章] Java-数据结构和算法-选择排序(selection sort)
下一次遍历从下一个元素开始,真到倒数第二个元素即可排序完成代码实现publicclassSelectSort{publicstaticvoidmain(String[]args){int[]data=newint
2020-03-31 00:21 · 选择排序 / 算法 / select / sort / 排序
[问答] 加载媒体库使用LoadManager.initLoader应用崩溃
{returnCursorLoader(this@SelectImageActivity,MediaStore.Images.Media.EXTERNAL_CONTENT_URI,arrayOf("_data
2020-03-07 16:15 · Kotlin
[问答] 领券联盟-前端版本:获取分类的详情目录下的内容出错(p10)
在前一个视频获取推荐分类的数据:returnapi.getRecommendCategories().then(result=>{console.log(result.data);if(result.code
2021-03-02 00:50 · 领券联盟 / 前端 / VUE
[文章] Java-数据结构和算法-插入排序(insertion sort)
等待排序的数据从等待排序的数据,向已经排序的数据中对比插入代码实现我这里偷懒,用了一下集合publicclassMain{publicstaticvoidmain(String[]args){int[]data
2020-03-31 23:30 · 插入排序 / 算法 / 排序 / insertion / sort
[文章] php将两个json数组合并在一起,php查询数据,两个数组合并在一起,返回给客户端
phpclassResponse{constJSON="json";//按综合方式输出数据publicstaticfunctionshow($code,$message='',$data
2020-06-25 10:41 · 数组合并
[文章] Centos7命令行安装Oracle11g
/oracle#创建oralce配置目录mkdir-p/data/inventory#创建oracle压缩包解压目录mkdir-p/data/src10.修改目录权限chown-Roracle:oinstall
2022-06-26 14:20 · 运维 / 数据库
[文章] 手写一个 CacheHelper 数据缓存工具
+cacheKey/***获取缓存数据的Key*/fungetCacheDataKey(cacheKey:String)=DATA_CACHE_DATA_KEY+cacheKey/***缓存数据*/funonCache
2023-06-15 21:44 · 安卓 / Kotlin / 数据缓存工具
[文章] 13、Android开发基础之数据存储-查看保存的数据
而每一个程序都是一个用户,android系统会默认在data/data目录下面以包名为名字,创建一个文件,这个文件只有这个应用有读写权限。
2019-10-21 22:49 · 安卓开发 / 数据存储 / 安卓应用 / app / android
[文章] 面试题:一个有名的按摩师会收到源源不断的预约请求
思考:publicstaticintmaxAddition(int[]data){//如果没人预约,则返回0if(data.length==0){return0;}//如果一个人预约if(data.length
2020-04-25 10:54 · 算法 / java / 面试题 / javascript
[文章] nginx 配置用户认证
认证会更加安全安装htpasswd工具yum-yinstallhttpd-tools生成用户登录的认证文件创建文件夹apache2cd/datamkdirapache2创建认证的账号密码htpasswd-c/data
2021-10-08 21:24 · nginx / prometheus
[文章] Docker 退出时出现There are stopped jobs解决方案
一、问题由来今天在doker里对solr进行配置的时候按ctrl+z使程序挂起在想退出docker的时候就出现了这个问题root@bbc21cc1e246:/var/solr/data/Ik_core/
2020-07-18 21:48 · docker
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 16