comparison src/share/vm/oops/instanceKlass.cpp @ 2376:c7f3d0b4570f

7017732: move static fields into Class to prepare for perm gen removal Reviewed-by: kvn, coleenp, twisti, stefank
author never
date Fri, 18 Mar 2011 16:00:34 -0700
parents 8033953d67ff
children 2cd0180da6e1
comparison
equal deleted inserted replaced
2375:d673ef06fe96 2376:c7f3d0b4570f
35 #include "jvmtifiles/jvmti.h" 35 #include "jvmtifiles/jvmti.h"
36 #include "memory/genOopClosures.inline.hpp" 36 #include "memory/genOopClosures.inline.hpp"
37 #include "memory/oopFactory.hpp" 37 #include "memory/oopFactory.hpp"
38 #include "memory/permGen.hpp" 38 #include "memory/permGen.hpp"
39 #include "oops/instanceKlass.hpp" 39 #include "oops/instanceKlass.hpp"
40 #include "oops/instanceMirrorKlass.hpp"
40 #include "oops/instanceOop.hpp" 41 #include "oops/instanceOop.hpp"
41 #include "oops/methodOop.hpp" 42 #include "oops/methodOop.hpp"
42 #include "oops/objArrayKlassKlass.hpp" 43 #include "oops/objArrayKlassKlass.hpp"
43 #include "oops/oop.inline.hpp" 44 #include "oops/oop.inline.hpp"
44 #include "oops/symbol.hpp" 45 #include "oops/symbol.hpp"
647 JavaCalls::call(&result, mh, &args, CHECK_NULL); 648 JavaCalls::call(&result, mh, &args, CHECK_NULL);
648 return h_i(); 649 return h_i();
649 } 650 }
650 651
651 instanceOop instanceKlass::allocate_instance(TRAPS) { 652 instanceOop instanceKlass::allocate_instance(TRAPS) {
653 assert(!oop_is_instanceMirror(), "wrong allocation path");
652 bool has_finalizer_flag = has_finalizer(); // Query before possible GC 654 bool has_finalizer_flag = has_finalizer(); // Query before possible GC
653 int size = size_helper(); // Query before forming handle. 655 int size = size_helper(); // Query before forming handle.
654 656
655 KlassHandle h_k(THREAD, as_klassOop()); 657 KlassHandle h_k(THREAD, as_klassOop());
656 658
667 // Finalizer registration occurs in the Object.<init> constructor 669 // Finalizer registration occurs in the Object.<init> constructor
668 // and constructors normally aren't run when allocating perm 670 // and constructors normally aren't run when allocating perm
669 // instances so simply disallow finalizable perm objects. This can 671 // instances so simply disallow finalizable perm objects. This can
670 // be relaxed if a need for it is found. 672 // be relaxed if a need for it is found.
671 assert(!has_finalizer(), "perm objects not allowed to have finalizers"); 673 assert(!has_finalizer(), "perm objects not allowed to have finalizers");
674 assert(!oop_is_instanceMirror(), "wrong allocation path");
672 int size = size_helper(); // Query before forming handle. 675 int size = size_helper(); // Query before forming handle.
673 KlassHandle h_k(THREAD, as_klassOop()); 676 KlassHandle h_k(THREAD, as_klassOop());
674 instanceOop i = (instanceOop) 677 instanceOop i = (instanceOop)
675 CollectedHeap::permanent_obj_allocate(h_k, size, CHECK_NULL); 678 CollectedHeap::permanent_obj_allocate(h_k, size, CHECK_NULL);
676 return i; 679 return i;
895 methodOop m = methodOop(methods()->obj_at(index)); 898 methodOop m = methodOop(methods()->obj_at(index));
896 assert(m->is_method(), "must be method"); 899 assert(m->is_method(), "must be method");
897 f(m); 900 f(m);
898 } 901 }
899 } 902 }
903
900 904
901 void instanceKlass::do_local_static_fields(FieldClosure* cl) { 905 void instanceKlass::do_local_static_fields(FieldClosure* cl) {
902 fieldDescriptor fd; 906 fieldDescriptor fd;
903 int length = fields()->length(); 907 int length = fields()->length();
904 for (int i = 0; i < length; i += next_offset) { 908 for (int i = 0; i < length; i += next_offset) {
1607 1611
1608 1612
1609 // The following macros call specialized macros, passing either oop or 1613 // The following macros call specialized macros, passing either oop or
1610 // narrowOop as the specialization type. These test the UseCompressedOops 1614 // narrowOop as the specialization type. These test the UseCompressedOops
1611 // flag. 1615 // flag.
1612 #define InstanceKlass_OOP_ITERATE(start_p, count, \
1613 do_oop, assert_fn) \
1614 { \
1615 if (UseCompressedOops) { \
1616 InstanceKlass_SPECIALIZED_OOP_ITERATE(narrowOop, \
1617 start_p, count, \
1618 do_oop, assert_fn) \
1619 } else { \
1620 InstanceKlass_SPECIALIZED_OOP_ITERATE(oop, \
1621 start_p, count, \
1622 do_oop, assert_fn) \
1623 } \
1624 }
1625
1626 #define InstanceKlass_BOUNDED_OOP_ITERATE(start_p, count, low, high, \
1627 do_oop, assert_fn) \
1628 { \
1629 if (UseCompressedOops) { \
1630 InstanceKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(narrowOop, \
1631 start_p, count, \
1632 low, high, \
1633 do_oop, assert_fn) \
1634 } else { \
1635 InstanceKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(oop, \
1636 start_p, count, \
1637 low, high, \
1638 do_oop, assert_fn) \
1639 } \
1640 }
1641
1642 #define InstanceKlass_OOP_MAP_ITERATE(obj, do_oop, assert_fn) \ 1616 #define InstanceKlass_OOP_MAP_ITERATE(obj, do_oop, assert_fn) \
1643 { \ 1617 { \
1644 /* Compute oopmap block range. The common case \ 1618 /* Compute oopmap block range. The common case \
1645 is nonstatic_oop_map_size == 1. */ \ 1619 is nonstatic_oop_map_size == 1. */ \
1646 OopMapBlock* map = start_of_nonstatic_oop_maps(); \ 1620 OopMapBlock* map = start_of_nonstatic_oop_maps(); \
1709 ++map; \ 1683 ++map; \
1710 } \ 1684 } \
1711 } \ 1685 } \
1712 } 1686 }
1713 1687
1714 void instanceKlass::follow_static_fields() {
1715 InstanceKlass_OOP_ITERATE( \
1716 start_of_static_fields(), static_oop_field_size(), \
1717 MarkSweep::mark_and_push(p), \
1718 assert_is_in_closed_subset)
1719 }
1720
1721 #ifndef SERIALGC
1722 void instanceKlass::follow_static_fields(ParCompactionManager* cm) {
1723 InstanceKlass_OOP_ITERATE( \
1724 start_of_static_fields(), static_oop_field_size(), \
1725 PSParallelCompact::mark_and_push(cm, p), \
1726 assert_is_in)
1727 }
1728 #endif // SERIALGC
1729
1730 void instanceKlass::adjust_static_fields() {
1731 InstanceKlass_OOP_ITERATE( \
1732 start_of_static_fields(), static_oop_field_size(), \
1733 MarkSweep::adjust_pointer(p), \
1734 assert_nothing)
1735 }
1736
1737 #ifndef SERIALGC
1738 void instanceKlass::update_static_fields() {
1739 InstanceKlass_OOP_ITERATE( \
1740 start_of_static_fields(), static_oop_field_size(), \
1741 PSParallelCompact::adjust_pointer(p), \
1742 assert_nothing)
1743 }
1744 #endif // SERIALGC
1745
1746 void instanceKlass::oop_follow_contents(oop obj) { 1688 void instanceKlass::oop_follow_contents(oop obj) {
1747 assert(obj != NULL, "can't follow the content of NULL object"); 1689 assert(obj != NULL, "can't follow the content of NULL object");
1748 obj->follow_header(); 1690 obj->follow_header();
1749 InstanceKlass_OOP_MAP_ITERATE( \ 1691 InstanceKlass_OOP_MAP_ITERATE( \
1750 obj, \ 1692 obj, \
1827 #ifndef SERIALGC 1769 #ifndef SERIALGC
1828 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN) 1770 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN)
1829 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN) 1771 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN)
1830 #endif // !SERIALGC 1772 #endif // !SERIALGC
1831 1773
1832 void instanceKlass::iterate_static_fields(OopClosure* closure) {
1833 InstanceKlass_OOP_ITERATE( \
1834 start_of_static_fields(), static_oop_field_size(), \
1835 closure->do_oop(p), \
1836 assert_is_in_reserved)
1837 }
1838
1839 void instanceKlass::iterate_static_fields(OopClosure* closure,
1840 MemRegion mr) {
1841 InstanceKlass_BOUNDED_OOP_ITERATE( \
1842 start_of_static_fields(), static_oop_field_size(), \
1843 mr.start(), mr.end(), \
1844 (closure)->do_oop_v(p), \
1845 assert_is_in_closed_subset)
1846 }
1847
1848 int instanceKlass::oop_adjust_pointers(oop obj) { 1774 int instanceKlass::oop_adjust_pointers(oop obj) {
1849 int size = size_helper(); 1775 int size = size_helper();
1850 InstanceKlass_OOP_MAP_ITERATE( \ 1776 InstanceKlass_OOP_MAP_ITERATE( \
1851 obj, \ 1777 obj, \
1852 MarkSweep::adjust_pointer(p), \ 1778 MarkSweep::adjust_pointer(p), \
1871 PSParallelCompact::adjust_pointer(p), \ 1797 PSParallelCompact::adjust_pointer(p), \
1872 assert_nothing) 1798 assert_nothing)
1873 return size_helper(); 1799 return size_helper();
1874 } 1800 }
1875 1801
1876 void instanceKlass::push_static_fields(PSPromotionManager* pm) {
1877 InstanceKlass_OOP_ITERATE( \
1878 start_of_static_fields(), static_oop_field_size(), \
1879 if (PSScavenge::should_scavenge(p)) { \
1880 pm->claim_or_forward_depth(p); \
1881 }, \
1882 assert_nothing )
1883 }
1884
1885 void instanceKlass::copy_static_fields(ParCompactionManager* cm) {
1886 InstanceKlass_OOP_ITERATE( \
1887 start_of_static_fields(), static_oop_field_size(), \
1888 PSParallelCompact::adjust_pointer(p), \
1889 assert_is_in)
1890 }
1891 #endif // SERIALGC 1802 #endif // SERIALGC
1892 1803
1893 // This klass is alive but the implementor link is not followed/updated. 1804 // This klass is alive but the implementor link is not followed/updated.
1894 // Subklass and sibling links are handled by Klass::follow_weak_klass_links 1805 // Subklass and sibling links are handled by Klass::follow_weak_klass_links
1895 1806
1999 1910
2000 void instanceKlass::set_source_debug_extension(Symbol* n) { 1911 void instanceKlass::set_source_debug_extension(Symbol* n) {
2001 _source_debug_extension = n; 1912 _source_debug_extension = n;
2002 if (_source_debug_extension != NULL) _source_debug_extension->increment_refcount(); 1913 if (_source_debug_extension != NULL) _source_debug_extension->increment_refcount();
2003 } 1914 }
1915
1916 address instanceKlass::static_field_addr(int offset) {
1917 return (address)(offset + instanceMirrorKlass::offset_of_static_fields() + (intptr_t)java_mirror());
1918 }
1919
2004 1920
2005 const char* instanceKlass::signature_name() const { 1921 const char* instanceKlass::signature_name() const {
2006 const char* src = (const char*) (name()->as_C_string()); 1922 const char* src = (const char*) (name()->as_C_string());
2007 const int src_length = (int)strlen(src); 1923 const int src_length = (int)strlen(src);
2008 char* dest = NEW_RESOURCE_ARRAY(char, src_length + 3); 1924 char* dest = NEW_RESOURCE_ARRAY(char, src_length + 3);
2367 2283
2368 #define BULLET " - " 2284 #define BULLET " - "
2369 2285
2370 void FieldPrinter::do_field(fieldDescriptor* fd) { 2286 void FieldPrinter::do_field(fieldDescriptor* fd) {
2371 _st->print(BULLET); 2287 _st->print(BULLET);
2372 if (fd->is_static() || (_obj == NULL)) { 2288 if (_obj == NULL) {
2373 fd->print_on(_st); 2289 fd->print_on(_st);
2374 _st->cr(); 2290 _st->cr();
2375 } else { 2291 } else {
2376 fd->print_on_for(_st, _obj); 2292 fd->print_on_for(_st, _obj);
2377 _st->cr(); 2293 _st->cr();
2397 if (!WizardMode) return; // that is enough 2313 if (!WizardMode) return; // that is enough
2398 } 2314 }
2399 } 2315 }
2400 2316
2401 st->print_cr(BULLET"---- fields (total size %d words):", oop_size(obj)); 2317 st->print_cr(BULLET"---- fields (total size %d words):", oop_size(obj));
2402 FieldPrinter print_nonstatic_field(st, obj); 2318 FieldPrinter print_field(st, obj);
2403 do_nonstatic_fields(&print_nonstatic_field); 2319 do_nonstatic_fields(&print_field);
2404 2320
2405 if (as_klassOop() == SystemDictionary::Class_klass()) { 2321 if (as_klassOop() == SystemDictionary::Class_klass()) {
2406 st->print(BULLET"signature: "); 2322 st->print(BULLET"signature: ");
2407 java_lang_Class::print_signature(obj, st); 2323 java_lang_Class::print_signature(obj, st);
2408 st->cr(); 2324 st->cr();
2416 klassOop array_klass = java_lang_Class::array_klass(obj); 2332 klassOop array_klass = java_lang_Class::array_klass(obj);
2417 st->cr(); 2333 st->cr();
2418 st->print(BULLET"fake entry for array: "); 2334 st->print(BULLET"fake entry for array: ");
2419 array_klass->print_value_on(st); 2335 array_klass->print_value_on(st);
2420 st->cr(); 2336 st->cr();
2337 st->print_cr(BULLET"fake entry for oop_size: %d", java_lang_Class::oop_size(obj));
2338 st->print_cr(BULLET"fake entry for static_oop_field_count: %d", java_lang_Class::static_oop_field_count(obj));
2339 klassOop real_klass = java_lang_Class::as_klassOop(obj);
2340 if (real_klass && real_klass->klass_part()->oop_is_instance()) {
2341 instanceKlass::cast(real_klass)->do_local_static_fields(&print_field);
2342 }
2421 } else if (as_klassOop() == SystemDictionary::MethodType_klass()) { 2343 } else if (as_klassOop() == SystemDictionary::MethodType_klass()) {
2422 st->print(BULLET"signature: "); 2344 st->print(BULLET"signature: ");
2423 java_lang_invoke_MethodType::print_signature(obj, st); 2345 java_lang_invoke_MethodType::print_signature(obj, st);
2424 st->cr(); 2346 st->cr();
2425 } 2347 }
2558 } 2480 }
2559 } 2481 }
2560 2482
2561 2483
2562 void JNIid::verify(klassOop holder) { 2484 void JNIid::verify(klassOop holder) {
2563 int first_field_offset = instanceKlass::cast(holder)->offset_of_static_fields(); 2485 int first_field_offset = instanceMirrorKlass::offset_of_static_fields();
2564 int end_field_offset; 2486 int end_field_offset;
2565 end_field_offset = first_field_offset + (instanceKlass::cast(holder)->static_field_size() * wordSize); 2487 end_field_offset = first_field_offset + (instanceKlass::cast(holder)->static_field_size() * wordSize);
2566 2488
2567 JNIid* current = this; 2489 JNIid* current = this;
2568 while (current != NULL) { 2490 while (current != NULL) {